Bagikan melalui


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 swap adalah serangkaian buffer yang ditampilkan 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 robek dan memungkinkan animasi yang lebih halus.

Setiap perangkat yang dibuat di Direct3D memiliki setidaknya satu rantai pertukaran. Ketika 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::Present untuk meminta operasi pembalikan permukaan, pointer untuk memori permukaan untuk buffer depan dan buffer belakang ditukar. Membalik dilakukan dengan mengalihkan penunjuk yang digunakan perangkat layar untuk mengacu pada memori, bukan dengan menyalin memori layar. Saat rantai flipping mengandung buffer depan dan lebih dari satu buffer belakang, penunjuk dialihkan dalam pola melingkar, seperti yang ditunjukkan pada diagram berikut.

diagram rantai putar dengan buffer depan dan dua buffer belakang

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

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

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

Penting untuk dicatat perbedaan antara "operasi membalik", seperti yang dilakukan oleh driver adaptor tampilan, dan operasi "Present" yang diterapkan pada "swap chain" yang dibuat dengan D3DSWAPEFFECT_FLIP.

Istilah "flip" secara konvensional menunjukkan operasi yang mengubah rentang alamat memori video yang digunakan oleh adaptor tampilan untuk menampilkan sinyal keluarannya, sehingga menyebabkan konten penyimpan buffer belakang yang sebelumnya tersembunyi ditampilkan. Dalam Direct3D 9, istilah ini sering digunakan secara lebih umum untuk menggambarkan tampilan 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 flipping 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 efek pertukaran yang berbeda untuk rantai pertukaran berjendela dan layar penuh, lihat D3DSWAPEFFECT.

Permukaan Direct3D