我会尽我所能地解释我的情况,如果不是太清楚,很抱歉…
我有一个Viewport3D,它包含一些像大晶体一样的大3d矩形。
当用户单击其中一个晶体时,我使用ImageBrush将新材料添加到用户单击的位置的晶体中。然后,我迭代位图列表(List<BitmapImage>集合),并在每一帧更新ImageBrush,以便在3D晶体上创建动画。
这个效果很好,我在水晶上播放了多达5种不同的效果,但在分析我的应用程序后,我发现由于mipmap(我想)和3d渲染的方式,我的视频内存跳跃到屋顶!!
根据我的计算,如果我有一个75帧的动画,乘以每像素4字节的400x400,并且有大约5个不同的动画堆叠在一起,你可以看到这是如何变大的:)
75 * 400 * 400 *4*5= ~250MB
这是一个问题,不仅是因为大小,而且BitmapImages会一直留在显存中,直到我将它们设为空,这是非常恼人的,性能成本也很高。
我解决这个问题的想法是,从使用List<BitmapImage>集合改为使用List<Byte[]>,而不是更新ImageSource,而是尝试使用WriteableBitmap将字节写入其中。
问题是我不知道如何从PNG文件中读取字节,然后创建一个WriteableBitmap,然后一遍又一遍地高效地将这些字节写入其中。
有谁能帮帮我吗?
发布于 2009-12-24 00:29:36
WriteableBitmap实际上在性能上相当差,尽管它占用了脏区域。尝试使用InteropBitmap。我在这里已经准备好了一个类:
http://silverlightviewport.codeplex.com/SourceControl/changeset/view/33100#809062
https://stackoverflow.com/questions/1950983
复制相似问题