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

Performance 有没有办法提高使用相同图像的图像控件的图像内存使用率?,performance,image,windows-phone-7,optimization,sprite-sheet,Performance,Image,Windows Phone 7,Optimization,Sprite Sheet,在WP7游戏中,我正在构建我的敌人类,它们被包装在EnemyControl中。 敌方控制使用该敌方类型的所有不同动画状态的精灵表。我静态缓存位图的图像只有4个 我遇到的问题是,尽管图像被静态缓存(BitmapImage和CacheMode=“BitmapCache”),但当控件加载图像时,它会为每个控件添加大约2兆的纹理/系统内存 这是一个重要的问题,因为它限制了我可以想象的屏幕上敌人的数量 有人知道我该如何改善这种情况吗?或者以其他方式解决它 以下是xaml(如果感兴趣): <Canva

在WP7游戏中,我正在构建我的
敌人
类,它们被包装在
EnemyControl
中。 敌方控制使用该敌方类型的所有不同动画状态的
精灵表。我静态缓存位图的图像只有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>

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

解决方案:CompositionTarget.Rendering和WriteableBitmapEx 一种可能的解决方案是使用中的渲染。这将在更新屏幕之前触发一个事件,以便您可以自己绘制图形。我相信这就是Krashlander和其他一些Silverlight游戏的工作原理(尽管我认为他可能已经在以后的版本中切换到XNA)

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



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

2MB对于60x60图像来说似乎太多了。您正在缩小图像的比例吗?图像的比例为1501 x 300~磁盘上有100k。剪辑技术将一次只能显示60x60的图像。之所以只显示一张图像,是因为我无法用情节提要和控制大小来解决一些疯狂的问题。WriteableBitmapEx正是我遵循的路线,它极大地改善了事情,但不足以停止256Mb模拟器上的内存问题。不过在512和设备上效果不错。很高兴听到你取得了进展。如果使用WriteableBitmapEx绘制场景,可能应该关闭位图缓存。还是将图像控件设置为从WriteableBitmapEx中获得的小图像?正是如此,我使用SplashScreen中的WireableBitmapEx裁剪方法将动画帧集(行走、攻击、死亡)静态剪切为WriteableBitmaps。从一个缓存的WriteableBitmap中交换出图像源似乎比交换缓存的BitMapImage快得多。如果有一种方法可以进一步优化的话,我会很高兴的。因为这是我一直追求的答案,而且没有任何其他的建议。