0

Je viens de mettre en œuvre un rendu/ombrage différé pour la première fois et j'ai été surpris de constater le grand écart entre le rendu direct et le rendu différé.Rendu différé: Problèmes de performances

Quand je lance ma demande avec un rendu en avant-je obtenir un frame rate assez décent en cours d'exécution en mode de sortie

AVANT DE RENDRE enter image description here

Cependant, quand je l'ai couru avec le rendu différé, il m'a donné une plutôt surprenante sortie

REPORTÉ RENDRE enter image description here

Je suis bien conscient du fait que le rendu différé n'est PAS quelque chose que vous enrobez d'une application pour le faire aller "plus vite". Je considère que c'est une technique d'optimisation des performances qui peut être optimisée de nombreuses façons et je comprends que la technique a une empreinte mémoire plus importante que le rendu direct.

Mais ...

J'ai actuellement obtenu un feu de points dans la scène et une centaine de cubes créés avec le matériel instanciation. La lumière se déplace d'avant en arrière sur la lumière de coulée de l'axe Z sur les cubes.

Le problème est que la lumière est très décalée lors du déplacement. C'est tellement lent que l'application n'enregistre pas l'entrée au clavier. Honnêtement, je n'étais pas préparé pour cela et je suppose que je fais quelque chose de terriblement mauvais dans ma mise en œuvre. Jusqu'à présent, j'ai changé le format de texture sur les gbuffers de DXGI_FORMAT_R32G32B32A32_FLOAT à DXGI_FORMAT_R16G16B16A16_FLOAT jsut pour voir si cela avait un impact visuel, mais ce n'était pas le cas.

Des suggestions? Je vous remercie!

SIDE NOTE
J'utilise le Visual Studio Graphics Diagnostics pour le débogage mes applications DirectX

+0

Est-ce que votre question est: pourquoi courez-vous plus vite que l'autre, ou pourquoi est-il «laggy»? Et que voulez-vous dire par laggy? –

+0

Ma question s'adresse à la partie laggy. Y a-t-il des effets secondaires connus sur les performances que l'on devrait connaître lors de la mise en œuvre du rendu différé? Comme par exemple "Shadow Acne" et "Peter Panning" est pour la cartographie de l'ombre. La lumière ne bouge pas dans un mouvement régulier le long de l'axe comme c'est le cas avec le rendu vers l'avant. C'est un mouvement saccadé, tout comme lorsque vous avez l'expérience de ralentissement sur un serveur de jeu. J'imagine que tout ce qui fait que la lumière bouge de cette façon fait baisser la fréquence d'images. – SvinSimpe

+0

Mais selon votre capture d'écran, le taux de trame était de plus de 600 images par seconde. Cela ne semble-t-il pas être le cas visuellement? –

Répondre

0

a résolu le problème!

Je permis au DirectX debug layer et je me suis une mer d'avertissements D3D11

D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets: Resource being set to OM RenderTarget slot 1 is still bound on input! [ STATE_SETTING WARNING #9: DEVICE_OMSETRENDERTARGETS_HAZARD] 
D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets[AndUnorderedAccessViews]: Forcing PS shader resource slot 1 to NULL. [ STATE_SETTING WARNING #7: DEVICE_PSSETSHADERRESOURCES_HAZARD] 
D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets: Resource being set to OM RenderTarget slot 2 is still bound on input! [ STATE_SETTING WARNING #9: DEVICE_OMSETRENDERTARGETS_HAZARD] 
D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets[AndUnorderedAccessViews]: Forcing PS shader resource slot 2 to NULL. [ STATE_SETTING WARNING #7: DEVICE_PSSETSHADERRESOURCES_HAZARD] 
D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets: Resource being set to OM RenderTarget slot 3 is still bound on input! [ STATE_SETTING WARNING #9: DEVICE_OMSETRENDERTARGETS_HAZARD] 
D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets[AndUnorderedAccessViews]: Forcing PS shader resource slot 3 to NULL. [ STATE_SETTING WARNING #7: DEVICE_PSSETSHADERRESOURCES_HAZARD] 

Ainsi, à la fin de la fonction render-à-dire après

mSwapChain->Present(0, 0); 

I ajouté

mDeviceContext->ClearState(); 

Juste pour réinitialiser le contexte de périphérique qui définit tous les emplacements de ressources d'entrée/sortie sur NULL comme expliqué sur MSDN