Get BackBuffer from RenderTargetBitmap?
本文关键字:RenderTargetBitmap from BackBuffer Get | 更新日期: 2023-09-27 18:27:49
所以我在一个类中有一个用户控件。在使用该类的程序中,它会将用户控件渲染为位图,然后将用户控件显示为图像源。
通常我会这样做:
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
函数需要来自可写位图的backbuffer。然而,这是一个问题。我的用户控件中有动画;因此该功能每秒执行大约30次。这一切都工作,动画显示在程序中,正是我希望它。
问题是new WriteableBitmap()
每秒被调用30次,这会消耗TON的内存。有没有一种方法可以将我的RenderTargetBitmap
设置为WriteableBitmap
,而不必每秒声明30次new WriteableBitmap()
?或者可能在不必使用WriteableBitmap
的情况下从RenderTargetBitmap
获得后缓冲区?
- 编辑*
好的,显然我可以在纹理设置后添加以下内容:
wBitmap = null;
GC.Collect();
这可以防止内存使用量的大幅飙升。然而,每秒调用垃圾收集器30次有害处吗?
很遗憾,您没有显示完整的代码,所以我不知道texture
是什么。但我假设,一旦您为它设置了BackBuffer
对象,它总是会反映对BackBuffer
对象的任何更新。考虑到这一点。。。
与其在每个刻度上创建一个新的WriteableBitmap
对象,不如只创建一个用于纹理的对象。然后使用BitmapSource.CopyPixels()
获取对Render()
的调用结果,最后使用WriteableBitmap.WritePixels()
将其复制回WriteableBitmap
。
记得在更新WriteableBitmap
时致电Lock
和Unlock
。
使用这种方法,可以避免每秒数十次创建大量新位图对象。