O que pode causar uma redução na taxa de quadros ao atualizar uma placa gráfica?

StackOverflow https://stackoverflow.com/questions/56424

  •  09-06-2019
  •  | 
  •  

Pergunta

Temos um aplicativo DirectX de duas telas que anteriormente rodava a consistentes 60 FPS (a taxa de sincronização dos monitores) usando um NVIDIA 8400GS (256 MB).No entanto, quando trocamos a placa por uma com 512 MB de RAM, a taxa de quadros luta para ficar acima de 40 FPS.(Ele só fica tão alto porque estamos usando buffer triplo.) As duas placas são do mesmo fabricante (PNY).Todas as outras coisas são iguais, este é um aplicativo Windows XP Embedded e começamos com uma nova imagem para cada cartão.O número da versão do driver é 169.21.

O aplicativo é todo 2D.I.E.apenas um monte de quadrantes texturizados e muitos gráficos pré-renderizados (daí a necessidade de atualizar a memória da placa).Também temos animações compactadas que a CPU decodifica instantaneamente - isso envolve um bloqueio de textura.Os bloqueios demoram uma eternidade, mas também tentei ter uma textura de memória do sistema separada para a CPU atualizar e, em seguida, atualizar a textura renderizada usando o método UpdateTexture do dispositivo.Nenhuma diferença geral no desempenho.

Embora eu tenha lido todas as perguntas frequentes que encontrei na Internet sobre o desempenho do DirectX, esta ainda é a primeira vez que trabalho em um projeto DirectX, portanto, qualquer conhecimento misterioso que você tenha seria útil.:)

Outra coisa enquanto estou no assunto;ao chamar Present nas cadeias de troca, parece que o DirectX aguarda a conclusão do presente, independentemente do fato de eu estar usando D3DPRESENT_DONOTWAIT nos parâmetros presentes (PresentationInterval) e nos sinalizadores da própria chamada.Como este é um aplicativo de duas telas, isso é um problema, pois os dois monitores não parecem estar genlocked. Estou contornando isso executando as chamadas Present por meio de um threadpool.Qual poderia ser a causa subjacente disso?

Foi útil?

Solução

As placas são exatamente iguais (ambas GeForce 8400GS) e apenas o tamanho da memória é diferente?Muitas vezes, com tamanhos de memória diferentes, ocorrem taxas de clock ligeiramente diferentes (ou seja,seu cartão com mais memória pode usar memória mais lenta!).

Portanto, a primeira coisa a verificar seriam as taxas de clock do núcleo da GPU e da memória, usando algo como GPU-Z.

Outras dicas

É um teste fácil para ver se o problema é o bloqueio da superfície, basta comentar a atualização da textura e ver se a taxa de quadros retorna para 60 Hz.Infelizmente, escrever em uma superfície bloqueada e atualizar o recurso mata o desempenho, sempre o fez.Você está usando mipmaps com as texturas?Eu sei que o DX9 adicionou geração automática de mipmaps, pode levar muito tempo para gerá-los.Se você está bloqueando constantemente o mesmo recurso em cada quadro, você também pode tentar criar um conjunto de texturas, como um buffer triplo, exceto com texturas.Você deixaria a renderização usar uma textura e, na próxima atualização, escolheria a próxima textura disponível no pool que não está sendo usada para renderizar.A menos, é claro, que sua memória esteja limitada ou você esteja apenas fazendo diferenças na textura animada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top