Lebar vs. Pitch (Direct3D 9)

Meskipun istilah lebar dan nada sering digunakan secara informal, mereka memiliki makna yang sangat penting, dan berbeda. Akibatnya, Anda harus memahami arti untuk masing-masing, dan cara menginterpretasikan nilai yang digunakan Direct3D untuk menggambarkannya.

Direct3D menggunakan struktur D3DSURFACE_DESC untuk membawa informasi yang menjelaskan permukaan. Antara lain, struktur ini didefinisikan untuk berisi informasi tentang dimensi permukaan, serta bagaimana dimensi tersebut diwakili dalam memori. Struktur menggunakan anggota Tinggi dan Lebar untuk menjelaskan dimensi logis permukaan. Kedua anggota diukur dalam piksel. Oleh karena itu, nilai Tinggi dan Lebar untuk permukaan 640 x 480 sama apakah itu permukaan 8-bit atau permukaan RGB 24-bit.

Saat Anda mengunci permukaan menggunakan metode IDirect3DSurface9::LockRect , metode mengisi struktur D3DLOCKED_RECT yang berisi pitch permukaan dan pointer ke bit terkunci. Nilai dalam anggota Pitch menjelaskan pitch memori permukaan, juga disebut stride. Pitch adalah jarak, dalam byte, antara dua alamat memori yang mewakili awal satu baris bitmap dan awal baris bitmap berikutnya. Karena nada diukur dalam byte daripada piksel, permukaan 640x480x8 memiliki nilai nada yang sangat berbeda dari permukaan dengan dimensi yang sama tetapi format piksel yang berbeda. Selain itu, nilai pitch terkadang mencerminkan byte yang telah dicadangkan Direct3D sebagai cache, sehingga tidak aman untuk mengasumsikan bahwa pitch hanyalah lebar dikalikan dengan jumlah byte per piksel. Sebaliknya, visualisasikan perbedaan antara lebar dan pitch seperti yang diperlihatkan dalam diagram berikut.

diagram pitch dan lebar untuk buffer depan, buffer belakang, dan cache yang sama

Dalam diagram ini, buffer depan dan buffer belakang keduanya adalah 640x480x8, dan cache adalah 384x480x8.

Saat mengakses permukaan secara langsung, berhati-hatilah untuk tetap berada dalam memori yang dialokasikan untuk dimensi permukaan dan tetap keluar dari memori apa pun yang disediakan untuk cache. Selain itu, ketika Anda hanya mengunci sebagian permukaan, Anda harus tetap berada dalam persegi panjang yang Anda tentukan saat mengunci permukaan. Gagal mengikuti panduan ini akan memiliki hasil yang tidak dapat diprediksi. Saat merender langsung ke memori permukaan, selalu gunakan pitch yang dikembalikan oleh metode IDirect3DSurface9::LockRect . Jangan asumsikan pitch hanya didasarkan pada mode tampilan. Jika aplikasi Anda berfungsi pada beberapa adaptor tampilan tetapi terlihat rusak pada orang lain, ini mungkin penyebab masalahnya.

Untuk informasi selengkapnya, lihat Mengakses Surface Memory Secara Langsung (Direct3D 9).

Permukaan Direct3D