Как 3D-игры настолько эффективны? - PullRequest
189 голосов
/ 07 февраля 2010

Есть кое-что, чего я никогда не понимал. Как может такая большая игра для ПК, как GTA IV, использовать 50% моего процессора и работать со скоростью 60 кадров в секунду, в то время как демонстрация DX с вращающимся чайником @ 60fps использует колоссальные 30%?

Ответы [ 17 ]

96 голосов
/ 07 февраля 2010

терпение, техническое мастерство и выносливость.

Во-первых, DX Demo - это прежде всего учебное пособие, поэтому оно сделано для ясности, а не для скорости исполнения.

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

  1. Ваш код разработан вокруг двух вещей - ваших данных и вашего целевого оборудования.
  2. Самый быстрый код - это код, который никогда не исполняется - сортируйте ваши данные по пакетам и выполняйте только дорогостоящие операции с данными, необходимыми для
  3. Ключевым моментом для хранения ваших данных является стремление к непрерывному доступу, что позволяет пакетировать процесс с высокой скоростью.
  4. Парелизировать все, что возможно
  5. Современные процессоры работают быстро, современные ОЗУ работают очень медленно. Промахи кеша смертельны.
  6. Нажимайте как можно больше на графический процессор - он имеет быструю локальную память, поэтому может пролистывать данные, но вам нужно выручить их, правильно организовав свои данные.
  7. Избегайте выполнения большого количества переключений рендеринга (снова объединяйте похожие данные вершин вместе), так как это приводит к зависанию графического процессора
  8. Swizzle ваши текстуры и убедитесь, что они имеют полномочия двух - это повышает производительность кеша текстур на GPU.
  9. Максимально используйте уровни детализации - низкие / средние / высокие версии 3D-моделей и переключайтесь в зависимости от расстояния до проигрывателя камеры - нет смысла рендерить версию с высоким разрешением, если на экране всего 5 пикселей.
70 голосов
/ 07 февраля 2010

В общем, это потому что

  1. Игры оптимальны в том, что им нужно для рендеринга, а
  2. Они пользуются особым преимуществом вашего оборудования.

Например, одна простая оптимизация, которую вы можете сделать, заключается в том, чтобы на самом деле не пытаться рисовать то, что не видно. Рассмотрим сложную сцену, похожую на городской пейзаж из Grand Theft Auto IV . Рендерер фактически не рендерит все здания и сооружения. Вместо этого он отображает только то, что видит камера. Если бы вы могли летать к задней части тех же зданий, лицом к оригинальной камере, вы бы увидели полурасположенную полую конструкцию оболочки. Каждая точка, которую камера не может видеть, не отображается - поскольку вы ее не видите, нет необходимости пытаться показать ее вам.

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

Другая часть вашего вопроса состоит в том, почему демо использует так много CPU:

... в то время как демонстрация DX вращающегося чайника @ 60fps использует колоссальные 30%?

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

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

40 голосов
/ 07 февраля 2010

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

Тот же самый эффект может быть достигнут с помощью радиации, которая основана на довольно точном моделировании. Radiosity также учитывает больше эффектов от прыгающих огней и т. Д., Но это вычислительно дорого - это метод трассировки лучей.

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

Эти 'оптимизации' огромны - вы можете эффективно реализовать алгоритм и заставить его работать в 10 раз быстрее, но выбор умного алгоритма, который дает аналогичный результат («обман»), может заставить вас перейти O (N ^ 4) - O (log (N)).

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

32 голосов
/ 12 июля 2010

Eeeeek!

Я знаю, что этот вопрос старый, но интересно, что никто не упомянул VSync !!! ???

Вы сравнили загрузку процессора в игре на скорости 60 кадров в секунду с использованием процессора в демонстрационной версии чайника на скорости 60 кадров в секунду.

Разве не очевидно, что оба работают (более или менее) со скоростью ровно 60 кадров в секунду? Это приводит к ответу ...

Оба приложения работают с включенной vsync! Это означает, что частота кадров рендеринга привязана к «вертикальному интервалу пропуска» вашего монитора. Графическое оборудование (и / или драйвер) будет отображаться только при макс. 60fps. 60fps = 60 Гц (Гц = в секунду) частота обновления. Таким образом, вы, вероятно, используете довольно старый, мерцающий ЭЛТ или обычный ЖК-дисплей. На ЭЛТ, работающем с частотой 100 Гц, вы, вероятно, увидите частоту кадров до 100 Гц. VSync также применяется аналогично ЖК-дисплеям (частота обновления которых обычно составляет 60 Гц).

