0

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>
4

1 に答える 1

1

PC(Core 2 Quad 3 GHz、Win7 x64、IE9)で途切れが気になりません。

特に、低解像度のスプライトなどを使用するこのようなタイルベースのゲームの場合は、 ( CodeplexWriteableBitmapにある優れた拡張バージョンを見つけることができます)を使用して、それだけを更新/表示することを検討します。これにより、不足しているバックバッファも解決されます。

また、目立った途切れを避けるために、ゲームロジックをフレームレートから独立させてください(タイマーを使用するか、最後のフレームから経過したミリ秒数を検出します)。スキップされたフレームも、それほど目立たないはずです。

また、風景の表示部分のみを描画してみてください(クリッピングが十分かどうかはわかりません。試していません)。

于 2011-03-16T17:26:26.293 に答える