【问题标题】:Is there a way to improve Image memory usage for Image controls using the same images?有没有办法提高使用相同图像的图像控件的图像内存使用率?
【发布时间】:2012-06-12 08:15:11
【问题描述】:

在一个 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>

【问题讨论】:

  • 2MB 对于 60x60 的图像来说似乎很多。你要缩小图像吗?
  • 图像大小为 1501 x 300。磁盘上约 100k。剪辑技术将其限制为一次显示 60x60。
  • 单张图片的原因是由于我无法通过情节提要和控件调整大小来解决的一些疯狂问题。

标签: performance image windows-phone-7 optimization sprite-sheet


【解决方案1】:

我认为您的实现不会扩展,因为我认为多个 Image 元素不知道共享同一个位图缓存。

解决方案:CompositionTarget.Rendering 和 WriteableBitmapEx

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

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


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

【讨论】:

  • WriteableBitmapEx 正是我所遵循的路线,它极大地改进了一些东西,但不足以阻止 256Mb 模拟器上的内存问题。不过可以在 512 和设备上使用。
  • 很高兴听到您取得了进展。如果您使用 WriteableBitmapEx 来绘制场景,您可能应该关闭位图缓存。还是您将图像控件设置为从 WriteableBitmapEx 中获得的小图像?
  • 正是如此,我使用 SplashScreen 中的 WireableBitmapEx 裁剪方法将动画帧集(步行、攻击、死亡)静态切割成 WriteableBitmaps。从一个缓存的 WriteableBitmap 交换图像源似乎比交换缓存的 BitmapImages 快得多。如果有办法进一步优化它,我会很高兴的。
  • 标记为答案,因为这是我所追求的,没有任何其他建议。
猜你喜欢
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
相关资源
最近更新 更多