新旧 PC 速度対決  Pentium 4 Dual + Hard Disk vs i7 860 + SSD

メインマシンを i7 860 + SSD に切り替えましたが、あまりの速さに、昔のPC との比較のビデオを作成しました。

比較対象は次の通りです。

古いPC

  • CPU Pentium 4 D 2.8GHz
  • マザーボード P5LD2-V
  • DDR2 SDRAM 2GB
  • ハードディスク Hard Disk
  • Windows 7 32bit

新しいPC

  • CPU i7 860
  • マザーボード P7P55D-E EVO
  • DDR3 SDRAM 4GB
  • ハードディスク Real SSD 128GB
  • Windows 7 64bit

ビデオは次の順番に撮影しています。

  1. 電源ONから、ログイン画面まで
  2. ログインから、デスクトップ表示完了まで
  3. Visual Studio 2010 起動まで
  4. WPF プロジェクトの作成完了まで

なお、ウィルスソフトなど、起動時に影響される可能性のあるソフトやサービスはオフにして、なるべく素の設定で比較できるようにしてあります。

結果

左がこれまでのPC、右が新しい  i7 860 + SSD

 

[youtube=http://www.youtube.com/watch?v=GeFHjGuzKfs&hl=en]

OS起動時は、同じタイミングで電源ボタンを入れていますが、P7P55D-E EVO は起動チェックなどが遅いようで、スタートダッシュでだいぶ出遅れています。その分を差し引くと

  1. Windows を起動していますメッセージから、ログイン画面まで  35秒 対 18秒
  2. ログインから、デスクトップ表示完了まで   7秒 VS 3秒
  3. Visual Studio 2010 起動まで  20秒 VS 5秒
  4. WPF プロジェクトの作成完了まで 40秒 VS 4秒

ということで、圧倒的に早いです。Visual Studio で開発されてる方は、SSD載せ替え、おすすめです。

ハードウェアによるPCの高速化

これまでの開発環境は、Pentium D に 2GB メモリ、普通のHDD という状況でした。このため、スコア的には、4.5 で、使えなくはないけれど、早くはないという感じでした。

image

ところが、最近はTweetDeckでツイッターを横で見ながら、iTunes でミュージックビデオ見ながら、VS2010で開発しながら、Expression3Blend でデザインしながら、Expression 3 Web でウェブページを書きながら、Expression 3 Media でエンコード()しながら、VirtualPCでテスト環境を裏で動かして動作確認しながら、アウトルックでメールを読みながら、IEで検索をかけるというとんでもない状況になりつつあり、アプリケーションを切り替えないと動きが取れない状況になっていました。

おまけに、Pentium Dなので発熱がものすごく、フルに稼働させると小型扇風機で風を送らないと熱暴走してしまうというとんでもない環境でした。2006年ぐらいに作ったマシンをだましだまし使ってきたのですが、さすがに限界です。そこで、次期開発マシンにアップグレードすることにしました。

アップグレードの目標は次の通り。

  1. 高速ディスクアクセス・・・VS2010などかなりディスクアクセスで食われている感じなので、ディスクの高速化が必要。Real SSD という SATA 3.0対応の SSD が発売になっていたので、これに決定。
  2. クアッドコア化・・・Pentium D クアッドコア(HTなし)で、CPUをほぼ使い切って、CPUボトルネックが出ていたので、最低でもクアッドコア。価格的に i7 860 がこなれていているので、これに決定。
  3. 64bit・・・Virtual PC /Server を走らせようとすると、メモリ空間が最低でも 4GB 必要で、将来的に 8GB, 16GBと拡張する可能性がある。このため、OS は Windiws 7  64bit OS化する。
  4. グラフィクス・・・グラフィクスボードは NVIDIA 7800GS  PCI Express x 16 を使っているが、3Gゲームをするわけではなく、グラフィクス性能はこの程度で十分。予算が10万円なので、グラボは見送り。
  5. ハードディスク・・・4つのディスクで、1GB程度あるのだけれど、電力消費が大きく、無駄なので SSD をシステムドライブとし、2TB の Hard Disk を用意。これはバルクデータ置き場とし、高速処理が必要なものは、SSDの一時置き場で対応するようにする。

 

作業はこんな感じ。

  1. 100526-075338 古いケース
  2.  100526-080214マザーボード、電源、ディスクなどを撤去
  3.  100526-080409これが電源
  4.  100526-080905まず電源を取り付ける
  5.  100526-080954マザーボードは ASUS P7P55D-E EVO これは、STAT 3.0, USB 3.0 で最高 6Gbps での通信が可能。Real SSD のアクセス速度を満たし、将来的にマルチモニタ(4面以上)を考えた場合、PCI Express x 16 が2本ほしいので、このマザーに決定。
  6.  100526-081120マザーボードのパーツ
  7.  100526-084537メモリは Crutial 2GB x 2本
  8.   100526-084605CPU は、Inten i7 860 (クアッドコア)
  9.  100526-092031マザー、グラボ、メモリ、CPU を搭載したところ。まずはこの最小構成で起動確認。
  10.  100526-092504 100526-092605 無事起動を確認したところで、Crutial Real SSD 128GB を搭載する。
  11. 100526-093504SSDは、2.5 inchなので、3.5 inchベイに入るようにハーネスを買ってきた。これは、3.5 inchベイ1つに、2.5 inch2台搭載可能なもの。
  12.  100526-094059次に、Hitach STAT 2TB 7200 RPM
  13.  100526-161357 これらをすべて組み込んで完成。

スコアはこんな感じ。

image 旧システム

image 新システム

グラフィクスにひきずられて、最低スコアが4.7で、今までのPCと変わらない。

しかし、

プロセッサ 4.5→7.5

メモリ 5.2→7.5

プライマリハードディスク 5.5→7.3

となって、劇的な高速化となっている。

SSDは正解でした。体感的には、3倍、4倍という感じがします。

むしろCPUは i7 860 までの性能はいらなかったかもしれない。よっぽどすごいことをしない限り、CPUがボトルネックになることはなさそうです。

Windows 7 x64 新システムの構築

これまで、Pentium D で作業をしていましたが、

iTunes でミュージックビデオを視聴しながら、

Visual Studi 2010 、Expression Blend 3 、Expression Web、Expression Media を切り替えながら、

WPFの開発をしながら、

TweetDeck でツイッターしながら、

Outlook でメールを取りながら、

Windows Live Writer でブログ書きながら、

うらで Virtual PC でテスト環境を走らせ

という状況で、いい加減限界に来ていたので、新規システムを導入しました。

これまでのスコアはこのぐらい。

image

WPF Shooting Star

[youtube=http://www.youtube.com/watch?v=0l7xTEgUT54&hl=en]

 

This is something like shooting star implemented by WPF/C#. Here is the code. It’s messy, but it is just for my coding memo.

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Storyboard  x:Key="OnClick2">
            <!–<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="r1" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
                <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
                <SplineDoubleKeyFrame KeyTime="00:00:11" Value="-120"/>
            </DoubleAnimationUsingKeyFrames>
            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="r1" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)">
                <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
                <SplineDoubleKeyFrame KeyTime="00:00:11" Value="32"/>
            </DoubleAnimationUsingKeyFrames>–>
            <!–<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="r1" Storyboard.TargetProperty="(UIElement.Opacity)">
                <SplineDoubleKeyFrame KeyTime="00:00:00" Value="1"/>
                <SplineDoubleKeyFrame KeyTime="00:00:01" Value="0"/>
            </DoubleAnimationUsingKeyFrames>–>
        </Storyboard>
    </Window.Resources>
    <Window.Triggers>
        <EventTrigger RoutedEvent="ButtonBase.Click" SourceName="button2">
            <BeginStoryboard x:Name="OnClick2_BeginStoryboard" Storyboard="{StaticResource OnClick2}"/>
        </EventTrigger>
        <EventTrigger RoutedEvent="FrameworkElement.Loaded"/>
    </Window.Triggers>

    <Grid Background="Black">
        <Canvas Height="100" HorizontalAlignment="Left" Margin="120,87,0,0" Name="canvas1" VerticalAlignment="Top" Width="200">
            <Canvas.RenderTransform>
                <TransformGroup>
                    <ScaleTransform/>
                    <SkewTransform/>
                    <RotateTransform/>
                    <TranslateTransform/>
                </TransformGroup>
            </Canvas.RenderTransform>
            <Rectangle Height="4" Name="r" Stroke="Black" Width="1000" Canvas.Left="-50" Canvas.Top="29" >
                <Rectangle.Fill>
                    <LinearGradientBrush MappingMode="RelativeToBoundingBox" EndPoint="0.5,1" StartPoint="0.5,0" >
                        <LinearGradientBrush.RelativeTransform>
                            <TransformGroup>
                                <ScaleTransform CenterX="0.5" CenterY="0.5"/>
                                <SkewTransform CenterX="0.5" CenterY="0.5"/>
                                <RotateTransform Angle="-90" CenterX="0.5" CenterY="0.5"/>
                                <TranslateTransform/>
                            </TransformGroup>
                        </LinearGradientBrush.RelativeTransform>
                        <GradientStop Color="Black" Offset="1"/>
                        <GradientStop Color="Magenta"/>
                    </LinearGradientBrush>
                </Rectangle.Fill>
                <Rectangle.RenderTransform>
                    <TransformGroup>
                        <ScaleTransform/>
                        <SkewTransform/>
                        <RotateTransform/>
                        <TranslateTransform/>
                    </TransformGroup>
                </Rectangle.RenderTransform>
            </Rectangle>
        </Canvas>
        <Button Content="Button" Height="31" HorizontalAlignment="Left" Margin="50,268,0,0" Name="button1" VerticalAlignment="Top" Width="96" Click="button1_Click" />
        <Button Content="Button" Height="31" HorizontalAlignment="Left" Margin="210,268,0,0" Name="button2" VerticalAlignment="Top" Width="96"/>
    </Grid>
</Window>

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            int size = 2;

            Storyboard sb = (Storyboard)this.Resources["OnClick2"];
            SBMoveCanvas(sb, "canvas1");
            SBLength(sb, "r");

            for (int i = 0; i < 200; i++)
            {
                string name = "r" + i.ToString();
                Rectangle r = new Rectangle();
                r.Fill = new SolidColorBrush(Colors.Magenta);
                r.Height = size;
                r.Width = size;

                ScaleTransform st = new ScaleTransform();
                SkewTransform skt = new SkewTransform();
                RotateTransform rt = new RotateTransform();
                TranslateTransform tt = new TranslateTransform();
                TransformGroup tg = new TransformGroup();
                tg.Children.Add(st);
                tg.Children.Add(skt);
                tg.Children.Add(rt);
                tg.Children.Add(tt);

                r.RenderTransform = tg;
                this.RegisterName(name, r);
                Canvas.SetLeft(r, i * size);
                Canvas.SetTop(r, 30);
                SBDissolve(sb, name, i);
                canvas1.Children.Add(r);
            }
        }

        System.Random rnd = new System.Random();

        private void SBDissolve(Storyboard sb, string name, int pos)
        {
            DoubleAnimationUsingKeyFrames daukfX = new DoubleAnimationUsingKeyFrames();

            daukfX.BeginTime = new TimeSpan(0, 0, 0);
            daukfX.Duration = new TimeSpan(0, 0, duration);
            daukfX.KeyFrames.Add(
                 new SplineDoubleKeyFrame(0, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0))));
            daukfX.KeyFrames.Add(
                new SplineDoubleKeyFrame(rnd.Next(6000, 8000), KeyTime.FromTimeSpan(new TimeSpan(0, 0, duration + (200-pos)))));

            Storyboard.SetTargetName(daukfX, name);
            Storyboard.SetTargetProperty(daukfX, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"));

            sb.Children.Add(daukfX);

            DoubleAnimationUsingKeyFrames daukfY = new DoubleAnimationUsingKeyFrames();

            daukfY.BeginTime = new TimeSpan(0, 0, 0);
            daukfY.Duration = new TimeSpan(0, 0, duration);
            daukfY.KeyFrames.Add(
                 new SplineDoubleKeyFrame(0, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0))));
            daukfY.KeyFrames.Add(
                new SplineDoubleKeyFrame(rnd.Next(-500, 500), KeyTime.FromTimeSpan(new TimeSpan(0, 0, duration + (200-pos)))));

            Storyboard.SetTargetName(daukfY, name);
            Storyboard.SetTargetProperty(daukfY, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)"));

            sb.Children.Add(daukfY);

            DoubleAnimationUsingKeyFrames daukfOp = new DoubleAnimationUsingKeyFrames();

            daukfOp.BeginTime = new TimeSpan(0, 0, 0);
            daukfOp.Duration = new TimeSpan(0, 0, duration);
            daukfOp.KeyFrames.Add(
                 new SplineDoubleKeyFrame(1.0, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0))));
            daukfOp.KeyFrames.Add(
                new SplineDoubleKeyFrame(0.0, KeyTime.FromTimeSpan(new TimeSpan(0, 0, duration))));

            Storyboard.SetTargetName(daukfOp, name);
            Storyboard.SetTargetProperty(daukfOp, new PropertyPath("(UIElement.Opacity)"));

            sb.Children.Add(daukfOp);
        }

        const int duration = 5;

        private void SBMoveCanvas(Storyboard sb, string name)
        {
            DoubleAnimationUsingKeyFrames daukfX = new DoubleAnimationUsingKeyFrames();

            daukfX.BeginTime = new TimeSpan(0, 0, 0);
            daukfX.Duration = new TimeSpan(0, 0, duration);
            daukfX.KeyFrames.Add(
                 new SplineDoubleKeyFrame(500, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0))));
            daukfX.KeyFrames.Add(
                new SplineDoubleKeyFrame(-500, KeyTime.FromTimeSpan(new TimeSpan(0, 0, duration))));

            Storyboard.SetTargetName(daukfX, name);
            Storyboard.SetTargetProperty(daukfX, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"));

            sb.Children.Add(daukfX);

            DoubleAnimationUsingKeyFrames daukfY = new DoubleAnimationUsingKeyFrames();

            daukfY.BeginTime = new TimeSpan(0, 0, 0);
            daukfY.Duration = new TimeSpan(0, 0, duration);
            daukfY.KeyFrames.Add(
                 new SplineDoubleKeyFrame(30, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0))));
            daukfY.KeyFrames.Add(
                new SplineDoubleKeyFrame(30, KeyTime.FromTimeSpan(new TimeSpan(0, 0, duration))));

            Storyboard.SetTargetName(daukfY, name);
            Storyboard.SetTargetProperty(daukfY, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)"));

            sb.Children.Add(daukfY);
        }

        private void SBLength(Storyboard sb, string name)
        {
            DoubleAnimationUsingKeyFrames daukfX = new DoubleAnimationUsingKeyFrames();

            daukfX.BeginTime = new TimeSpan(0, 0, 0);
            daukfX.Duration = new TimeSpan(0, 0, duration);
            daukfX.KeyFrames.Add(
                 new SplineDoubleKeyFrame(1, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0))));
            daukfX.KeyFrames.Add(
                new SplineDoubleKeyFrame(0, KeyTime.FromTimeSpan(new TimeSpan(0, 0, duration))));

            Storyboard.SetTargetName(daukfX, name);
            Storyboard.SetTargetProperty(daukfX, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)"));

            sb.Children.Add(daukfX);
        }
    }

