2012-01-03 8 views
0

C#、DまたはJavaでフレームバッファを実装する簡単な方法を探しています。私が色の2次元配列で作業し、個々のピクセルまたは領域を更新できるようにする何か(APIまたはライブラリ)。また、更新時に大きなオーバーヘッドが発生しないものもあります。私はこれがOpenGLでできることを知っていますが、APIは私がやっていることに対してはあまりにも複雑すぎるようです。現代的な言語で効率的なフレームバッファを実装する簡単な方法は?

+1

どのような種類:

MSDNは私がから貼り付けてきた例hereを持っていますか?画素の読み書きはアレイで簡単に行うことができます。これはすべてですか? – Euphoric

答えて

1

.NETで普通の古いSystem.Drawing.Bitmapを試してみてください。 Bitmap.Lockbits()を使用して、ビットマップの背後にあるバイト配列にアクセスし、それを更新することができます。これは、ビットマップ上の通常のピクセル操作よりもはるかに効率的です。操作の

private void LockUnlockBitsExample(PaintEventArgs e) 
    { 

     // Create a new bitmap. 
     Bitmap bmp = new Bitmap("c:\\fakePhoto.jpg"); 

     // Lock the bitmap's bits. 
     Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height); 
     System.Drawing.Imaging.BitmapData bmpData = 
      bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, 
      bmp.PixelFormat); 

     // Get the address of the first line. 
     IntPtr ptr = bmpData.Scan0; 

     // Declare an array to hold the bytes of the bitmap. 
     int bytes = Math.Abs(bmpData.Stride) * bmp.Height; 
     byte[] rgbValues = new byte[bytes]; 

     // Copy the RGB values into the array. 
     System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes); 

     // Set every third value to 255. A 24bpp bitmap will look red. 
     for (int counter = 2; counter < rgbValues.Length; counter += 3) 
      rgbValues[counter] = 255; 

     // Copy the RGB values back to the bitmap 
     System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes); 

     // Unlock the bits. 
     bmp.UnlockBits(bmpData); 

     // Draw the modified image. 
     e.Graphics.DrawImage(bmp, 0, 150); 

    } 
0

2次元配列の場合、C#ではすべてのメンバーに直接アクセスできるmultidimensional arrayを作成できます。これを効率的にするには、頻繁なボクシングとアンボクシングを避け、大容量のメモリチャンクを頻繁に割り当てたり割り当てを解除したりしてください。そうすれば、C#やJavaでは他の言語よりも効率が悪くなりません。

1

アレイは、大量のピクセルデータを繰り返して、完全な画面を表示するのに時間がかかります。非常に少ない量の反復を必要としないか、必要としないものを見つける方が良いでしょう。 Cのポインターのようなもの

関連する問題