Membalik Permukaan (Direct3D 9)

Aplikasi Direct3D biasanya menampilkan urutan animasi dengan menghasilkan bingkai animasi di buffer belakang dan menyajikannya secara berurutan. Buffer belakang diatur ke dalam rantai pertukaran. Rantai pertukaran adalah serangkaian buffer yang "membalik" ke layar satu demi satu. Ini dapat digunakan untuk merender satu adegan dalam memori dan kemudian membalik adegan ke layar saat penyajian selesai. Ini menghindari fenomena yang dikenal sebagai merobek dan memungkinkan animasi yang lebih halus.

Setiap perangkat yang dibuat di Direct3D memiliki setidaknya satu rantai pertukaran. Saat Anda menginisialisasi perangkat Direct3D pertama, Anda mengatur anggota BackBufferCount dari D3DPRESENT_PARAMETERS, yang memberi tahu Direct3D jumlah buffer belakang yang akan berada dalam rantai pertukaran. Panggilan ke IDirect3D9::CreateDevice kemudian membuat perangkat Direct3D dan rantai pertukaran yang sesuai.

Saat Anda menggunakan IDirect3DDevice9::P resent untuk meminta operasi pembalikan permukaan, penunjuk ke memori permukaan untuk buffer depan dan buffer belakang ditukar. Membalik dilakukan dengan beralih pointer yang digunakan perangkat tampilan untuk mereferensikan memori, bukan dengan menyalin memori permukaan. Saat rantai pembalikan berisi buffer depan dan lebih dari satu buffer belakang, penunjuk dialihkan dalam pola melingkar, seperti yang ditunjukkan pada diagram berikut.

diagram rantai membalik dengan buffer depan dan dua buffer belakang

Anda dapat membuat rantai pertukaran tambahan untuk perangkat dengan memanggil IDirect3DDevice9::CreateAdditionalSwapChain. Aplikasi dapat membuat satu rantai pertukaran per tampilan dan mengaitkan setiap rantai pertukaran dengan jendela tertentu. Aplikasi ini merender gambar di buffer belakang setiap rantai pertukaran, dan kemudian menyajikannya satu per satu. Dua parameter yang diambil IDirect3DDevice9::CreateAdditionalSwapChain adalah penunjuk ke struktur D3DPRESENT_PARAMETERS dan alamat penunjuk ke antarmuka IDirect3DSwapChain9 . Anda kemudian dapat menggunakan IDirect3DSwapChain9::P resent untuk menampilkan konten buffer belakang berikutnya ke buffer depan. Perhatikan bahwa perangkat hanya dapat memiliki satu rantai pertukaran layar penuh.

Anda dapat memperoleh akses ke buffer back tertentu dengan memanggil metode IDirect3DDevice9::GetBackBuffer atau IDirect3DSwapChain9::GetBackBuffer , yang mengembalikan pointer ke antarmuka IDirect3DSurface9 yang mewakili permukaan buffer kembali yang dikembalikan. Perhatikan bahwa memanggil metode ini meningkatkan jumlah referensi internal pada antarmuka IDirect3DDevice9 jadi pastikan untuk memanggil IUnknown ketika Anda selesai menggunakan permukaan ini atau Anda akan memiliki kebocoran memori.

Ingat, Direct3D membalik permukaan dengan menukar pointer memori permukaan dalam rantai pertukaran, bukan dengan menukar permukaan itu sendiri. Ini berarti Anda akan selalu merender ke buffer belakang yang akan ditampilkan berikutnya.

Penting untuk mencatat perbedaan antara "operasi membalik," seperti yang dilakukan oleh driver adaptor tampilan, dan operasi "Sekarang" yang diterapkan pada rantai pertukaran yang dibuat dengan D3DSWAPEFFECT_FLIP.

Istilah "balik" secara konvensional menunjukkan operasi yang mengubah rentang alamat memori video yang digunakan adaptor tampilan untuk menghasilkan sinyal outputnya, sehingga menyebabkan konten buffer belakang yang sebelumnya tersembunyi ditampilkan. Dalam Direct3D 9, istilah ini sering digunakan lebih umum untuk menggambarkan presentasi buffer belakang dalam rantai pertukaran apa pun yang dibuat dengan efek pertukaran D3DSWAPEFFECT_FLIP.

Meskipun operasi "Hadir" seperti itu hampir selalu diimplementasikan oleh operasi balik ketika rantai pertukaran adalah yang layar penuh, operasi tersebut selalu diimplementasikan oleh operasi salin ketika rantai pertukaran berjendela. Selain itu, driver adaptor tampilan dapat menggunakan membalik untuk mengimplementasikan operasi Present terhadap rantai pertukaran layar penuh berdasarkan D3DSWAPEFFECT_DISCARD dan D3DSWAPEFFECT_COPY.

Diskusi di atas berlaku untuk kasus yang umum digunakan dari rantai pertukaran layar penuh yang dibuat dengan D3DSWAPEFFECT_FLIP.

Untuk diskusi yang lebih umum tentang berbagai efek pertukaran untuk rantai pertukaran berjendela dan layar penuh, lihat D3DSWAPEFFECT.

Permukaan Direct3D