繁体   English   中英

将字节数组转换为texture2D XNA

[英]Converting byte array into texture2D XNA

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

每个字节表示特定像素的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()循环。

当然必须有一种更有效的方法来做到这一点?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM