Там, где я работал, мы всегда используем несколько уровней профилирования; если вы видите проблему, вы просто двигаетесь вниз по списку, пока не поймете, что происходит:
- «Профилировщик человека», он же просто играет в игру ; это чувствует себя медленным или "заминкой" иногда? Заметили отрывистую анимацию? (Как разработчик, обратите внимание, что вы будете более чувствительны к некоторым видам проблем с производительностью и не будете обращать внимания на другие. Планируйте дополнительное тестирование соответствующим образом.)
- Включите дисплей FPS , который является скользящим окном 5 секунд среднего FPS. Очень мало накладных расходов для расчета и отображения.
- Включите панели профиля , которые представляют собой просто серию четырехугольников (цвета ROYGBIV), которые представляют различные части кадра (например, vblank, preframe, update, collision, render, postframe), используя простой таймер «секундомера» вокруг каждой части кода , Чтобы подчеркнуть то, что мы хотим, мы устанавливаем значение ширины полосы в один экран в качестве репрезентативного для целевого кадра 60 Гц, поэтому очень легко увидеть, например, что у вас 50% бюджета (только половина полосы) или 50% ( бар оборачивается и становится полутора барами). Также довольно легко определить, что обычно ест большую часть кадра: красный = рендер, желтый = обновление и т. Д.
- Создайте специальную инструментальную сборку, которая вставляет код «секундомер» вокруг каждой функции. (Обратите внимание, что при этом вы можете сильно пострадать от производительности, dcache и icache, так что это определенно навязчиво. Но если вам не хватает соответствующего профилировщика выборки или приличной поддержки ЦП, это приемлемый вариант. Вы также можете быть умным о записи минимума данных о входе / выходе функции и перестроении calltraces позже.) Когда мы создавали наши, мы имитировали большую часть выходного формата gprof .
- Лучше всего запустить профилировщик выборки ; VTune и CodeAnalyst доступны для x86 и x64, у вас есть различные среды моделирования или эмуляции, которые могут предоставить вам данные здесь.
(Есть забавная история из прошлогоднего GDC о графическом программисте, который сделал четыре своих снимка - счастливый, равнодушный, раздраженный и злой - и показал соответствующую картинку в углу внутренних сборок на основе частоты кадров. Создатели контента быстро научились не включать сложные шейдеры для всех своих объектов и сред: они бы разозлили программиста. Вот сила обратной связи.)
Обратите внимание, что вы также можете делать забавные вещи, такие как непрерывное построение графиков «полосок профиля», чтобы вы могли видеть шаблоны пиков («мы теряем кадр каждые 7 кадров») или тому подобное.
Чтобы ответить на ваш вопрос напрямую, хотя: по моему опыту, хотя это заманчиво (и часто полезно - я обычно чему-то учусь), переписать отдельные функции / модули для оптимизации количества инструкций или производительности icache или dcache, и нам действительно нужно сделать иногда, когда у нас возникает особенно неприятная проблема с производительностью, подавляющее большинство проблем с производительностью, с которыми мы регулярно сталкиваемся, сводятся к проектированию . Например:
- Должны ли мы кэшировать в ОЗУ или перезагрузить с диска кадры анимации состояния «атаки» для игрока? Как насчет каждого врага? У нас нет оперативной памяти, чтобы сделать все это, но загрузка дисков стоит дорого! Вы можете видеть сцепление, если 5 или 6 различных врагов появляются одновременно! (Хорошо, а как насчет нереста?)
- Выполняем ли мы один тип операции для всех частиц или все операции для одной частицы? (Это компромисс между icache и dcache, и ответ не всегда ясен.) Как насчет разделения всех частиц и сохранения позиций вместе (известная «структура массивов») против хранения всех данных частиц в одном месте (» массив структур ").
Вы слышите это до тех пор, пока оно не станет неприятным на любых курсах информатики университетского уровня, но: это действительно все о структурах данных и алгоритмах. Потратив некоторое время на алгоритм и проектирование потока данных, вы получите больше отдачи в целом. (Убедитесь, что вы прочитали отличные слайды « Подводные камни объектно-ориентированного программирования» от сотрудника Sony Developer Services для некоторого понимания здесь.) Это не «похоже» на оптимизацию; это в основном время, проведенное с доской или инструментом UML или созданием многих прототипов, вместо того, чтобы заставить текущий код работать быстрее. Но это, как правило, гораздо более стоящее.
И еще одна полезная эвристика: если вы близки к «ядру» вашего движка, возможно, стоит потратить некоторые дополнительные усилия и эксперименты на оптимизацию (например, векторизация этих умножений матриц!). Чем дальше от ядра, тем меньше вы должны беспокоиться об этом, если один из ваших инструментов профилирования не скажет вам иначе.