在现代语言中实现高效帧缓冲的简单方法?

时间:2012-01-03 06:23:33

标签: c# java graphics d framebuffer

我正在寻找一种在C#,D或Java中实现帧缓冲的简单方法。允许我使用2d颜色数组并更新单个像素或区域的东西(API或库)。此外,在更新时不会产生大量开销。我知道这可以通过OpenGL完成,但API似乎对我正在做的事情太复杂了。

3 个答案:

答案 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中的效率要低于其他语言。