Производительность C # DirectX - PullRequest
1 голос
/ 14 мая 2011

Для игры с падающим песком Мне нужно заблокировать поверхность , , затем изменить пиксели в соответствии с набором правил, а затем разблокировать он . Текстура имеет размер 800x500 и имеет формат A8R8G8B8 .

ДЕКЛАРАЦИЯ ТЕКСТУРЫ

texture = new Texture(device, 800, 500, 1, Usage.Dynamic, Format.A8R8G8B8, Pool.Default);

Метод обновления (который в идеале должен называться около 40 / с)

    public new void Update()
    {
        count++;
        byte[] data = (byte[])texture.LockRectangle(typeof(byte), 0, LockFlags.None, 800 * 500 * 4);
        for (int i = 0; i < 1600000; i++)
        {
            data[i] = 255;
        }
        texture.UnlockRectangle(0);
    }

У меня более мощная видеокарта, и этот простой цикл снижает частоту кадров до 10-13.

Есть ли более быстрый способ в DirectX напрямую изменять пиксели поверхности?

Ответы [ 2 ]

3 голосов
/ 14 мая 2011

Что вы делаете, считываете эту текстуру из памяти видеокарты в память компьютера, затем модифицируете ее и затем записываете обратно.Это, очевидно, означает огромное снижение производительности, потому что вам нужно подождать копирования между двумя ячейками памяти.

Обычно, этот тип операции выполняется с использованием шейдеров на видеокарте.

0 голосов
/ 14 мая 2011

Обычно игровая модель хранится в обычной памяти и обрабатывается центральным процессором, а графическая карта используется исключительно для визуализации результатов. Если у вас нет особых причин не идти по этому пути, было бы легче написать и отладить.

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

Я бы порекомендовал найти образец "игры жизни", написанный с использованием шейдеров (поиск - http://www.bing.com/search?q=directx+shader+sample+%22game+of+life%22,. Я бы, вероятно, начал с этого - http://www.xnainfo.com/content.php?content=21). Игра жизни, вероятно, самая простая вещь, близкая Достаточно того, чего вы хотите достичь. DirectX SDK и Nvidia SDK также являются хорошими источниками сэмплов, например - http://developer.download.nvidia.com/SDK/9.5/Samples/3dgraphics_samples.html.

Для получения дополнительных примеров выполните поиск «шейдера prostprocess», поскольку практически все они реализованы путем манипулирования окончательно отрисованным изображением с помощью шейдеров.

...