GeometryModel3D を手書き

             //TriangleIndices="0 1 2  0 2 3 "
             //Positions="0 0 0,  1 0 0, 1 1 0, 0 1 0"
             //TextureCoordinates="0,1 1,1 1,0 0,0 "
             //Normals="0,0,1 0,0,1 0,0,1 0,0,1"

            MeshGeometry3D mg3d = new MeshGeometry3D();
            mg3d.Positions = new Point3DCollection { new Point3D(0, 0, 0), new Point3D(1, 0, 0), new Point3D(1, 1, 0), new Point3D(0, 1, 0) };
            mg3d.TriangleIndices = new Int32Collection { 0,1,2,0,2,3};
            mg3d.TextureCoordinates = new PointCollection{ new Point(0, 1), new Point(1, 1), new Point(1, 0), new Point(0, 0)};
            mg3d.Normals = new Vector3DCollection { new Vector3D(0, 0, 1), new Vector3D(0, 0, 1), new Vector3D(0, 0, 1), new Vector3D(0, 0, 1) };

            GeometryModel3D gm3d = new GeometryModel3D();

            MediaElement me = new MediaElement();
            me.Source = new Uri(@"……….\Wildlife.wmv");

            TextBlock someText = new TextBlock();
            FontSizeConverter myFontSizeConverter = new FontSizeConverter();
            someText.FontSize = (double)myFontSizeConverter.ConvertFrom("30pt");
            someText.Text = "Hello, World!";

            VisualBrush vb = new VisualBrush();
            vb.Visual = someText;
