Gerenciando recursos (Direct3D 9)

O gerenciamento de recursos é o processo em que os recursos são promovidos do armazenamento de memória do sistema para o armazenamento acessível pelo dispositivo e descartados do armazenamento acessível pelo dispositivo. O tempo de execução do Direct3D tem seu próprio algoritmo de gerenciamento com base em uma técnica de prioridade menos usada recentemente. O Direct3D alterna para uma técnica de prioridade usada mais recentemente quando detecta que mais recursos do que podem coexistir na memória acessível pelo dispositivo são usados em um único quadro - entre chamadas IDirect3DDevice9::BeginScene e IDirect3DDevice9::EndScene .

Use o sinalizador D3DPOOL_DEFAULT no momento da criação para especificar que um recurso seja colocado no pool de memória mais apropriado para o conjunto de usos solicitado para o recurso especificado. Isso geralmente é memória de vídeo, incluindo memória de vídeo local e memória AGP (porta gráfica acelerada). Os recursos no pool padrão não persistem por meio de transições entre os estados perdidos e operacionais do dispositivo. Esses recursos devem ser liberados antes de chamar redefinição e, em seguida, devem ser recriados.

Use o sinalizador D3DPOOL_MANAGED no momento da criação para especificar um recurso gerenciado. Os recursos gerenciados persistem por meio de transições entre os estados perdidos e operacionais do dispositivo. Esses recursos existem tanto em vídeo quanto na memória do sistema. Um recurso gerenciado será copiado para a memória de vídeo quando for necessário durante a renderização. O dispositivo pode ser restaurado com uma chamada para IDirect3DDevice9::Reset e esses recursos continuam funcionando normalmente sem serem recarregados com dados. No entanto, se o dispositivo precisar ser destruído e recriado, todos os recursos deverão ser recriados.

O gerenciamento de recursos não é recomendado para recursos que mudam com alta frequência. Por exemplo, buffers de vértice e índice que são usados para percorrer um grafo de cena a cada quadro renderizando apenas geometria visível para o usuário altera cada quadro. Como os recursos gerenciados são apoiados pela memória do sistema, as alterações constantes devem ser atualizadas na memória do sistema, o que pode causar uma grave degradação no desempenho. Para esse cenário específico, D3DPOOL_DEFAULT juntamente com D3DUSAGE_DYNAMIC devem ser usados.

Outro exemplo para o qual o gerenciamento de recursos não é recomendado (e explicitamente não permitido pelo runtime) é o gerenciamento de uma textura criada com D3DUSAGE_RENDERTARGET. Se a memória usada pelos destinos de renderização fosse gerenciada pelo runtime, seu conteúdo teria que ser copiado constantemente para a memória do sistema durante a renderização, causando grandes penalidades de desempenho. Por esse motivo, os destinos de renderização devem ser criados no pool padrão. Se o acesso à CPU dos dados contidos em um destino de renderização for necessário, os dados deverão ser copiados para um recurso criado em D3DPOOL_SYSTEMMEM usando IDirect3DDevice9::UpdateTexture ou IDirect3DDevice9::UpdateSurface

Para obter mais informações sobre o estado perdido de um dispositivo, consulte Dispositivos perdidos (Direct3D 9).

Recursos do Direct3D