我正在创建自己的2D引擎。我打算只使用.net绘图功能。但是,这非常慢,屏幕闪烁很多。我必须把它画到一个窗口,但是......
最好的方法是什么?我如何在这种情况下添加缓冲区?
答案 0 :(得分:2)
假设您正在使用GDI,“屏幕”闪烁问题是由于直接在主表面上书写。您可以通过执行以下操作来创建“位图”缓冲区来避免这种情况:
Bitmap buffer = New Bitmap(Me.ClientSize.Width, Me.ClientSize.Height)
然后从该缓冲区创建托管“Graphics”对象,
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支持它们。
编辑:
GDI +并不会真正“快速”快速,无论是由于使用标准系统CPU /内存资源实现的方式。
你可以考虑使用SlimDX,它有一个围绕Direct2D的托管包装器,一个硬件加速的2D API。有一些tutorials可用于入门。
编辑2:
如果您坚持使用GDI,您可以在后台缓冲区上使用“LockBits”来执行一些“优化”的内存操作,here是一篇关于此主题的精彩文章。