【发布时间】:2011-06-24 13:20:13
【问题描述】:
我正在创建自己的 2D 引擎。我计划只使用 .net 绘图功能。但是,这非常慢,并且屏幕闪烁很多。我必须把它画到一个窗口上,但是......
最好的方法是什么?我将如何为这种情况添加缓冲区?
【问题讨论】:
我正在创建自己的 2D 引擎。我计划只使用 .net 绘图功能。但是,这非常慢,并且屏幕闪烁很多。我必须把它画到一个窗口上,但是......
最好的方法是什么?我将如何为这种情况添加缓冲区?
【问题讨论】:
假设您使用的是 GDI,“屏幕”闪烁问题是由于直接在主表面上写入所致。您可以通过执行以下操作来创建“位图”缓冲区来避免这种情况:
Bitmap buffer = New Bitmap(Me.ClientSize.Width, Me.ClientSize.Height)
然后从该缓冲区创建一个托管的“图形”对象,
Using gfx As Graphics = New Graphics.FromImage( buffer )
// draw with gfx object
End Using
要在主表面上显示更新后的后台缓冲区,例如:
PrimaryGraphics.DrawImageUnscaled(buffer, 0, 0) 或者您可以 P/Invoke "BitBlt",我相信这会更快一些。
如果您使用的是 C#,我建议您使用“不安全”代码块直接通过指针操作缓冲区,这可以大大加快处理速度。但是,我不相信 VB.net 支持它们。
编辑:
由于使用标准系统 CPU/内存资源实现的方式,GDI+ 无论如何都不会真正“超快”。
您可以考虑使用SlimDX,它有一个围绕 Direct2D 的托管包装器,一个硬件加速的 2D API。有一些 tutorials 可供入门。
编辑 2:
如果你坚持使用 GDI,你可以在你的后台缓冲区上使用“LockBits”来做一些“优化”的内存操作,here 是关于这个主题的一篇很棒的文章。
【讨论】:
New 太多。此外,在 VB 和 C# 中也可以操作阻塞的像素数组,这里不需要不安全的代码(尽管它可能会稍微快一些,因为它可能会省略索引越界检查)。
LockBits 也比通过SetPixel 处理像素要快。