Преобразование байтового массива в texture2D XNA - PullRequest
3 голосов
/ 19 марта 2012

У меня есть байтовый массив, представляющий изображение.

Каждый байт представляет значение интенсивности (0-255) R, G или B определенного пикселя. Таким образом, для изображения 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 ()? Было бы лучше сделать это во время обновления ()?

EDIT:

Я пытался использовать 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 ().

Неужели должен быть более эффективный способ сделать это?

1 Ответ

2 голосов
/ 20 марта 2012

В зависимости от способа обновления байтового массива (возможно, стоит отметить), вы, вероятно, можете обновить меньший сегмент текстуры, используя перегрузки SetData, которые используют параметры index и count.

Очевидно, что вам нужно добавить какой-то способ отслеживания того, какие области пикселей в последний раз изменились, чтобы это работало (опять же, зависит от структуры вашей программы). В любом случае, у меня недавно был аналогичный удар по производительности при нанесении текстуры брызги крови на другую текстуру, и мне удалось минимизировать попадание с помощью этого метода.

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

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

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

...