Compartilhar via


Redimensionamento de pool de blocos

Use a API ID3D11DeviceContext2::ResizeTilePool para aumentar um pool de blocos se o aplicativo precisar de mais conjunto de trabalho para o mapeamento de recursos lado a lado ou para reduzir se for necessário menos espaço. Outra opção para aplicativos é alocar pools de blocos adicionais para novos recursos lado a lado. Mas se qualquer recurso lado a lado precisar de mais espaço do que o disponível inicialmente em seu pool de blocos, aumentar o pool de blocos será uma boa opção. Um recurso lado a lado não pode ter mapeamentos em vários pools de blocos ao mesmo tempo.

Quando um pool de blocos é expandido, blocos adicionais são adicionados ao final por meio de uma ou mais alocações novo pelo driver de vídeo. Essa divisão em alocações não fica visível para o aplicativo. A memória existente no pool de blocos é deixada intocada e os mapeamentos de recursos lado a lado existentes nessa memória permanecem intactos.

Quando um pool de blocos é reduzido, os blocos são removidos do final. Os blocos são removidos até mesmo abaixo do tamanho de alocação inicial, até 0, o que significa que novos mapeamentos não poderão ser feitos após o novo tamanho. Porém, os mapeamentos existentes após o final do novo tamanho permanecem intactos e utilizáveis. O driver de vídeo manterá a memória ativa enquanto permanecerem mapeamentos para qualquer parte das alocações que o driver usa para a memória do pool de blocos. Se, após a redução, parte da memória for mantida ativa porque mapeamentos de blocos são apontando para ela e, em seguida, o pool de blocos for ampliado novamente (em qualquer valor), a memória existente será reutilizada primeiro antes que qualquer alocação adicional ocorra para atender ao tamanho da operação de ampliação.

Para poder economizar memória, o aplicativo precisa não só reduzir um pool de blocos, mas também remover/remapear os mapeamentos existentes após o final do novo tamanho de pool de blocos menor.

O ato de reduzir (e remover mapeamentos) não necessariamente gera economia de memória de imediato. A liberação da memória depende de quão granulares as alocações subjacentes do driver de vídeo são para o pool de blocos. Quando a redução é suficiente para fazer uma alocação de driver de vídeo não utilizado, o driver de vídeo pode liberá-la. Se um pool de blocos foi ampliado, a redução aos tamanhos anteriores (e remover/remapear os mapeamentos de blocos de forma correspondente) tem grandes chances de economizar memória, embora não haja garantia caso os tamanhos não se alinhem exatamente aos tamanhos de alocação subjacentes escolhidos pelo driver de vídeo.

Mapeamentos estão em um pool de blocos