将字节数组转换为Texture2D XNA

4
我可以翻译这段内容。它与 IT 技术有关。
我有一个表示图像的字节数组。
每个字节表示特定像素的 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()期间执行它是否更好?

编辑:

我尝试使用setData()在Texture2D上创建一个新纹理,每当我的字节数组更新时(通常一帧),但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()周期调用。

肯定有更有效率的方法吧?


我强烈建议在开发此应用程序时考虑使用享元模式作为设计模式。我认为你面临的最大挑战之一将是在每次绘制/更新迭代中以及时间敏感方式下检索/存储数据的整体处理。http://en.wikipedia.org/wiki/Flyweight_pattern - George Johnston
就字节数组的存储而言,我并没有将其作为对象传递。它每帧都会从另一个进程中更新,并且我正在寻找一种方法将这些数据在每帧转换为可绘制的Texture2D纹理。 - Jkh2
你可能想要使用SetData来完成一些操作。 - thedaian
我尝试使用setdata将我的byte[]作为输入传递。它崩溃并抛出异常,说数据的大小太大或太大了。字节数组是6404803。有人知道对于640x480的图像大小,setData期望的大小是多少吗? - Jkh2
已解决,忘记了 alpha 通道...现在新的问题是非常慢。我的帧速率现在低于15,而之前它一直稳定在60。 - Jkh2
1个回答

2
根据字节数组的更新方式(值得注意),您可以使用使用索引和计数参数的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


1
由于每次调用Draw()时都会调用该代码,因此您还可以创建一个标志来判断是否真正更新了字节数组,所以如果(bytesUpdated) - kallotec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接