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

一种可能的解决方案是使用CompositionTarget.Rendering进行渲染,就像我在此处的回答中一样。这会在屏幕更新之前触发一个事件,以便您可以进行自己的绘图。我相信这就是 Krashlander 和其他一些 Silverlight 游戏的工作方式(尽管我认为他可能在以后的版本中切换到了 XNA)。

然后我认为您可以使用WriteableBitmapEx使用源图像的一个实例将其绘制到缓冲区的多个位置。您应该更好地缩放,因为您的缓冲区大小与屏幕/视口一样大,并且每个图像都有一份副本。显示 1 个敌人和 1000 个敌人的内存要求应该相同。


我将添加一个免责声明,我没有尝试过这种确切的方法,但我确实CompositionTarget.Rendering在我的一个应用程序中使用了平滑的屏幕更新。

于 2012-06-11T18:44:57.470 回答