または
            vb.Visual = me;

            gm3d.Material = new DiffuseMaterial(vb);
            gm3d.Geometry = mg3d;

            this.BoxOR9.Children.Add(gm3d);

WPF 3D 上での画像とビデオの表示

イメージ部分を抜き出したもの

image 

<GeometryModel3D.Material>
    <DiffuseMaterial>
        <DiffuseMaterial.Brush>
            <ImageBrush ImageSource="bobsled.jpg"></ImageBrush>
        </DiffuseMaterial.Brush>
    </DiffuseMaterial>
</GeometryModel3D.Material>
<GeometryModel3D.Geometry>
    <MeshGeometry3D
        TriangleIndices="0 1 2  0 2 3 "
        Positions="0 0 0,  1 0 0, 1 1 0, 0 1 0"
        TextureCoordinates="0,1 1,1 1,0 0,0 "
        Normals="0,0,1 0,0,1 0,0,1 0,0,1"
    />
</GeometryModel3D.Geometry>

ビデオ部分を抜き出したもの

image 

<GeometryModel3D.Material>
    <DiffuseMaterial>
        <DiffuseMaterial.Brush>
            <VisualBrush>
                <VisualBrush.Visual>
                    <MediaElement Source="wildlife.wmv" />
                </VisualBrush.Visual>
            </VisualBrush>

        </DiffuseMaterial.Brush>
    </DiffuseMaterial>
