我有一个非常快速的循环,它在一个Bitmap缓冲区中呈现动画,并在一个独立的线程中添加过滤器(通过使用LockBits / UnlockBits访问原始数据并对其进行Marshaling更改)。
我想找出一种在Form上实时显示渲染的方法,所以我创建了一个PictureBox并将其Image链接到我创建的位图。每次在解锁位图后立即刷新PictureBox(使用委托,进行交叉线程),以便正确更新渲染。
它非常好并且工作速度非常快,但是当我尝试将表单拖动到屏幕的边框时,出现了一个大问题,看看是否会出现任何错误,并且oops,应用程序崩溃......显示位图被锁定'当有任何其他窗口移动到PictureBox上方或PictureBox被部分拖出屏幕时,就会发生这种情况。我怀疑它是因为当重绘是必要的时候,PictureBox可以刷新自己,并且当位图仍然被锁定时它会这样做。所以...任何解决这个问题的方法?或者更好地渲染我的动画的其他方法?
答案 0 :(得分:1)
可能的解决方案之一可能是创建覆盖MyPictureBox : PictureBox
的自定义OnPaintBackground
(比赛)类,如下所示:
protected override OnPaintBackground(...)
{
// nothing, an empty method
}
但我不太确定这会有效,你应该自己检查一下。
我有一个非常快速的循环,它在Bitmap缓冲区中渲染动画
添加过滤器(通过使用LockBits / UnlockBits访问原始
数据和封送改变它。)在一个独立的线程 忘了
PictureBox
,因为我发现它,个人而言,太通用,不适合高性能渲染。只需编写一个简单的类来处理指定表面上指定位图的绘制。
答案 1 :(得分:0)
你做不到。
相反,您应该复制图像(在后台线程上)并将副本放在PictureBox中。
为了获得更好的性能,您可以在两个图像之间切换,以避免创建太多图像。