Partilhar via


Acessando a memória do Surface diretamente (Direct3D 9)

Você pode acessar diretamente a memória da superfície usando o método IDirect3DSurface9::LockRect . Quando você chama esse método, o parâmetro pRect é um ponteiro para uma estrutura RECT que descreve o retângulo na superfície para acessar diretamente. Para solicitar que toda a superfície seja bloqueada, defina pRect como NULL. Além disso, você pode especificar um RECT que abrange apenas uma parte da superfície. Desde que dois retângulos não se sobreponham, dois threads ou processos podem bloquear simultaneamente vários retângulos em uma superfície. Observe que um buffer de fundo de várias amostras não pode ser bloqueado.

O método IDirect3DSurface9::LockRect preenche uma estrutura D3DLOCKED_RECT com todas as informações para acessar corretamente a memória da superfície. A estrutura inclui informações sobre o pitch e tem um ponteiro para os bits bloqueados. Quando terminar de acessar a memória da superfície, chame o método IDirect3DSurface9::UnlockRect para desbloqueá-lo.

Embora você tenha uma superfície bloqueada, você pode manipular diretamente o conteúdo. A lista a seguir descreve algumas dicas para evitar problemas comuns com a renderização direta da memória da superfície.

  • Nunca suponha uma inclinação de exibição constante. Sempre examine as informações de pitch retornadas pelo método IDirect3DSurface9::LockRect . Essa apresentação pode variar por vários motivos, incluindo o local da memória da superfície, o tipo de cartão de exibição ou até mesmo a versão do driver Direct3D. Para obter mais informações, consulte Width vs. Pitch (Direct3D 9).
  • Certifique-se de copiar para superfícies desbloqueadas. Os métodos de cópia Direct3D falharão se forem chamados em uma superfície bloqueada.
  • Limite a atividade do aplicativo enquanto uma superfície está bloqueada.
  • Sempre copie os dados alinhados para exibir a memória. O Windows 98 usa um manipulador de falhas de página, Vflatd.386, para implementar um buffer de quadro plano virtual para cartões de exibição com memória comutada pelo banco. O manipulador permite que esses dispositivos de exibição apresentem um buffer de quadro linear ao Direct3D. Copiar dados desalinhados para exibir memória pode fazer com que o sistema suspenda as operações se a cópia abranger bancos de memória.
  • Uma superfície poderá não ser bloqueada se pertencer a um recurso atribuído ao pool de memória D3DPOOL_DEFAULT, a menos que seja uma textura dinâmica ou uma superfície criada usando IDirect3DDevice9::CreateOffscreenPlainSurface. As superfícies de buffer de fundo, que podem ser acessadas usando os métodos IDirect3DDevice9::GetBackBuffer e IDirect3DSwapChain9::GetBackBuffer , só poderão ser bloqueadas se a cadeia de troca tiver sido criada com o membro Flags do D3DPRESENT_PARAMETERS para incluir D3DPRESENTFLAG_LOCKABLE_BACKBUFFER.

Superfícies Direct3D