</GeometryModel3D.Material>
<GeometryModel3D.Geometry>
    <MeshGeometry3D
        TriangleIndices="0 1 2  0 2 3 "
        Positions="0 0 0,  1 0 0, 1 1 0, 0 1 0"
        TextureCoordinates="0,1 1,1 1,0 0,0 "
        Normals="0,0,1 0,0,1 0,0,1 0,0,1"
    />
</GeometryModel3D.Geometry>

WPF覚書

image

サンプルコード

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    x:Class="WpfApplication2.MainWindow"
    x:Name="Window"
    Title="MainWindow"
    Width="640" Height="480" mc:Ignorable="d">

<Viewport3D xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:c="http://schemas.openxmlformats.org/markup-compatibility/2006" c:Ignorable="d" x:Name="ZAM3DViewport3D" ClipToBounds="true" Width="400" Height="300">
    <Viewport3D.Camera>
        <PerspectiveCamera x:Name="Free_CameraOR6" FarPlaneDistance="10" LookDirection="0,0,-1" UpDirection="0,1,0" NearPlaneDistance="1" Position="0,0.0199925,2.5" FieldOfView="39.5978" />
    </Viewport3D.Camera>

    <ModelVisual3D>
        <ModelVisual3D.Content>
            <Model3DGroup x:Name="Scene"> <!– Scene (XAML Path = ) –>
                <Model3DGroup.Transform>
                    <Transform3DGroup>
                        <TranslateTransform3D OffsetX="0" OffsetY="0" OffsetZ="0"/>
                        <ScaleTransform3D ScaleX="1" ScaleY="1" ScaleZ="1"/>
                        <RotateTransform3D d:EulerAngles="0,27.919,0">
                            <RotateTransform3D.Rotation>
                                <AxisAngleRotation3D Angle="27.919" Axis="0,1,0"/>
                            </RotateTransform3D.Rotation>
                        </RotateTransform3D>
                        <TranslateTransform3D OffsetX="0" OffsetY="0" OffsetZ="0"/>
                        <TranslateTransform3D OffsetY="0.401" OffsetX="-0.446" OffsetZ="0.052"/>
                    </Transform3DGroup>
                </Model3DGroup.Transform>
                <AmbientLight Color="#333333" />
                <DirectionalLight Color="#FFFFFF" Direction="-0.612372,-0.5,-0.612372" />
                <DirectionalLight Color="#FFFFFF" Direction="0.612372,-0.5,-0.612372" />
                <Model3DGroup x:Name="BoxOR9"> <!– Box (XAML Path = (Viewport3D.Children)[0].(ModelVisual3D.Content).(Model3DGroup.Children)[3]) –>
                    <Model3DGroup.Transform>
                        <Transform3DGroup>
                            <TranslateTransform3D OffsetX="0" OffsetY="0" OffsetZ="0"/>
                            <ScaleTransform3D ScaleX="1" ScaleY="1" ScaleZ="1"/>
                            <RotateTransform3D>
                                <RotateTransform3D.Rotation>
                                    <AxisAngleRotation3D Angle="65.59121363" Axis="0.1478755617 0.6791817096 0.7189193443"/>
                                </RotateTransform3D.Rotation>
                            </RotateTransform3D>
                            <TranslateTransform3D OffsetX="0" OffsetY="0" OffsetZ="0"/>
                        </Transform3DGroup>
                    </Model3DGroup.Transform>
                    <GeometryModel3D x:Name="BoxOR9GR10">
                        <GeometryModel3D.Material>
                            <DiffuseMaterial>
                                <DiffuseMaterial.Brush>
                                    <VisualBrush>
                                        <VisualBrush.Visual>
                                            <MediaElement Source="wildlife.wmv" />
                                        </VisualBrush.Visual>
                                    </VisualBrush>
                                </DiffuseMaterial.Brush>
                            </DiffuseMaterial>
                        </GeometryModel3D.Material>
                        <GeometryModel3D.Geometry>
                            <MeshGeometry3D
                                TriangleIndices="0 1 2  0 2 3 "
                                Positions="0 0 0,  1 0 0, 1 1 0, 0 1 0"
                                TextureCoordinates="0,1 1,1 1,0 0,0 "
                                Normals="0,0,1 0,0,1 0,0,1 0,0,1"
                            />
                        </GeometryModel3D.Geometry>
                        <GeometryModel3D.Transform>
                            <Transform3DGroup>
                                <TranslateTransform3D OffsetX="0" OffsetY="0" OffsetZ="0"/>
                                <ScaleTransform3D ScaleX="1" ScaleY="1" ScaleZ="1"/>
                                <RotateTransform3D d:EulerAngles="-4.454,-33.326,-46.125">
                                    <RotateTransform3D.Rotation>
                                        <AxisAngleRotation3D Angle="57.575" Axis="-0.304,-0.517,-0.8"/>
                                    </RotateTransform3D.Rotation>
                                </RotateTransform3D>
                                <TranslateTransform3D OffsetX="0" OffsetY="0" OffsetZ="0"/>
                                <TranslateTransform3D OffsetX="-1.015" OffsetY="-0.317" OffsetZ="0.226"/>
                            </Transform3DGroup>
                        </GeometryModel3D.Transform>
                    </GeometryModel3D>
                </Model3DGroup>
            </Model3DGroup>
        </ModelVisual3D.Content>
    </ModelVisual3D>
