DirectX9, DirectDraw, Оптимизация? - PullRequest
2 голосов
/ 17 февраля 2010

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

На моем компьютере (процессор AMD Phenom (tm) II X4 955 (4 процессора), ~ 3,2 ГГц, 4096 МБ ОЗУ DDR2, NVIDIA GeForce GTX 285)скорость ~ 2200 FPS при рендеринге около 200 спрайтов и около 100 FPS при рендеринге около 14 500.

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

Режим релиза VS2008 с полной оптимизацией для C ++.Я знаю, что слышал, что левый и правый не оптимизируют преждевременно, но на данный момент он работает отлично для меня, но не на некоторых компьютерах.

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

Я пробовал плавающие и удваиваемые значения, и скорость ничем не отличается.

Будет ли отличаться использование DirectDraw, а не DirectX и метода визуализации Sprite?Поскольку я не представляю различий между DirectDraw и DirectX, я не на 100% думаю об этом.

Игра отлично работает на средних компьютерах, но с чем я сравниваю свою игруэто Touhou.Touhou работает на 60 FPS на самом слабом компьютере, который я пробовал, но моя игра не будет работать быстрее, чем 36 ~ 42 FPS.Я не могу себе представить, что я делаю неправильно, будучи таким новым для DirectX и C ++.

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

Ответы [ 4 ]

5 голосов
/ 17 февраля 2010

Вам нужен профилировщик.

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

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

1 голос
/ 18 февраля 2010

Профилируйте ваше приложение и определите, является ли ваше узкое место ЦП или графическим процессором (или шиной передачи между ними) После определения у вас есть несколько вариантов:

1) Если это ЦП, вы можете попробовать инстансинг, чтобы уменьшить количество вызовов розыгрышей. Или, если ваша целевая машина не поддерживает аппаратное копирование, попробуйте выполнить пакетную обработку. Для создания экземпляра или пакетной обработки спрайта вы должны использовать QUAD (ориентированный на 2 треугольника) в качестве интерфейса по умолчанию.

2) Если это графический процессор, попытайтесь понять, является ли шейдер причиной замедления. Если это так, попробуйте оптимизировать его. Если это не шейдер, попробуйте уменьшить оверрейд. ЕСЛИ часть ваших объектов непрозрачна при использовании рисунка спереди назад

3) Если используется шина, попробуйте сделать то же самое с процессором, так как при пакетной обработке вы уменьшаете количество блокировок / разблокировок, необходимых для передачи данных. (с инстансингом вам вообще не нужно обновлять буфер)

Вот и все. : P

P.S. Предупреждение ... НЕ ПЫТАЙТЕСЬ ПРОФИЛИРОВАТЬ вызовы DirectX с помощью профилировщика ЦП. (но используйте PerfHud от nVidia или GPUPerfStudio от ATI или GPA от Intel) Это просто потерянное время, DirectX имеет буфер команд, и вы не уверены, что вызов, сделанный сейчас, выполняется в этот раз. Большую часть времени он возвращается немедленно и ничего не делает.

1 голос
/ 17 февраля 2010

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

Вы вставляете и / или удаляете вещи с позиций, отличных от задней части вектора?В векторе вставки и удаления из середины занимают O (n) времени, то есть количество времени, которое оно пропорционально размеру вашего вектора.std::list вместо.Обратите внимание, что с объектами 10k + это может легко вызвать проблемы с производительностью, в зависимости от того, как часто вы это делаете.

1 голос
/ 17 февраля 2010

Я использую вектор для хранения информации о каждом отображаемом объекте и использую один спрайт с множеством вызовов отрисовки.

Я не уверен, что понимаю, что вы говорите, но похоже, что вы рисуете по существу один и тот же объект во многих разных местах. Если это так, вы, вероятно, хотите посмотреть DirectX Instancing . Основная идея заключается в том, что вы указываете 1) геометрию для рисования и 2) количество мест для ее рисования. Это сохраняет повторную настройку геометрии каждый раз, когда вы рисуете объект, так что это может значительно улучшить скорость.

...