* Artikel ini adalah hasil kerja sama dengan Intel Developer Zone. Artikel asli bisa dilihat di link ini.
Istriku baru saja membeli sebuah buku tebal nan mahal. Sebagai seorang pendiagnosa ultrasonik anak, dia beli banyak buku, tapi yang satu ini membuat saya bingung. Bukunya berjudul “Ultrasound Anatomy of the Healthy Child”. Mengapa dia butuh buku yang hanya menunjukkan anak sehat? Saya tanya dia dan dengan sederhana jawabnya: untuk mendiagnosa penyakit apapun, bahkan yang belum dikenali sekalipun, kau harus tahu anak yang sehat itu seperti apa.
Dalam artikel ini, kita akan bertindak seperti dokter, menganalisa dan membandingkan aplikasi yang sehat dan yang tidak sehat.
Tok – tok – tok.
Sang dokter menjawab: “Tidak dikunci, silakan masuk.”
Masuklah pasien kita ke dalam, Warior Wave, sebuah game mengagumkan di mana tanganmu berubah menjadi jalanan yang dilalui oleh para prajurit. Sangat menyenangkan untuk dimainkan, inovatif, dan menggunakan teknologi Intel RealSense.
Namun ketika memainkannya terasa ada sesuatu yang hilang. Sesuatu yang belum pernah terasa sebelumnya pada permainan lain berbasis teknologi Intel RealSense. Penyebab masalahnya bisa saja banyak hal tapi apa masalahnya pada kasus ini?
Seperti dokter handal lainnya dengan peralatan analisa terbaru dan terhebat untuk menemukan masalah, kita punya alat yang sempurna untuk menganalisa pasien kita.
Menggunakan Platform Analyzer dari Intel Graphics Performance Analyzer (Intel GPA), kita menerima tampilan time-line dari aplikasi kita termasuk beban CPU, frame time, frame per detik (FPS), dan panggilan penggambaran objek:
Coba kita tengok.
Hmm… hal pertama yang menarik adalah adanya lonjakan FPS terus menerus secara periodik atau secara berkala. Semuanya hanya berjalan lancar rata-rata selama ~200 milidetik dan naik turun beberapa kali.
Untuk perbandingan, coba kita lihat rekam jejak FPS di bawah. Permainan dalam rekam jejak di bawah ini terasa halus dan dapat dimainkan dengan baik.
Tak ada pola yang muncul dalam frame time, hanya deviasi acak yang normal.
Tapi dalam kasus kita ada gejolak terus menerus. Gejolak ini terjadi sekitar empat kali per detik. Coba kita lacak masalahnya lebih dalam, dengan memperbesar pada salah satu titik anjlok dan melihat apa yang terjadi pada thread-nya:
Kita bisa lihat bahwa thread kerja 2780 menghabiskan banyak waktu untuk sinkronisasi. Persebaran tersebut hampir sama sekali tidak melakukan apa pun melainkan hanya menunggu frame berikutnya dari Intel RealSense SDK:
Pada saat yang sama, kita melihat bahwa proses rendering berlangsung pada thread kerja yang lain. Jika kita geser ke bawah, kita temukan thread 2372.
Alih-alih “aktif” menunggu frame berikutnya dari Intel RealSense SDK, game-nya mampu melakukan pekerjaan yang bermanfaat. Pekerjaan menggambar dan Intel RealSense SDK dapat dikerjakan pada satu thread, bukan dua, tapi satu thread kerja yang sama, menyederhanakan lajur komunikasi.
Melimpahnya komunikasi antar thread dapat menurunkan eksekusi secara drastis dan menyebabkan banyak masalah.
Ini adalah contoh dari sebuah game yang “sehat”, di mana proses kerja Intel RealSense SDK dan panggilan DirectX berada pada satu thread.
Ahli RealSense mengatakan: tidak ada gunanya menunggu frame dari Intel RealSense SDK. Mereka tidak akan siap lebih cepat lagi.
Tetapi kita dapat melihat bahwa persoalan utama ada di bagian atas timeline.
Umumnya, lima dari enam frame CPU tidak dihasilkan di frame GPU. Inilah mengapa adanya frame rate GPU yang lamban dan ganjil yang pada umumnya berlangsung kurang dari 16 FPS.
Sekarang mari kita tengok pipeline untuk mencoba dan memahami bagaimana kode dieksekusi. Lihatlah jumlah berkas pada “Engine 0”, salurannya penuh sampai ujung tetapi eksekusinya hampir sama sekali kosong.
Otak kita dapat mengolah 10 – 12 gambar terpisah per detik, memahaminya satu per satu. Ini menjelaskan mengapa film pertama dibagi per 16 FPS: ini adalah ambang batas rata-rata dimana kebanyakan orang berhenti melihat sesuatu sebagai slide show dan mulai melihatnya sebagai film.
Sekali lagi, mari kita lihat profil dari permainan yang baik:
Perhatikan bahwa frame GPU mengikuti frame CPU dengan perubahan kecil. Untuk setiap frame CPU, terdapat GPU terkait yang memulai eksekusi setelah penundaan kecil.
Mari kita coba pahami mengapa permainan kita tidak memiliki pola ini.
Pertama, ayo kita periksa panggilan DirectX. Yang perlu diperhatikan berdasarkan acuan tooltip di atas adalah satu area yang disebut sebagai panggilan “Present” kita yang mengirimkan frame rampung ke GPU. Pada screenshot di atas, kita lihat bahwa hal tersebut kemudian menghasilkan paket “Present”di atas saluran GPU (tertandai X).
Pada kisaran tertanda 2215ms, terjadi pergeseran mendekati eksekusi melampaui lebih dari 3 titik. Tapi pada 2231ms kemudian menghilang begitu saja tanpa menuntaskan eksekusi.
Dan apabila kita perhatikan pada tiap panggilan yang ada dalam rekam jejak, tidak ada satu panggilan pun yang sukses mencapainya sampai eksekusi.
Persoalan: Bagaimana bisa game menggambar sendiri jika semua panggilan DirectX Present diabaikan? Bagusnya kita punya alat yang bagus untuk mendapatkan jawabannya. Mari kita perhatikan.
Dapatkah kamu melihat sesuatu yang janggal dalam lingkaran kelabu? Kita bisa lihat di sini bahwa paket yang ada, yang bukan dihasilkan oleh panggilan DirectX manapun dari kode kita, masih bisa mencapai sampai eksekusi terlaksana, cepat dan tidak beraturan. Tapi, tunggu dulu!!!
Coba kita perhatikan paket kita lebih dekat lagi
Dan sekarang kita beralih ke paket yang telah tereksekusi.
Wow! Datangnya dari thread EKSTERNAL. Apakah artinya ini? Thread eksternal adalah thread yang bukan berasal dari game.
Paket kami sendiri bisa diabaikan, tetapi thread eksternal menarik permainan kami? Hei, alat ini jadi gila!
Tidak, gambarnya memang benar. Penjelasannya ada pada sistem Windows (sejak Windows Vista). Terdapat sebuah program yang dikenal sebagai Dekstop Window Manager (DWM) yang benar-benar mengkomposisikan layar. Paket-paketnya lah yang kita lihat mengeksekusi dengan tingkatan cepat berprioritas tinggi. Dan tidak, paket kita tidaklah hilang—mereka terhalang oleh DWM guna menghasilkan gambar akhir.
Namun mengapa ada keterlibatan DWM dalam permainan full-screen? Usai merenung sejenak, saya baru sadar akan jawaban sederhana: saya mengatur layar monitor ganda untuk dekstop saya. Mematikan layar monitor kedua saya dari pandangan membuat game Warrior Wave beraksi seperti game lainnya: GPU FPS normal, tanpa cacat, juga tanpa paket DWM.
Pasiennya sembuh! Leganya!
Namun permainan lainnya tetap berjalan mulus meskipun terkonfigurasi untuk layar monitor gandar, bukan begitu (bisikan halus berkata dari balik kepala saya)?
Lebih lanjut lagi, kita membutuhkan peralatan lain guna mengatasinya. Intel GPA Platform Analyzer memudahkan kamu untuk melihat bagaimana CPU serta GPU yang memakan waktu lama ketika mengeksekusi, tetapi belum bisa memberikan rincian tingkat terendah dari tiap frame.
Kita perlu melihat lebih dekat pada kode pembuat perangakt Direct3D. Untuk ini kita bisa menggunakan Intel GPA Frame Analyzer untuk DirectX, namun ini adalah topik untuk artikel lain.
Ayo kita ulas kembali yang kita telah bahas:
Dalam penelusuran ini kita dapat menemukan thread kurang bermanfaat yang kemudian membuat anjlokan FPS serta masalah DWM yang menyebalkan dengan mudahnya dapat diatasi dengan mematikan layar monitor kedua dari tayangan dekstop.
Kesimpulan: Intel GPA Platform Analyzer wajib dimiliki untuk memulai penelusuran suatu masalah. Biasakanlah memakainya dan tambahkan ke dalam toolbox perkakas kamu.
Tentang Penulis
Alexander Raud bekerja dengan tim Intel Graphics Performance Analyzers di Rusia serta pernah bekerja di Vtune Amplifier sebelumnya. Alex berkewarganegaraan ganda baik di Rusia dan di Uni Eropa, fasih berbicara Rusia, Inggris, sedikit Perancis, dan sedang pelajari Spanyol. Alex memiliki seorang istri dan dua anak serta masih bermain Progressive Metal secara profesional juga sebagai kepala di Kementrian Internasional Jesus Embassy Church.
* Artikel ini adalah hasil kerja sama dengan Intel Developer Zone. Artikel asli bisa dilihat di link ini.