RenderTransformを更新してSilverlightでビットマップで満たされたパスを移動すると、画像は約0.5秒ごとにスタッター/ジッターで更新されます。
パスはBitmapCacheを使用し、ハードウェアアクセラレーションがオンになっています。ハードウェアアクセラレーションは、EnableCacheVisualizationオプションを使用し、フレームレートが約60fpsと高いことを確認することで検証されます。
ここで私が話していることがわかります。これは、吃音の動作を示す動作中のSilverlightアプリです。(画像を見ると、私がどんなゲームを作ろうとしているのか想像できるかもしれません...)
http://glerok.com/smb/index.html
ビットマップはスムーズにスクロールしますが、0.5〜1秒ごとに、一部のフレームがスキップされたかのように途切れます。これを2台の異なるPCで確認しました。
これはSilverlightで予想される動作ですか、それともオブジェクトのRenderTransformを手動で更新して何か問題がありますか?(これをSilverlightを軽蔑する機会と見なさないでください...)
前もって感謝します!!!
パスを生成するために使用しているコードは次のとおりです。
RectangleGeometry rg = new RectangleGeometry();
BitmapImage bi = new BitmapImage(new Uri("world.png", UriKind.Relative));
int WorldWidth = 703;
int WorldHeight = 240;
rg.Rect = new Rect(WorldTilePosition, 0, WorldWidth * Scale, WorldHeight * Scale);
Path p = new Path { RenderTransform = new TranslateTransform { X = 0, Y = 0 } };
p.Data = rg;
p.CacheMode = new BitmapCache();
p.Fill = new ImageBrush { ImageSource = bi };
canvas.Children.Add(p);
そして、パスの位置を更新するコードは次のとおりです。
WorldTilePosition-=10;
TranslateTransform tt = WorldPath.RenderTransform as TranslateTransform;
tt.X = -WorldTilePosition;
if (WorldTilePosition < -1000) WorldTilePosition = 1000;
ストーリーボードでアニメーション化されたオブジェクトでも、Silverlightでのスタッター/ジッターを観察しました。これは、現在Silverlightにバックバッファリングがなく、PC上の単純なスプライトベースのゲームにも適していないために発生すると思いますか?全体的な画面のリフレッシュレートは依然として60fpsであると報告されていることに注意してください。
以下のコードは、画面の更新中にちらつくアニメーション化された長方形を生成します。垂直オブジェクトは、少なくとも私のラップトップでは、リフレッシュレート中のバンディングをよりよく示します。
<Canvas x:Name="LayoutRoot2" Background="White">
<Rectangle x:Name="myRect" Fill="Red" Width="100" Height="500" CacheMode="BitmapCache" >
<Rectangle.RenderTransform>
<TranslateTransform x:Name="myRectTransform" X="0" />
</Rectangle.RenderTransform>
<Rectangle.Triggers>
<EventTrigger RoutedEvent="Rectangle.Loaded">
<BeginStoryboard>
<Storyboard x:Name="myStoryboard" >
<DoubleAnimation
From="0"
To="1000"
Storyboard.TargetName="myRectTransform"
Storyboard.TargetProperty="X"
Duration="0:0:1"
AutoReverse="True"
RepeatBehavior="Forever"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
</Canvas>