3

WP7ゲームでは、Enemyクラスを作成していますが、でラップされていEnemyControlます。敵コントロールは、spritesheetその敵タイプのすべての異なるアニメーション状態のいずれかを使用します。ビットマップを静的にキャッシュする画像は4つだけです。

BitmapImage私が抱えている問題は、両方の画像が(静的におよび)キャッシュされているにもかかわらず、画像がCacheMode="BitmapCache"コントロールによって読み込まれると、コントロールごとに約2メガのテクスチャ/システムメモリが追加されることです。

これは、画面に表示できる敵の数を制限するため、重大な問題です。

誰かが私がこの状況を改善する方法について何か考えを持っていますか?またはそうでなければそれを解決しますか?

興味がある場合は、xamlを次に示します。

<Canvas x:Name="canEnemyControl">
    <Canvas.RenderTransform>
        <TranslateTransform x:Name="enemyControlTransform" X="0"/>
    </Canvas.RenderTransform>
    <Canvas.Clip>
        <RectangleGeometry x:Name="clipGeometry" Rect="0,0,60,60" />
    </Canvas.Clip>
    <Image x:Name="imgEnemy" Stretch="None" CacheMode="BitmapCache" >
        <Image.RenderTransform>
            <TranslateTransform x:Name="enemyImageTransform" X="0" Y="0" />
        </Image.RenderTransform>
    </Image>
</Canvas>
4

1 に答える 1

1

Image複数の要素が同じビットマップキャッシュを共有することを知っているとは思わないため、実装が拡張されるとは思いません。

解決策:CompositionTarget.RenderingおよびWriteableBitmapEx

考えられる解決策の1つは、CompositionTarget.Renderingを使用して、ここでの私の回答のようにレンダリングすることです。これにより、画面が更新される前にイベントが発生するため、独自の描画を行うことができます。これがKrashlanderや他のSilverlightゲームの仕組みだと思います(ただし、彼は後のバージョンでXNAに切り替えた可能性があります)。

次に、WriteableBitmapExを使用して、ソースイメージの1つのインスタンスを使用して、バッファー上の複数の場所に描画できると思います。画面/ビューポートのサイズのバッファがあり、各画像のコピーが1つあるため、スケーリングを大幅に改善する必要があります。1つの敵と1000を表示するためのメモリ要件は同じである必要があります。


この正確なアプローチを試したことがないという免責事項を追加しますがCompositionTarget.Rendering、画面をスムーズに更新するためにアプリの1つで使用しています。

于 2012-06-11T18:44:57.470 に答える