Udostępnij przez


Bezpośrednie uzyskiwanie dostępu do pamięci Surface (Direct3D 9)

Dostęp do pamięci powierzchni można uzyskać bezpośrednio przy użyciu metody IDirect3DSurface9::LockRect. Podczas wywoływania tej metody parametr pRect jest wskaźnikiem do struktury RECT, która opisuje prostokąt na powierzchni, aby uzyskać do niego bezpośredni dostęp. Aby zażądać zablokowania całej powierzchni, ustaw wartość pRect na wartość null. Ponadto można określić RECT, który obejmuje tylko część powierzchni. Pod warunkiem, że żadne dwa prostokąty się nie nakładają, dwa wątki lub procesy mogą jednocześnie blokować wiele prostokątów na powierzchni. Należy pamiętać, że nie można zablokować buforu z wieloma próbkami.

Metoda IDirect3DSurface9::LockRect wypełnia strukturę D3DLOCKED_RECT ze wszystkimi informacjami, aby prawidłowo uzyskać dostęp do pamięci powierzchniowej. Struktura zawiera informacje o boisku i ma wskaźnik do zablokowanych bitów. Po zakończeniu uzyskiwania dostępu do pamięci powierzchni wywołaj metodę IDirect3DSurface9::UnlockRect, aby ją odblokować.

Gdy masz zablokowaną powierzchnię, możesz bezpośrednio manipulować zawartością. Na poniższej liście opisano kilka wskazówek dotyczących unikania typowych problemów z bezpośrednim renderowaniem pamięci powierzchni.

  • Nigdy nie zakładaj stałej rozdzielczości wyświetlania. Zawsze sprawdzaj informacje o boisku zwrócone przez metodę IDirect3DSurface9::LockRect. Ustawienie to może się różnić z wielu powodów, w tym ze względu na lokalizację pamięci powierzchni, typ karty graficznej, a nawet wersję sterownika Direct3D. Aby uzyskać więcej informacji, zobacz Width vs. Pitch (Direct3D 9).
  • Upewnij się, że kopiujesz na odblokowane powierzchnie. Metody kopiowania Direct3D zakończą się niepowodzeniem, jeśli zostaną wywołane na zablokowanej powierzchni.
  • Ogranicz działanie aplikacji, gdy powierzchnia jest zablokowana.
  • Zawsze kopiuj dane wyrównane do pamięci. System Windows 98 używa programu obsługi błędów strony Vflatd.386 w celu zaimplementowania wirtualnego buforu płaskiej ramki dla kart wyświetlania z pamięcią przełączoną przez bank. Program obsługi umożliwia tym urządzeniom wyświetlającym przedstawienie liniowego buforu ramki w Direct3D. Kopiowanie danych niewyrównanych do pamięci wyświetlacza może spowodować, że system zawiesi operacje, jeśli kopia obejmuje banki pamięci.
  • Powierzchnia może nie być zablokowana, jeśli należy do zasobu przypisanego do puli pamięci D3DPOOL_DEFAULT, chyba że jest to dynamiczna tekstura lub powierzchnia utworzona przy użyciu IDirect3DDevice9::CreateOffscreenPlainSurface. Tylne powierzchnie bufora, do których można uzyskać dostęp przy użyciu metod IDirect3DDevice9::GetBackBuffer i IDirect3DSwapChain9::GetBackBuffer, można zablokować tylko wtedy, gdy łańcuch wymiany został utworzony z użyciem elementu Flags członkowskiego D3DPRESENT_PARAMETERS z uwzględnieniem D3DPRESENTFLAG_LOCKABLE_BACKBUFFER.

Powierzchnie Direct3D