</Viewport3D>
</Window>

TMScreensaver V0.6 をアップしました。

V0.5は、XP の場合設定ファイルが機能しないという問題点がありました。これは、8.3ファイル名の制限によるものでした。

修正版V0.6 をアップします。修正点は、ファイル名の変更(TMScreensaver.scr → TMScrs.scr、TMScreensaver.config→ TMScrs.config)です。

古いバージョンをお使いの方は、次の手順でアンインストールしてください。m_ _m

    1.解凍したフォルダーを削除
    2.レジストリの CurrentUser\Software\Uchukamen\TMScreensaver 以下を削除
    PCに格納されたデータは、これで完全に削除されます。  

[1] 名称
	TMScreensaver(x86 32bit 版)
	
[2] 概要
	映画 Matrix のように Twitter のタイムラインを縦に流れるように表示するスクリーンセーバー

[3] バージョン
	0.6

[4]	ダウンロード
    http://cid-7cb203a44bf94940.skydrive.live.com/browse.aspx/TMScreensaver
    より、TMScrs.zip をダウンロードしてください。 

[5] 動作環境
	Windows XP, Windows Vista, Windows 7で動作を確認しました。
     .NET Framework 4.0 が必要です。次のURLから .NET Framework 4.0 をインストールしてください。 http://www.microsoft.com/downloads/details.aspx?FamilyID=9cfb2d51-5ff4-4491-b0e5-b386f32c0992&displaylang=ja グラフィックアクセラレータを搭載していること(CPUでの描画だと苦しいはず) [6] インストール方法 1.古いバージョンをインストールしている人は、古いフォルダーの削除を行ってください。 レジストリはエントリを上書きしますので、削除不要です。
