Поделиться через


Прямой доступ к памяти Surface (Direct3D 9)

Прямой доступ к памяти surface можно получить с помощью метода IDirect3DSurface9::LockRect . При вызове этого метода параметр pRect является указателем на структуру RECT , которая описывает прямоугольник на поверхности для прямого доступа. Чтобы запросить блокировку всей поверхности, задайте для параметра pRect значение NULL. Кроме того, можно указать RECT , который охватывает только часть поверхности. При условии, что два прямоугольника не перекрываются, два потока или процессы могут одновременно блокировать несколько прямоугольников в поверхности. Обратите внимание, что буфер обратной блокировки с несколькими дискретными значениями невозможно.

Метод IDirect3DSurface9::LockRect заполняет структуру D3DLOCKED_RECT всеми сведениями для правильного доступа к поверхностной памяти. Структура содержит сведения о шаге и имеет указатель на заблокированные биты. Завершив доступ к памяти surface, вызовите метод IDirect3DSurface9::UnlockRect , чтобы разблокировать его.

Если поверхность заблокирована, вы можете напрямую управлять содержимым. В следующем списке описаны некоторые советы по предотвращению распространенных проблем с непосредственной отрисовкой памяти поверхности.

  • Никогда не предполагайте постоянный шаг отображения. Всегда проверяйте сведения о шаге, возвращаемые методом IDirect3DSurface9::LockRect . Этот шаг может отличаться по ряду причин, включая расположение поверхностной памяти, тип дисплея карта или даже версию драйвера Direct3D. Дополнительные сведения см. в разделе Ширина и Шаг (Direct3D 9).
  • Обязательно скопируйте данные на незаблокированные поверхности. Методы копирования Direct3D завершатся ошибкой при вызове на заблокированной поверхности.
  • Ограничьте активность приложения во время блокировки поверхности.
  • Всегда копируйте данные, выровненные для отображения памяти. Windows 98 использует обработчик сбоя страницЫ Vflatd.386 для реализации виртуального буфера с плоским кадром для карт отображения с памятью с банковским переключением. Обработчик позволяет этим устройствам отображения представить буфер линейного кадра в Direct3D. Копирование данных без сортировки для отображения памяти может привести к тому, что система приостанавливает операции, если копирование охватывает банки памяти.
  • Поверхность не может быть заблокирована, если она принадлежит ресурсу, назначенному пулу памяти D3DPOOL_DEFAULT, если это не динамическая текстура или поверхность, созданная с помощью IDirect3Ddevice9::CreateOffscreenPlainSurface. Поверхности обратного буфера, доступ к которым можно получить с помощью методов IDirect3Ddevice9::GetBackBuffer и IDirect3DSwapChain9::GetBackBuffer , могут быть заблокированы только в том случае, если цепочка буферов была создана с помощью элемента Flags D3DPRESENT_PARAMETERS для включения D3DPRESENTFLAG_LOCKABLE_BACKBUFFER.

Поверхности Direct3D