我正在寻找一种在C#,D或Java中实现帧缓冲的简单方法。允许我使用2d颜色数组并更新单个像素或区域的东西(API或库)。此外,在更新时不会产生大量开销。我知道这可以通过OpenGL完成,但API似乎对我正在做的事情太复杂了。
答案 0 :(得分:1)
阵列将花费大量时间,同时迭代如此大量的像素数据以获得完整的屏幕。找到一些不需要或者需要非常少量迭代的东西会更好。更像是C中的指针。
答案 1 :(得分: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);
}
答案 2 :(得分:0)
如果你需要的是2D数组,在C#中你可以创建一个multidimensional array,让你可以直接访问每个成员。为了提高效率,请尽量避免频繁装箱和拆箱,并且不要经常分配和释放大内存块,如果你这样做,没有理由认为这个任务在C#或Java中的效率要低于其他语言。