用现代语言实现高效帧缓冲区的简单方法

本文关键字:缓冲区 简单 方法 高效 语言 实现 | 更新日期: 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中,这项任务的效率就没有理由比其他语言低得多。