Почему игры не используют шаблоны выражений для математики?
Я могу представить, что шаблоны выражений делают ужасные вещи, чтобы компилировать время для таких распространенных вещей, как векторы / матрицы / кватернионы и т. Д., Но если это такой большой прирост скорости, почему игры не используют его? Совершенно очевидно, что инструкции SIMD могут использовать параллелизм на уровне данных с большим эффектом. Шаблоны выражений и ленивая оценка вместе, кажется, имеют смысл, по крайней мере, когда дело доходит до устранения временных.
Таким образом, хотя такие библиотеки, как Eigen, рекламируют такие функции, я не вижу, чтобы это делалось обычно в промежуточном программном обеспечении (например, Havok) или играх, в которых критически важны скорости. Может кто-нибудь пролить некоторый свет на это? Связано ли это с недетерминизмом или предсказанием ветвлений?
2 ответа
Я могу придумать много причин:
- это больно во время компиляции. Более длительное время компиляции означает, что тестирование любых изменений, внесенных в код, занимает больше времени. Вредит производительности.
- это сложно. Скорее всего, многие разработчики в команде не знакомы с шаблонами выражений, и им будет сложно читать и отлаживать их.
- Игры часто должны работать на нескольких платформах с различными компиляторами, которые могут иметь широкий диапазон недостатков, что может, например, затруднить продвинутую хитрость шаблона.
- Это вообще не обязательно. Вы можете написать эффективный код без шаблонов выражений. Он становится более многословным, и вам придется больше держаться за компилятор.
- Разработчики игр крайне скептически относятся ко всему, что еще не использовалось в играх 10 лет назад. Не так давно несколько крупных разработчиков придерживались C: не потому, что C++ был недостаточно хорош, а потому, что он был "новым". Разработчики игр чертовски консервативны.
И конечно, очевидный вопрос: где они будут использовать шаблоны выражений? Достаточно ли сложна математика, чтобы сделать ее стоящей? Игры, как правило, полагаются на довольно небольшое количество операций линейной алгебры, которые в любом случае обычно настраиваются вручную.
Я хочу добавить еще одну причину, не указанную в приведенных выше ответах. Извините, если это так, и я пропустил это.
Добавление шаблонов к математическим классам, таким как класс vec3, может изменить значение операторов и привести к функциям, которые недопустимы для некоторых типов шаблонов.
Взять, к примеру,
vec3<int> myVec( 3, 5, 4 );
myVec.Normalize();
Что бы нормализовать для целочисленного вектора? Внезапно, когда мы добавляем шаблоны к математическим конструкциям, мы делаем недействительными многие существующие функции, такие как пример, описанный выше.
Кроме того, стоит упомянуть еще одну вещь: многие математические конструкции оптимизированы для определенных типов, потому что оптимизация так важна в играх. GPU - это вычислительные машины с плавающей запятой. Двойники занимают вдвое больше места, чем числа с плавающей запятой, и их вычисления немного медленнее, хотя это может показаться очевидным вариантом использования для нового разработчика игр.
Надеюсь, этот пример имеет смысл. Шаблоны - отличный инструмент, но математические конструкции в играх просто не подходящее место для их использования.
Обычно части игры, которые чувствительны к производительности и тяжелы по математике и все еще имеют тенденцию работать на процессоре, а не на графическом процессоре, применяют одни и те же основные операции к большому количеству элементов. Некоторые примеры - смешивание анимации, физические расчеты, тесты видимости и т. Д.
Наилучший подход к оптимизации проблем такого рода на текущем оборудовании консоли, как правило, состоит в том, чтобы попытаться объединить как можно больше совместной работы и стремиться к максимальной локализации данных, чтобы избежать дорогостоящих промахов кэша. Фактическая математика может быть затем оптимизирована с использованием встроенных SIMD и, как правило, будет тщательно оптимизирована вручную. Оптимизацию, которую дают вам шаблоны выражений, можно относительно легко выполнить на этом этапе оптимизации рук, но есть и другие важные оптимизации, которые также могут быть выполнены, что шаблоны выражений вам не дадут. Часто этот критический код будет содержать разделы с пользовательскими оптимизациями для каждой целевой платформы и не будет очень переносимым.
Я думаю, что причина того, что шаблоны выражений не используются широко, заключается в том, что они добавляют сложность программного обеспечения (по всем причинам, описанным jalf) к не критичному к производительности коду, который на самом деле не гарантирует его, не покрывая при этом все оптимизации, необходимые для действительно критичный к производительности код, который отображается вверху профилей.