Де я працював, ми завжди використовуємо кілька рівнів профілювання; якщо ви бачите проблему, просто перемістіть список трохи більше, поки не з’ясуєте, що відбувається:
- "Профілер людини", він просто грає в гру ; відчуваєш себе повільно чи «зачепиш» час від часу? Помічаєте ривкові анімації? (Зауважте, як розробник, ви будете більш чутливі до деяких видів продуктивності та не звертаєте уваги на інші. Плануйте додаткові тестування відповідно.)
- Увімкніть FPS-дисплей , який є середньою секундою FPS з розсувним вікном. Дуже невеликі накладні витрати для обчислення та відображення.
- Увімкніть смуги профілів , що представляють собою лише серію квадроциклів (кольори ROYGBIV), які представляють різні частини кадру (наприклад, vblank, попередній кадр, оновлення, зіткнення, візуалізація, пост кадр), використовуючи простий таймер "секундомір" навколо кожного розділу коду . Для того, щоб підкреслити те, що ми хочемо, ми встановили, що ширина екрана, що стоїть на барі, повинна бути репрезентативною для цільового кадру 60 Гц, тож насправді легко зрозуміти, чи є ви, наприклад, на 50% за бюджетом (лише півбар) або на 50% більше ( брусок загортається і стає півтора бруска). Також досить легко сказати, що зазвичай їсть більшу частину кадру: червоний = візуалізація, жовтий = оновлення тощо ...
- Створіть спеціальну інструментальну збірку, яка вставляє «секундомір» як код навколо кожної функції. (Зверніть увагу, що при цьому ви можете отримати величезну продуктивність, дкаш та ікаче, тому це, безумовно, нав'язливо. Але якщо вам не вистачає належного профіля вибірки або гідної підтримки процесора, це прийнятний варіант. Ви також можете бути розумними. про записи мінімум даних про функції входу / виходу та відновлення calltraces пізніше.) Коли ми побудували наш, ми імітували багато дргоЕ «s формат виведення.
- Найкраще запустити пробірник вибірки ; VTune та CodeAnalyst доступні для x86 та x64, у вас є різні імітаційні та емуляційні середовища, які можуть давати вам тут дані.
(Там є весела історія минулого року GDC графічного програміста, який зробив чотири фотографії - щасливих, байдужих, роздратованих та розлючених - та показав відповідну картину в кутку внутрішніх побудов на основі кадрів. творці вмісту швидко навчилися не вмикати складні шейдери для всіх своїх об'єктів та оточуючих середовищ: вони розлютять програміста. Отримайте силу зворотного зв'язку.)
Зауважте, що ви також можете робити цікаві речі, такі як графік "профільних смуг" постійно, так що ви можете бачити схеми шипів ("ми втрачаємо кадр кожні 7 кадрів") тощо.
Однак, щоб відповісти на ваше запитання безпосередньо: з мого досвіду, хоча це спокусливо (і часто корисне - я зазвичай щось вчу) переписати окремі функції / модулі, щоб оптимізувати кількість інструкцій або продуктивність icache чи dcache, і ми насправді це потрібно робити Іноді, коли ми стикаємося з особливо неприємною продуктивністю, переважна більшість питань щодо продуктивності, якими ми регулярно займаємось, приходить до розробки . Наприклад:
- Чи слід кешувати оперативну пам’ять або перезавантажувати з диска кадри анімації стану «атаки» для програвача? Як щодо кожного ворога? У нас немає оперативної пам’яті, щоб зробити їх усі, але завантаження диска дорого! Ви можете бачити, що хитне, якщо одразу вискочить 5 чи 6 різних ворогів! (Гаразд, як щодо приголомшливого нересту?)
- Ми робимо один тип операцій над усіма частинками або всі операції над однією частинкою? (Це компроміс ікаче / дкаш, і відповідь не завжди зрозуміла.) Як щодо того, щоб роз'єднати всі частинки і зберегти позиції разом (знаменита "структура масивів") проти збереження всіх даних про частинки в одному місці (" масив структур »).
Ви чуєте це, поки не стане неприємно на будь-яких курсах інформатики університетського рівня, але: це дійсно все про структури даних та алгоритми. Витративши деякий час на розробку алгоритму та потоку даних, ви отримаєте більше грошей на долар в цілому. (Переконайтесь, що ви прочитали чудові підводні камені об'єктно-орієнтованого програмування слайдів від колеги Sony Developer Services для ознайомлення тут.) Це не "відчуває" оптимізацію; в основному це витрачено час на дошку чи інструмент UML або на створення багатьох прототипів, а не на те, щоб поточний код запускався швидше. Але це взагалі набагато доцільніше.
І ще одна корисна евристика: якщо ви близькі до «ядра» вашого двигуна, можливо, варто докласти додаткових зусиль та експериментів для оптимізації (наприклад, векторизуйте ці матричні множення!). Чим далі від основної, тим менше ви повинні турбуватися про це, якщо один із ваших інструментів профілювання не скаже вам про інше.