2.TMScrs.zip をダウンロードし、任意の場所(たとえばマイドキュメントフォルダーなど)で、解凍する。 3.エクスプローラで、解凍したフォルダーを開き、TMScrs.scr を右クリックし、[インストール]を選択 4.初めての場合は、TMScreensaver Configurationダイアログが表示されるので、次の情報を入力 Username...twitter のユーザーアカウントを入力 Password...twitter のパスワードを入力 5.OKボタンを押すと、設定情報をレジストリに格納 6.プレビューボタンを押し、プレビューで動作を確認 [7] アンインストール方法 1.解凍したフォルダーを削除 2.レジストリの CurrentUser\Software\Uchukamen\TMScreensaver 以下を削除 PCに格納されたデータは、これで完全に削除されます [8] 注意制限 1.最大タイムラインは200個 2.通信エラー等発生した場合は、赤いメッセージを表示 [9] 各種設定 TMScreensaver.config のXML Configurationファイルを修正する MaxTweets...タイムラインの同時表示数 BackColor...背景色 ForeColor...文字色 FontSize...タイムラインのフォントサイズ Rotation...メッセージの方向(-90...上から下へ、0...左から右へ) ShowImage...プロファイルアイコンの表示(Visible)、非表示(Hide) [10] バグ報告、要望など uchukamen宛に、#TMScreensaver タグでつぶやいてください。