Существует ли недорогой способ передачи цветовых данных из RenderTarget2D для каждого кадра? - PullRequest
1 голос
/ 07 марта 2012

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

public bool TouchingBlackPixel(GameObject p)
    {
        /*
        Calculate rectangle under the player...
        SourceX,SourceY: Position of top left corner of rectangle
        SizeX,SizeY: Aproximated (cast to int from float) size of box
        */

        Rectangle sourceRectangle = new Rectangle(sourceX, sourceY,
                                                   (int)sizeX, (int)sizeY);

        Color[] retrievedColor = new Color[(int)(sizeX * sizeY)];

        p.tileCurrentlyOn.collisionLayer.GetData(0, sourceRectangle, retrievedColor,
                                                     0, retrievedColor.Count());

        /*
        Check collisions
        */
    }

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

Из того, что мы прочитали, похоже, что проблема в том, что для получения данных из RenderTarget2D вам необходимо передать данные из графического процессора в ЦП, и это происходит медленно. Это усугубляется тем, что нам необходимо запускать одну и ту же функцию дважды (по одному разу для каждого игрока) и не иметь возможности хранить одни и те же данные (они могут быть не на одной плитке).

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

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

Ответы [ 2 ]

1 голос
/ 08 марта 2012

Простой ответ: Не делай этого .

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

Вы должны просто выполнить все проверки столкновений на процессоре. Кроме того, я хотел бы предположить, что, вероятно, быстрее запустить алгоритм столкновения несколько раз и определить реакцию на столкновение, объединив результаты, а не объединять всю сцену в один слой и запускать обнаружение столкновения один раз.

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

(Для простого обнаружения столкновения двухмерных пикселей см. этот пример . Если вам нужна поддержка преобразований, см. Также этот пример .)

0 голосов
/ 07 марта 2012

Полагаю, слой столкновения вашей плитки не меняется.Или, по крайней мере, меняется не очень часто.Таким образом, вы можете хранить цвета для каждой плитки в массиве или другой структуре.Это уменьшит объем данных, передаваемых из GPU в CPU, но требует, чтобы дополнительные данные, хранящиеся в RAM, не были слишком большими.

...