Di tempat saya bekerja, kami selalu menggunakan beberapa tingkat profil; jika Anda melihat masalah, Anda hanya perlu sedikit ke bawah daftar sampai Anda mengetahui apa yang terjadi:
- "Profiler manusia", alias hanya bermain game ; apakah itu terasa lambat atau "hambatan" sesekali? Melihat animasi tersentak-sentak? (Sebagai pengembang, perhatikan bahwa Anda akan lebih peka terhadap beberapa jenis masalah kinerja dan tidak memperhatikan yang lain. Rencanakan pengujian tambahan yang sesuai.)
- Nyalakan tampilan FPS , yang merupakan jendela geser rata-rata 5 detik FPS. Sangat sedikit overhead untuk dihitung dan ditampilkan.
- Nyalakan bilah profil , yang hanya serangkaian paha depan (warna ROYGBIV) yang mewakili berbagai bagian bingkai (mis. Vblank, preframe, pembaruan, tabrakan, render, postframe) menggunakan timer "stopwatch" sederhana di sekitar setiap bagian kode . Untuk menekankan apa yang kami inginkan, kami menetapkan satu bar lebar layar untuk mewakili bingkai target 60Hz, sehingga sangat mudah untuk melihat apakah Anda mis. 50% di bawah anggaran (hanya setengah bar) atau 50% lebih dari ( batang membungkus dan menjadi satu setengah batang). Ini juga cukup mudah untuk mengetahui apa yang umumnya memakan sebagian besar frame: red = render, yellow = update, dll ...
- Bangun instrumen khusus yang memasukkan "stopwatch" seperti kode di sekitar setiap fungsi. (Perhatikan bahwa Anda dapat mengambil hit kinerja, dcache, dan icache besar-besaran ketika melakukan ini, jadi itu pasti mengganggu. Tetapi jika Anda tidak memiliki profiler pengambilan sampel yang tepat atau dukungan yang layak pada CPU, ini adalah pilihan yang dapat diterima. Anda juga bisa menjadi pintar tentang merekam minimal data pada fungsi, masuk / keluar dan membangun kembali jejak panggilan nanti.) Ketika kami membangun milik kami, kami menirukan banyak format output gprof .
- Yang terbaik dari semuanya, jalankan sampling profiler ; VTune dan CodeAnalyst tersedia untuk x86 dan x64, Anda memiliki berbagai simulasi atau lingkungan emulasi yang mungkin memberi Anda data di sini.
(Ada kisah menyenangkan dari GDC tahun lalu tentang seorang programmer grafis yang mengambil empat gambar dirinya - bahagia, acuh tak acuh, jengkel, dan marah - dan menampilkan gambar yang sesuai di sudut internal builds berdasarkan framerate. The pembuat konten dengan cepat belajar untuk tidak mengaktifkan shader yang rumit untuk semua objek dan lingkungan mereka: mereka akan membuat programmer marah. Lihatlah kekuatan umpan balik.)
Perhatikan bahwa Anda juga dapat melakukan hal-hal menyenangkan seperti membuat grafik "bilah profil" terus menerus, sehingga Anda dapat melihat pola lonjakan ("kami kehilangan bingkai setiap 7 frame") atau sejenisnya.
Namun, untuk menjawab pertanyaan Anda secara langsung: dalam pengalaman saya, sementara itu menggoda (dan seringkali bermanfaat - saya biasanya belajar sesuatu) untuk menulis ulang fungsi / modul tunggal untuk mengoptimalkan jumlah instruksi atau kinerja icache atau dcache, dan kami benar-benar perlu melakukan ini kadang-kadang ketika kita punya masalah kinerja yang sangat menjengkelkan, sebagian besar masalah kinerja yang kita tangani secara teratur datang ke desain . Sebagai contoh:
- Haruskah kita cache dalam RAM atau memuat ulang dari frame animasi "serangan" negara untuk pemain? Bagaimana dengan setiap musuh? Kami tidak memiliki RAM untuk melakukan semuanya, tetapi beban disk mahal! Anda dapat melihat halangan jika 5 atau 6 musuh yang berbeda muncul sekaligus! (Oke, bagaimana dengan pemijahan yang mengejutkan?)
- Apakah kita melakukan satu jenis operasi di semua partikel, atau semua operasi di satu partikel? (Ini adalah tradeoff icache / dcache, dan jawabannya tidak selalu jelas.) Bagaimana kalau memisahkan semua partikel dan menyimpan posisi bersama-sama ("struct of arrays" yang terkenal)) vs. menjaga semua data partikel di satu tempat (" array struct ").
Anda mendengarnya sampai menjadi menjengkelkan di setiap program ilmu komputer tingkat universitas, tetapi: itu benar-benar tentang struktur data dan algoritma. Menghabiskan waktu pada algoritma dan desain aliran data akan membuat Anda mendapatkan lebih banyak uang secara umum. (Pastikan Anda telah membaca Kesulitan Pemrograman Berorientasi Objek slide rekan Layanan Pengembang Sony untuk beberapa wawasan di sini.) Ini tidak "terasa" seperti optimisasi; sebagian besar waktu dihabiskan dengan papan tulis atau alat UML atau membuat banyak prototipe, daripada membuat kode saat ini berjalan lebih cepat. Tetapi secara umum jauh lebih bermanfaat.
Dan heuristik lain yang bermanfaat: jika Anda dekat dengan "inti" mesin Anda, mungkin perlu upaya dan percobaan ekstra untuk mengoptimalkan (misalnya, vektorkan matriks yang berlipat ganda itu!). Semakin jauh dari inti, semakin sedikit Anda harus khawatir tentang itu kecuali salah satu alat profil Anda memberi tahu Anda sebaliknya.