Struktur D3DPRESENTSTATS
Menjelaskan statistik swapchain yang berkaitan dengan panggilan PresentEx .
Sintaks
typedef struct _D3DPRESENTSTATS {
UINT PresentCount;
UINT PresentRefreshCount;
UINT SyncRefreshCount;
LARGE_INTEGER SyncQPCTime;
LARGE_INTEGER SyncGPUTime;
} D3DPRESENTSTATS;
Anggota
-
PresentCount
-
Jenis: UINT
-
Jumlah panggilan Present yang berhasil yang berhasil dilakukan oleh perangkat tampilan yang saat ini keluaran ke layar. Parameter ini benar-benar ID Saat Ini dari panggilan Saat ini terakhir dan belum tentu jumlah total panggilan PRESENT API yang dilakukan.
-
PresentRefreshCount
-
Jenis: UINT
-
Jumlah vblank di mana Present terakhir ditampilkan di layar, jumlah vblank bertambah sekali setiap interval vblank.
-
SyncRefreshCount
-
Jenis: UINT
-
Jumlah vblank saat penjadwal terakhir kali mengambil sampel waktu komputer dengan memanggil QueryPerformanceCounter.
-
SyncQPCTime
-
Jenis: LARGE_INTEGER
-
Waktu mesin sampel terakhir penjadwal, diperoleh dengan memanggil QueryPerformanceCounter.
-
SyncGPUTime
-
Jenis: LARGE_INTEGER
-
Nilai ini tidak digunakan.
Keterangan
Ketika aplikasi 9Ex mengadopsi Mode Balik yang ada (D3DSWAPEFFECT_FLIPEX), aplikasi dapat mendeteksi bingkai yang dihilangkan dengan memanggil GetPresentStatistics kapan saja. Akibatnya, mereka dapat melakukan hal berikut.
- Render ke buffer belakang
- Panggilan Ada
- Panggil GetPresentStats dan simpan struktur D3DPRESENTSTATS yang dihasilkan
- Merender bingkai berikutnya ke buffer belakang
- Panggilan Ada
- Ulangi langkah 4 dan 5 satu atau beberapa kali
- Panggil GetPresentStats dan simpan struktur D3DPRESENTSTATS yang dihasilkan
- Bandingkan nilai PresentRefreshCount dari dua struktur D3DPRESENTSTATS yang disimpan. Aplikasi dapat menghitung PresentRefreshCount yang sesuai dari parameter PresentCount tertentu berdasarkan asumsi kenaikan PresentRefreshCount dan penetapan PresentCount dari bingkai yang ada. Jika sampel terakhir PresentRefreshCount tidak cocok dengan PresentCount (yaitu jika PresentRefreshCount telah bertahap tetapi PresentCount belum, maka ada bingkai yang menjatuhkan.)
Aplikasi dapat menentukan apakah bingkai telah dihilangkan dengan mengambil sampel dua instans PresentCount dan GetPresentStats (dengan memanggil GetPresentStats API pada dua titik waktu). Misalnya, aplikasi media yang menyajikan pada tingkat yang sama dengan kecepatan refresh monitor (misalnya, laju refresh monitor adalah 60Hz, aplikasi menyajikan bingkai setiap 1/60 detik) ingin menyajikan bingkai A, B, C, D, E, masing-masing sesuai dengan ID Present (PresentCount) 1, 2, 3, 7, 8.
Kode aplikasi terlihat seperti urutan berikut.
- Merender bingkai A ke buffer belakang
- Panggil Present, PresentCount = 1
- Panggil GetPresentStats dan simpan struktur D3DPRESENTSTATS yang dihasilkan
- Render 4 bingkai berikutnya, B, C, D, E, masing-masing
- Panggilan Hadir 4 kali, PresentCounts = 2, 3, 7, 8, masing-masing
- Panggil GetPresentStats dan simpan struktur D3DPRESENTSTATS yang dihasilkan
- Bandingkan nilai PresentRefreshCount dari dua struktur D3DPRESENTSTATS yang disimpan. Jika perbedaannya adalah 2, yaitu 2 interval vblank telah berlalu antara dua panggilan API GetPresentStats, maka bingkai terakhir yang disajikan harus bingkai C. Karena aplikasi menyajikan interval yang sangat vblank sekali (laju refresh monitor), waktu berlalu antara ketika bingkai A disajikan dan ketika bingkai C disajikan harus 2 vblanks.
- Bandingkan nilai PresentCount dari dua struktur D3DPRESENTSTATS yang disimpan. Jika PresentCount pertama adalah 1 (sesuai dengan bingkai A) dan PresentCount kedua adalah 3 (sesuai dengan bingkai C), maka tidak ada bingkai yang telah dihilangkan. Jika PresentCount kedua adalah 3, yang sesuai dengan bingkai D, maka aplikasi tahu bahwa satu bingkai telah dihilangkan.
Perhatikan bahwa GetPresentStatistics akan diproses setelah dipanggil, terlepas dari status panggilan PresentEx mode FLIPEX.
Windows Vista: Panggilan Saat ini akan diantrekan lalu diproses sebelum panggilan GetPresentStats akan diproses.
Ketika aplikasi mendeteksi bahwa presentasi bingkai tertentu berada di belakang, aplikasi dapat melewati bingkai tersebut dan memperbaiki presentasi untuk disinkronkan kembali dengan vblank. Untuk melakukan ini, aplikasi tidak dapat merender bingkai akhir dan mulai merender dengan bingkai yang benar berikutnya dalam antrean. Namun, jika aplikasi telah memulai penyajian bingkai terlambat, aplikasi dapat menggunakan parameter Present baru di D3D9Ex yang disebut D3DPRESENT_FORCEIMMEDIATE. Bendera akan diteruskan dalam parameter panggilan PRESENT API dan menunjukkan kepada runtime bahwa bingkai akan segera diproses dalam interval vblank berikutnya, secara efektif tidak terlihat di layar sama sekali. Berikut adalah contoh penggunaan aplikasi setelah langkah terakhir dalam contoh sebelumnya.
- Merender bingkai berikutnya ke buffer belakang
- Temukan dari PresentRefreshCount bahwa bingkai berikutnya sudah terlambat
- Atur Interval Sajikan ke D3DPRESENT_FORCEIMMEDIATE
- Panggilan Ada pada bingkai berikutnya
Aplikasi dapat menyinkronkan aliran video dan audio dengan cara yang sama karena perilaku GetPresentStatistics tidak berubah dalam skenario tersebut.
Mode Flip D3D9Ex menyediakan informasi statistik bingkai untuk aplikasi berjendela dan aplikasi 9Ex layar penuh.
Windows Vista: Gunakan API DWM untuk mengambil statistik saat ini.
Ketika Desktop Window Manager dimatikan, aplikasi 9Ex mode berjendela yang menggunakan mode balik akan menerima informasi statistik yang ada tentang akurasi terbatas.
Windows Vista:
Jika aplikasi tidak cukup cepat untuk mengikuti laju refresh monitor, mungkin karena perangkat keras yang lambat atau kurangnya sumber daya sistem, maka aplikasi dapat mengalami kesalahan grafis. Kesalahan adalah apa yang disebut hiccup visual. Jika monitor diatur untuk menyegarkan pada 60 Hz, dan aplikasi hanya dapat mengelola 30 fps, maka setengah dari bingkai akan mengalami gangguan.
Aplikasi dapat mendeteksi kesalahan dengan melacak SynchRefreshCount. Misalnya, aplikasi mungkin melakukan urutan tindakan berikut.
- Render ke buffer belakang.
- Panggil Ada.
- Panggil GetPresentStats dan simpan struktur D3DPRESENTSTATS yang dihasilkan.
- Render bingkai berikutnya ke buffer belakang.
- Panggil Ada.
- Panggil GetPresentStats dan simpan struktur D3DPRESENTSTATS yang dihasilkan.
- Bandingkan nilai SyncRefreshCount dari dua struktur D3DPRESENTSTATS yang disimpan. Jika perbedaannya lebih besar dari satu, maka bingkai dilewati.
Persyaratan
Persyaratan | Nilai |
---|---|
Header |
|
Lihat juga