2012-01-03 46 views
0

我正在尋找一種在C#,D或Java中實現幀緩衝的簡單方法。一些東西(一個API或庫),這將允許我使用二維數組的顏色和更新單個像素或區域。此外,在更新時不會產生大量開銷。我知道這可以用OpenGL來完成,但是對於我所做的事來說,API似乎太複雜了。以現代語言實現高效幀緩衝的簡單方法?

+1

什麼樣的操作?讀取/寫入像素可以在陣列中輕鬆完成。這是全部嗎? – Euphoric 2012-01-03 07:04:04

回答

1

請嘗試在.NET中使用普通的舊System.Drawing.Bitmap? 您可以使用Bitmap.Lockbits()訪問位圖後面的字節數組並對其進行更新。這比位圖上的正常像素操作更有效率。

MSDN有,我已經從粘貼一個例子here

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

如果您需要的是二維數組,您可以在C#中創建一個multidimensional array,使您可以直接訪問每個成員。爲了提高效率,請儘量避免頻繁裝箱和取消裝箱,並且不要經常分配和釋放大型內存塊,如果你做得對,沒有理由說明爲什麼這個任務在C#或Java中的效率遠低於其他語言。

1

對於整個屏幕迭代大量像素數據時,數組將花費大量時間。找到不需要的東西或需要的迭代次數會更好。更類似於C中的指針。