performance - 有没有办法提高使用相同图像的图像控件的图像内存使用率?

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

在 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.Renderingmy answer here 中进行渲染.这会在屏幕更新之前触发一个事件,以便您可以进行自己的绘图。我相信这就是 Krashlander 和其他一些 Silverlight 游戏的工作方式(尽管我认为他可能在以后的版本中切换到了 XNA)。

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

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

关于performance - 有没有办法提高使用相同图像的图像控件的图像内存使用率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10945981/

相关文章:

ios - 使用存储文件的路径作为字符串来存储和检索图像

image - 将 png 图像嵌入到 SVG 中

c# - 如何在 WP7 C# 中获取控件的位置

windows-phone-7 - 连接丢失时,BinaryReader.Read不会引发IOException

algorithm - 欧拉计划 #14 : Collatz Conjecture - What are some algorithms to utilize memoization/speed effectively?

java - 如何提高从 hazelcast 读取数据的 Get 方法性能?

jquery - 保持图像居中,同时它会根据浏览器大小按 % 更改大小?

javascript - Github 应该用作 JavaScript 库的 CDN 吗?

Python 是 'key in dict' 与 'key in dict.keys()' 不同/更快

c# - 从库中获取应用程序的版本号