Enumerasi D3DSWAPEFFECT

Mendefinisikan efek pertukaran.

Sintaks

typedef enum D3DSWAPEFFECT { 
  D3DSWAPEFFECT_DISCARD      = 1,
  D3DSWAPEFFECT_FLIP         = 2,
  D3DSWAPEFFECT_COPY         = 3,
  D3DSWAPEFFECT_OVERLAY      = 4,
  D3DSWAPEFFECT_FLIPEX       = 5,
  D3DSWAPEFFECT_FORCE_DWORD  = 0xFFFFFFFF
} D3DSWAPEFFECT, *LPD3DSWAPEFFECT;

Konstanta

D3DSWAPEFFECT_DISCARD

Ketika rantai pertukaran dibuat dengan efek pertukaran D3DSWAPEFFECT_FLIP atau D3DSWAPEFFECT_COPY, runtime akan menjamin bahwa operasi IDirect3DDevice9::P resent tidak akan memengaruhi konten salah satu buffer belakang. Sayangnya, memenuhi jaminan ini dapat melibatkan memori video yang substansial atau overhead pemrosesan, terutama ketika menerapkan semantik flip untuk rantai pertukaran berjendela atau menyalin semantik untuk rantai pertukaran layar penuh. Aplikasi dapat menggunakan efek pertukaran D3DSWAPEFFECT_DISCARD untuk menghindari overhead ini dan untuk memungkinkan driver tampilan memilih teknik presentasi yang paling efisien untuk rantai pertukaran. Ini juga merupakan satu-satunya efek pertukaran yang dapat digunakan saat menentukan nilai selain D3DMULTISAMPLE_NONE untuk anggota MultiSampleType D3DPRESENT_PARAMETERS.

Seperti rantai pertukaran yang menggunakan D3DSWAPEFFECT_FLIP, rantai pertukaran yang menggunakan D3DSWAPEFFECT_DISCARD mungkin mencakup lebih dari satu buffer belakang, yang salah satunya dapat diakses menggunakan IDirect3DDevice9::GetBackBuffer atau IDirect3DSwapChain9::GetBackBuffer. Rantai pertukaran paling dibanggakan sebagai antrean di mana 0 selalu mengindeks buffer belakang yang akan ditampilkan oleh operasi Sekarang berikutnya dan dari mana buffer dibuang ketika mereka telah ditampilkan.

Aplikasi yang menggunakan efek pertukaran ini tidak dapat membuat asumsi apa pun tentang konten buffer belakang yang dibuang dan oleh karena itu harus memperbarui seluruh buffer belakang sebelum memanggil operasi Present yang akan menampilkannya. Meskipun ini tidak diberlakukan, versi debug runtime akan menimpa konten buffer belakang yang dibuang dengan data acak untuk memungkinkan pengembang memverifikasi bahwa aplikasi mereka memperbarui seluruh permukaan buffer belakang dengan benar.

D3DSWAPEFFECT_FLIP

Rantai pertukaran mungkin mencakup beberapa buffer belakang dan paling dibayangkan sebagai antrean melingkar yang mencakup buffer depan. Dalam antrean ini, buffer belakang selalu diberi nomor berurutan dari 0 hingga (n - 1), di mana n adalah jumlah buffer belakang, sehingga 0 menunjukkan buffer yang paling sedikit baru disajikan. Ketika Ada dipanggil, antrean "diputar" sehingga buffer depan menjadi buffer belakang (n - 1), sementara buffer belakang 0 menjadi buffer depan baru.

D3DSWAPEFFECT_COPY

Efek pertukaran ini hanya dapat ditentukan untuk rantai pertukaran yang terdiri dari satu buffer belakang. Apakah rantai pertukaran berjendela atau layar penuh, runtime akan menjamin semantik yang tersirat oleh operasi Present berbasis salinan, yaitu bahwa operasi membuat konten buffer belakang tidak berubah, alih-alih menggantinya dengan konten buffer depan sebagai operasi Present berbasis flip akan.

Untuk rantai pertukaran layar penuh, runtime menggunakan kombinasi operasi balik dan operasi salin, didukung jika perlu oleh buffer belakang tersembunyi, untuk menyelesaikan operasi Sekarang. Dengan demikian, presentasi disinkronkan dengan jejak vertikal adaptor tampilan dan lajunya dibatasi oleh interval presentasi yang dipilih. Rantai pertukaran yang ditentukan dengan bendera D3DPRESENT_INTERVAL_IMMEDIATE adalah satu-satunya pengecualian. (Lihat deskripsi anggota PresentationIntervals dari struktur D3DPRESENT_PARAMETERS .) Dalam hal ini, operasi Present menyalin konten buffer belakang langsung ke buffer depan tanpa menunggu pelacakan ulang vertikal.

D3DSWAPEFFECT_OVERLAY