Итак, демоверсия чайника может работать намного эффективнее! Если он использует 30% процессорного времени (по сравнению с 50% процессорного времени для GTA IV), то он, вероятно, использует меньше процессорного времени в каждом кадре и просто дольше ждет следующего вертикального интервала. Чтобы сравнить оба приложения, вы должны отключить vsync и измерить снова (вы будете измерять намного более высокие fps для обоих приложений).

Иногда нормально отключить vsync (в большинстве игр есть опция в настройках). Иногда вы увидите «разрывающиеся артефакты», когда vsync отключен.

Вы можете найти подробную информацию об этом и почему он используется в Википедии: http://en.wikipedia.org/wiki/Vsync

26 голосов
/ 09 февраля 2010

Хотя многие ответы здесь дают отличные указания на как вместо этого я отвечу на более простой вопрос почему

Возможно, лучшим примером (безусловно, одним из самых известных) является программное обеспечение Id. Они очень рано осознали, во времена Commander Keen (задолго до 3D), что придумал умный способ достичь чего-то 1 , даже если он полагался на современное оборудование (в этом например, графическая карта EGA!), которая была графически выше конкурентов, что сделало вашу игру выдающейся. Это было правдой, но они также поняли, что вместо того, чтобы самим придумывать новые игры и контент, они могли лицензировать технологию, получая таким образом доход от других, в то же время имея возможность разрабатывать движок следующего поколения и, таким образом, перепрыгивать через конкурентов. .

Способности этих программистов (в сочетании с деловыми знаниями) - вот что сделало их богатыми.

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

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

  • меньше времени
  • меньше ресурсов
  • меньше вознаграждения
  • меньше внутренней и внешней конкуренции
  • меньшие цели
  • меньше талантов

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

Меньшие цели, вероятно, будут главной причиной. Целью демонстрации чайника была именно эта демонстрация. Но не демо программистов навык 3 . Это будет демонстрация одного небольшого аспекта (большой) ОС, в данном случае DX-рендеринга.

Для тех, кто просматривает демонстрацию, это не имеет значения, если использовать гораздо больше ресурсов процессора, чем требуется , пока это выглядит достаточно хорошо. Там не будет никакого стимула для устранения отходов, когда не будет бенефициара. В сравнении игра хотела бы иметь запасные циклы для лучшего ИИ, лучшего звука, большего количества полигонов, большего количества эффектов.


  1. в этом случае плавная прокрутка на оборудовании ПК
  2. Вероятно, больше, чем я, поэтому мы понимаем это
  3. Строго говоря, это было бы демонстрацией и для его / ее менеджера, но опять-таки здесь бывают время и / или визуальное качество.
18 голосов
/ 07 февраля 2010

По нескольким причинам

  • 3D игровые движки высоко оптимизированы
  • большая часть работы выполняется вашим графическим адаптером
  • 50% Хм, позвольте мне предположить, что у вас двухъядерный процессор и используется только одно ядро;

РЕДАКТИРОВАТЬ: дать несколько цифр

2,8 ГГц Athlon-64 с графическим процессором NV-6800. Результаты:

  • ЦП: 72,78 Мфлопс
  • GPU: 2440,32 Мфлопс
8 голосов
/ 07 февраля 2010

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

В игре вы можете увидеть похожие эффекты, но обычно они выполняются скомпрометированным способом, чтобы максимизировать частоту кадров. Эти оптимизации распространяются на все, что вы видите в игре. Возникает вопрос: «Как мы можем создать наиболее эффектную и реалистичную сцену с наименьшим количеством вычислительной мощности?» Это то, что делает программистов игр одними из лучших оптимизаторов в мире.

5 голосов
/ 23 декабря 2010

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

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

Sleep(0);

сразу после возврата из функции рендеринга и сравнения.

5 голосов
/ 07 февраля 2010
  1. Управление сценой. kd-деревья, отбраковка фруструма, bsps, иерархические ограничительные рамки, наборы частичной видимости
  2. LOD. Переключение версий с более низкой детализацией для замены удаленных объектов.
  3. Самозванцы. Как LOD, но даже не объект, а просто картинка или «рекламный щит».
  4. SIMD.
  5. Пользовательское управление памятью. Выровненная память, меньше фрагментации.
  6. Пользовательские структуры данных (т.е. без STL, относительно минимальное количество шаблонов).
  7. Сборка местами, в основном для SIMD.
3 голосов
/ 07 февраля 2010

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

...