Mengakses memori permukaan secara langsung (Direct3D 9)

Anda dapat langsung mengakses memori permukaan dengan menggunakan metode IDirect3DSurface9::LockRect . Ketika Anda memanggil metode ini, parameter pRect adalah penunjuk ke struktur RECT yang menjelaskan persegi panjang di permukaan untuk mengakses secara langsung. Untuk meminta agar seluruh permukaan dikunci, atur pRect ke NULL. Selain itu, Anda dapat menentukan RECT yang hanya mencakup sebagian permukaan. Asalkan tidak ada dua persegi panjang yang tumpang tindih, dua utas atau proses dapat secara bersamaan mengunci beberapa persegi panjang di permukaan. Perhatikan bahwa buffer multisample back tidak dapat dikunci.

Metode IDirect3DSurface9::LockRect mengisi struktur D3DLOCKED_RECT dengan semua informasi untuk mengakses memori permukaan dengan benar. Struktur mencakup informasi tentang pitch dan memiliki penunjuk ke bit terkunci. Ketika Anda selesai mengakses memori permukaan, panggil metode IDirect3DSurface9::UnlockRect untuk membuka kuncinya.

Saat permukaan terkunci, Anda dapat langsung memanipulasi konten. Daftar berikut menjelaskan beberapa tips untuk menghindari masalah umum dengan memori permukaan penyajian langsung.

  • Jangan pernah mengasumsikan pitch tampilan konstanta. Selalu periksa informasi nada yang dikembalikan oleh metode IDirect3DSurface9::LockRect . Pitch ini dapat bervariasi karena sejumlah alasan, termasuk lokasi memori permukaan, jenis kartu tampilan, atau bahkan versi driver Direct3D. Untuk informasi selengkapnya, lihat Lebar vs. Pitch (Direct3D 9).
  • Pastikan Anda menyalin ke permukaan yang tidak terkunci. Metode penyalinan Direct3D akan gagal jika dipanggil pada permukaan terkunci.
  • Batasi aktivitas aplikasi Anda saat permukaan dikunci.
  • Selalu salin data yang diselaraskan untuk menampilkan memori. Windows 98 menggunakan handler kesalahan halaman, Vflatd.386, untuk mengimplementasikan buffer bingkai datar virtual untuk kartu tampilan dengan memori yang dialihkan bank. Handler memungkinkan perangkat tampilan ini untuk menyajikan buffer bingkai linier ke Direct3D. Menyalin data yang tidak disejajarkan ke memori tampilan dapat menyebabkan sistem menangguhkan operasi jika salinan mencakup bank memori.
  • Permukaan mungkin tidak dikunci jika milik sumber daya yang ditetapkan ke kumpulan memori D3DPOOL_DEFAULT kecuali tekstur dinamis atau permukaan yang dibuat menggunakan IDirect3DDevice9::CreateOffscreenPlainSurface. Permukaan buffer belakang, yang dapat diakses menggunakan metode IDirect3DDevice9::GetBackBuffer dan IDirect3DSwapChain9::GetBackBuffer , dapat dikunci hanya jika rantai pertukaran dibuat dengan anggota Bendera D3DPRESENT_PARAMETERS untuk menyertakan D3DPRESENTFLAG_LOCKABLE_BACKBUFFER.

Permukaan Direct3D