从RenderTargetBitmap获取BackBuffer?

时间:2014-10-24 21:44:35

标签: c#

所以我在一个类中有一个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次调用垃圾收集器是否有害?

1 个答案:

答案 0 :(得分:1)

很遗憾,您没有显示完整的代码,因此我不知道texture是什么。但是我假设一旦为它设置了BackBuffer对象,它总是会反映BackBuffer对象的任何更新。考虑到这一点......

不是每个tick都创建一个新的WriteableBitmap对象,而只创建一个用于纹理的对象。然后使用BitmapSource.CopyPixels()获取致电Render()的结果,最后使用WriteableBitmap.WritePixels()将其复制回WriteableBitmap

请务必在更新Lock时致电UnlockWriteableBitmap

使用这种方法,您将避免每秒数十次创建大量新的位图对象。