私は自分の2Dエンジンを作成しています。私は.net描画関数を使うことを計画していました。しかし、これは非常に遅く、画面が大きく点滅します。しかし、私はそれを窓に描きます。VB.netの画面にレンダリング
これを行うには、どのような方法が最適ですか?どのように状況にバッファを追加しますか?
私は自分の2Dエンジンを作成しています。私は.net描画関数を使うことを計画していました。しかし、これは非常に遅く、画面が大きく点滅します。しかし、私はそれを窓に描きます。VB.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がそれらをサポートしているとは思わない。
編集:
GDI +が本当にどんな原因それは標準のシステムCPU /メモリリソースを使用して実装の道に速い「燃えるない」ことするつもりはありません。
SlimDXはハードウェアアクセラレーションされた2D APIであるDirect2Dの管理ラッパーを持っています。開始するには、tutorialsがあります。
編集2:
あなたがGDIに固執した場合、あなたはhereは、件名に素晴らしい記事で、いくつかの「最適化」のメモリ操作を行うには、あなたのバックバッファの「するLockBits」を使用することができます。
あなたのコードに多すぎるものが1つあります。さらに、VBやC#でブロックされたピクセル配列を操作することは可能ですが、ここでは安全でないコードは必要ありません(ただし、インデックスが範囲外のチェックを省略する可能性があるため、少し速くなる可能性があります)。 –
@ Konrad "Marshal"オブジェクトでbmp.LockBits()を使用し、ピクセル配列を前後にコピーすることができることに気づきましたが、これに対して "(ptr *)bmp.Scan0 + (オフセット)= val」である。 :) –
本当です。私はこの不必要なコピーを逃すVBの方法はないと思う。しかし、それでも 'LockBits'は' SetPixel'でピクセルを操作するよりも高速です。 –