2011-06-24 43 views
2

我正在創建我自己的2D引擎。我計劃只使用.net繪圖功能。但是,這非常慢,屏幕閃爍很多。我不得不把它繪製到一個窗口,但是...渲染到VB.net中的屏幕

這樣做的最佳方法是什麼?我將如何添加緩衝區的情況?

回答

2

假設您使用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支持它們。

編輯:

GDI +是不是真的是「熾熱的」快不管是什麼,由於它在使用標準的系統CPU /內存資源實現的方式。

你可以看看使用SlimDX,它有一個圍繞Direct2D的管理包裝,一個硬件加速的2D API。有一些tutorials可用於入門。

編輯2:

如果你堅持用GDI,你可以使用「LockBits」在你的背上緩衝區做一些「優化」的內存操作,here關於這個問題的一個偉大的文章。

+0

你的代碼中有一個'New'太多了。此外,在VB和C#中操作被阻塞的像素數組是可能的,在這裏不必要使用不安全的代碼(儘管它可能稍微快一些,因爲它可能會忽略索引超出邊界檢查)。 –

+0

@Konrad我意識到你可以使用bmp.LockBits()和「Marshal」對象並且來回複製像素數組,但是這樣做相對於「(ptr *)bmp.Scan0 + (偏移)= val「。 :) –

+0

是的。我不認爲在VB中有一種方法可以消除這個不必要的副本。但即使如此,'LockBits'比通過「SetPixel」操作像素更快。 –