用现代语言实现高效帧缓冲区的简单方法
本文关键字:缓冲区 简单 方法 高效 语言 实现 | 更新日期: 2023-09-27 18:19:29
我正在寻找一种在C#、D或Java中实现帧缓冲区的简单方法。一些东西(API或库),它将允许我使用2d颜色阵列并更新单个像素或区域。此外,在更新时不会产生很大开销的东西。我知道这可以用OpenGL来完成,但是API对于我所做的来说似乎太复杂了。
是否尝试在.NET中使用普通的旧System.Drawing.Bitmap
?您可以使用Bitmap.Lockbits()
访问位图后面的字节数组并对其进行更新。这比位图上的普通像素操作效率高得多。
MSDN有一个我粘贴的示例:
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);
}
数组在迭代如此大量的像素数据以获得完整屏幕时将花费大量时间。最好是找到一些不需要或需要很少迭代的东西。更像C.中的指针
如果您需要一个2D数组,那么在C#中,您可以创建一个多维数组,直接访问每个成员。为了提高效率,尽量避免频繁的装箱和拆箱,不要频繁地分配和释放大的内存块,如果你做得对,那么在C#或Java中,这项任务的效率就没有理由比其他语言低得多。