Вопрос

Я кодирую игру, и очень важно делать расчеты скорости в рендеринговой коде.

Как я могу получить скорость некоторых операций?

Например, как узнать, будет ли умножение быстрее, чем SQRT и т. Д.? Или я должен сделать тесты и рассчитать время.

Язык программирования C ++, спасибо.

Это было полезно?

Решение

Этот вид микрооптимизации-это то, что нужно тратить время на минимальное усиление.

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

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

Смотрите также Эта несколько связанная ветка.

Другие советы

Определение скорости конкретной операции часто известно как профилирование. Лучшее решение для профилирования операции - использовать профилировщик. Visual Studio имеет хороший профилировщик. Linux имеет gprof Анкет Если у вашего компилятора нет профилировщика, возможно, стоит купить компилятор, который делает, если вы часто профилируете свой код.

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

Проверь это Для кодов некоторых профилировщиков.

Лучше всего использовать инструмент, такой как AQTime, и выполнить профилирование. Тогда вы узнаете, где потратить свое время на оптимизацию. Но делать это преждевременно или основываясь на догадке, вероятно, не получит вас много, и просто усложнит ваш код или что -то сломать. Лучше всего вывести любые расчеты с плавающей запятой, особенно SIN, COS и THE, и SQRT из любых петлей, если можете.

Однажды у меня было что -то вроде этого:

for i = 0 to nc
  for j = 0 to nc
      aij = sqrt(a[i]*b[j])

которые вычисляют квадратные корни NC*NC. Но так как SQRT (a*b) равен SQRT (a)*SQRT (b), вы можете предварительно выпустить квадратные корни для всех A и B заранее, так что цикл затем становится тем, что показано ниже. Таким образом, вместо квадратных корней NC*NC у вас есть 2*квадратных корней NC.

for i = 0 to nc
  for j = 0 to nc
      aij = asqrt[i]*bsqrt[j]

Вопрос, который вы задаете, сильно зависит от платформы, которую вы разрабатываете на уровне оборудования. Мало того, что будут различия между различными чипсетами (Intel / AMD), но также будут вариации на платформе (я подозреваю, что у iPhone не так много инструкций по выполнению определенных вещей быстрее).

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

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

В игре, которую мы разрабатываем для iPhone, единственное, что я имел в виду, это то, что большие математические операции (SQRT) являются медленными (не базовыми математиками), и что для петли, которые запускают каждый кадр, могут быстро быстро Ешьте процессор. Имея это в виду, нам не пришлось оптимизировать ни одного кода - так как все в любом случае работает со скоростью 60 кадров в секунду - поэтому я рад, что не беспокоился об этом в начале.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top