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次有害处吗?

Get BackBuffer from RenderTargetBitmap?

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

与其在每个刻度上创建一个新的WriteableBitmap对象,不如只创建一个用于纹理的对象。然后使用BitmapSource.CopyPixels()获取对Render()的调用结果,最后使用WriteableBitmap.WritePixels()将其复制回WriteableBitmap

记得在更新WriteableBitmap时致电LockUnlock

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

相关文章:
  • 没有找到相关文章