【问题标题】:Converting byte array into texture2D XNA将字节数组转换为texture2D XNA
【发布时间】:2012-04-04 06:30:39
【问题描述】:

我有一个代表图像的字节数组。

每个字节表示特定像素的 R、G 或 B 的强度值 (0-255)。因此,对于 640x480 图像,字节数组的大小为 640*480*3(每个像素有 3 个字节代表它)。

字节按像素顺序排列。例如:

image[0] = the R value of x=0 y=0 
image[1] = the G value of x=0 y=0
image[2] = the B value of x=0 y=0
image[3] = the R value of x=1 y=0

等等。

我想知道在 XNA 中将其绘制到屏幕上最有效的方法是什么?

我的想法是做以下事情。

  1. 创建一个新的 Texture2d 对象
  2. 在 draw() 方法中,循环遍历字节数组并设置 Texture2D 对象上的值
  3. 将此填充的对象绘制到屏幕上。

这是最快的方法吗?如果效率更高,我还可以以不同的顺序/格式存储字节数组。在 draw() 方法期间进行循环有什么缺点吗?在 update() 期间这样做会更好吗?

编辑:

我尝试在 Texture2D 上使用 setData(),以便在每次我的字节数组更新时(通常是一帧一次)创建一个新纹理。 fps现在低于15,之前是60。代码如下:

    public static Texture2D getImageFrame(GraphicsDevice gd)
    {
        if (cameraTex == null)
        {
            cameraTex = new Texture2D(gd, 640, 480, false, SurfaceFormat.Color);
        }
        cameraTex.SetData(imageFrame);
        return cameraTex;
    }

每个 draw() 循环都会调用它。

肯定有更有效的方法来做到这一点?

【问题讨论】:

  • 我强烈建议研究使用享元模式作为开发此应用程序时要考虑的设计模式。我认为您面临的更大挑战之一是以时间敏感的方式在绘制/更新的每次迭代中对这些数据进行整体检索/存储。 en.wikipedia.org/wiki/Flyweight_pattern
  • 在存储字节数组方面,我没有将它作为对象传递。它每帧都会从另一个进程更新,我正在寻找一种方法将这些数据转换为每帧可绘制的 texture2d。
  • 那么你可能想用SetData 做点什么。
  • 我尝试使用传入我的 byte[] 的 setdata 作为输入。它崩溃了一个异常,说数据的大小太大或太大。字节数组为 640*480*3。有谁知道对于 640x480 的图像尺寸预期的 setData 尺寸是多少?
  • 编辑:整理出来,忘记了阿尔法通道...现在新的问题是这很慢。我的帧率现在低于 15,而之前它是坚如磐石的 60。

标签: c# performance image xna texture2d


【解决方案1】:

根据字节数组的更新方式(可能值得注意),您可能可以使用使用索引和计数参数的 SetData 重载来更新较小的纹理片段。

显然,您需要添加一些方法来跟踪哪些像素区域最近发生了变化才能使其正常工作(同样取决于程序的结构)。无论如何,我最近在另一个纹理上绘制血溅纹理时遇到了类似的性能损失,并设法使用这种方法将影响降到最低。

public void SetData(T[] data, int startIndex, int elementCount)

public void SetData(int level, Nullable rect, T[] data, int startIndex, int elementCount)

http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.texture2d.setdata.aspx

【讨论】:

  • 由于每次 Draw() 时都会调用代码,因此您还可以创建一个标志来说明字节数组是否已实际更新,因此 if (bytesUpdated)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
  • 2014-08-08
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多