在 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>
最佳答案
我认为您的实现不会扩展,因为我不认为多个 Image
元素知道共享相同的位图缓存。
解决方案:CompositionTarget.Rendering 和 WriteableBitmapEx
一种可能的解决方案是使用 CompositionTarget.Rendering在 my answer here 中进行渲染.这会在屏幕更新之前触发一个事件,以便您可以进行自己的绘图。我相信这就是 Krashlander 和其他一些 Silverlight 游戏的工作方式(尽管我认为他可能在以后的版本中切换到了 XNA)。
那我觉得可以用WriteableBitmapEx使用源图像的一个实例将其绘制到缓冲区的多个位置。您应该更好地缩放,因为您的缓冲区大小与屏幕/视口(viewport)一样大,并且每个图像都有一份副本。显示 1 个敌人和 1000 个敌人的内存要求应该相同。
我将添加一个免责声明,我没有尝试过这种确切的方法,但我确实使用了 CompositionTarget.Rendering
在我的一个应用程序中进行平滑的屏幕更新。
关于performance - 有没有办法提高使用相同图像的图像控件的图像内存使用率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10945981/