Gunakan area khusus memori video yang dapat dilapisi pada permukaan utama. Tidak ada salinan yang dilakukan ketika overlay ditampilkan. Operasi overlay dilakukan dalam perangkat keras, tanpa memodifikasi data di permukaan utama.

Perbedaan antara Direct3D 9 dan Direct3D 9Ex:

  • D3DSWAPEFFECT_OVERLAY hanya tersedia di Direct3D9Ex yang berjalan pada Windows 7 (atau lebih sistem operasi saat ini).

D3DSWAPEFFECT_FLIPEX

Menunjuk ketika aplikasi mengadopsi mode flip, selama waktu itu bingkai aplikasi diteruskan alih-alih disalin ke Desktop Window Manager (DWM) untuk komposisi ketika aplikasi disajikan dalam mode berjendela. Mode balik memungkinkan aplikasi untuk lebih efisien menggunakan bandwidth memori serta memungkinkan aplikasi untuk memanfaatkan statistik layar penuh yang ada. Mode balik tidak memengaruhi perilaku layar penuh.

Catatan

Jika Anda membuat rantai pertukaran dengan D3DSWAPEFFECT_FLIPEX, Anda tidak dapat menimpa anggota hDeviceWindow dari struktur D3DPRESENT_PARAMETERS saat Anda menyajikan bingkai baru untuk ditampilkan. Artinya, Anda harus meneruskan NULL ke parameter hDestWindowOverride dari IDirect3DDevice9Ex::P resentEx untuk menginstruksikan runtime untuk menggunakan anggota D3DPRESENT_PARAMETERS hDeviceWindow untuk presentasi.

Perbedaan antara Direct3D 9 dan Direct3D 9Ex:

  • D3DSWAPEFFECT_FLIPEX hanya tersedia di Direct3D9Ex yang berjalan pada Windows 7 (atau lebih sistem operasi saat ini).

D3DSWAPEFFECT_FORCE_DWORD

Memaksa enumerasi ini untuk mengkompilasi ke ukuran 32 bit. Tanpa nilai ini, beberapa pengkompilasi akan memungkinkan enumerasi ini untuk dikompilasi ke ukuran selain 32 bit. Nilai ini tidak digunakan.

Keterangan

Status buffer belakang setelah panggilan ke Present didefinisikan dengan baik oleh masing-masing efek pertukaran ini, dan apakah perangkat Direct3D dibuat dengan rantai pertukaran layar penuh atau rantai pertukaran berjendela tidak berpengaruh pada status ini. Secara khusus, efek pertukaran D3DSWAPEFFECT_FLIP beroperasi sama baik berjendela atau layar penuh, dan runtime Direct3D menjamin ini dengan membuat buffer tambahan. Akibatnya, disarankan agar aplikasi menggunakan D3DSWAPEFFECT_DISCARD jika memungkinkan untuk menghindari penalti tersebut. Ini karena efek pertukaran ini akan selalu menjadi yang paling efisien dalam hal konsumsi dan performa memori.

Aplikasi yang menggunakan D3DSWAPEFFECT_FLIP atau D3DSWAPEFFECT_DISCARD seharusnya tidak mengharapkan alfa tujuan layar penuh berfungsi. Ini berarti bahwa status render D3DRS_DESTBLEND tidak akan berfungsi seperti yang diharapkan karena rantai pertukaran layar penuh dengan efek pertukaran ini tidak memiliki format piksel eksplisit dari sudut pandang driver. Driver menyimpulkan bahwa mereka harus mengambil format tampilan, yang tidak memiliki saluran alfa. Untuk mengatasi hal ini, lakukan langkah-langkah berikut:

  • Gunakan D3DSWAPEFFECT_COPY.
  • Periksa bendera D3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD di anggota Caps3 dari struktur D3DCAPS9 . Bendera ini menunjukkan apakah driver dapat melakukan penpaduan alfa saat D3DSWAPEFFECT_FLIP atau D3DSWAPEFFECT_DISCARD digunakan.
  • Aplikasi yang menggunakan efek pertukaran mode flip (D3DSWAPEFFECT_FLIPEX) harus memanggil PresentEx setelah perubahan ukuran jendela atau perubahan wilayah untuk memastikan bahwa konten tampilan diperbarui.

Jendela yang tidak terlihat tidak dapat menerima peristiwa mode pengguna; selain itu, jendela layar penuh yang tidak terlihat akan mengganggu presentasi jendela mode berjendela aplikasi lain. Oleh karena itu, setiap aplikasi perlu memastikan bahwa jendela perangkat terlihat ketika swapchain disajikan dalam mode layar penuh.

Persyaratan

Persyaratan Nilai
Header
D3D9Types.h

Lihat juga

Enumerasi Direct3D

IDirect3DDevice9::Reset