所以我在一个类中有一个usercontrol。在使用该类的程序中,它将用户控件呈现为位图,然后将用户控件显示为图像源。
通常我会这样做:
private MyUserControl userControl;
private RenderTargetBitmap bitmap;
private WriteableBitmap wBitmap;
public MyClass()
{
bitmap = new RenderTargetBitmap(1280, 40, 96, 96, PixelFormats.Pbgra32);
}
private void renderBitmap()
{
bitmap.Clear();
bitmap.Render(textControl);
wBitmap = new WriteableBitmap(bitmap);
texture.SetImage(wBitmap.BackBuffer);
}
private delegate void TickDelegate();
override public void Tick(float fSeconds)
{
Dispatcher.BeginInvoke(new TickDelegate(renderBitmap));
}
如您所见,SetImage
函数需要来自writeablebitmap的后备缓冲区。但是,这有一个问题。我的usercontrol中有动画;所以这个功能每秒执行大约30次。这一切都有效,动画在程序中完全按照我想要的方式显示。
问题是,new WriteableBitmap()
每秒被调用30次,这会占用大量的内存。有没有办法我可以将RenderTargetBitmap
设置为WriteableBitmap
而不必每秒宣布new WriteableBitmap()
30次?或者可以从RenderTargetBitmap
获取后备缓冲,而不必使用WriteableBitmap
?
好的,显然我可以在设置纹理后添加以下内容:
wBitmap = null;
GC.Collect();
这可以防止内存使用量大幅增加。但是,每秒30次调用垃圾收集器是否有害?
答案 0 :(得分:1)
很遗憾,您没有显示完整的代码,因此我不知道texture
是什么。但是我假设一旦为它设置了BackBuffer
对象,它总是会反映BackBuffer
对象的任何更新。考虑到这一点......
不是每个tick都创建一个新的WriteableBitmap
对象,而只创建一个用于纹理的对象。然后使用BitmapSource.CopyPixels()
获取致电Render()
的结果,最后使用WriteableBitmap.WritePixels()
将其复制回WriteableBitmap
。
请务必在更新Lock
时致电Unlock
和WriteableBitmap
。
使用这种方法,您将避免每秒数十次创建大量新的位图对象。