David Catuhe
Utilisation optimale de DirectX Managed
Comment utiliser de façon optimale le DirectX Managed
Par David Catuhe publié le 22/07/2005 à 07:46, lu 8909 fois,
Un des principaux problèmes auquel se heurte les développeurs .NET utilisant la technologie DirectX Managed, c'est la perte drastique de performances lors de l'accès aux ressources telles que les vertex buffers ou toutes autres ressources tabulaires.

Ainsi, il est aisé de se retrouver avec un code peu performant alors qu'il existe une technique pour se sortir avec brio de ce genre de situations.

L'accès aux ressources de manière générale se fait via l'appel aux méthodes Lock qui retourne soit un GraphicsStream soit un tableau d'objets managés représentant la ressource. Il est bien évident qu'il faut bannir l'accès par tableaux car DirectX Managed doit créer ce tableau depuis les ressources unmanagées à l'aller et transformer ce même tableau en ressource non managées au retour.

L'utilisation d'un GraphicsStream est déjà bien plus performante :
MyVertex[] vertices = new MyVertex[10];

GraphicsStream vbData =  vb.Lock(0, 0, LockFlags.None);

vbData.Write(vertices);

vb.Unlock();
Toutefois il est possible de faire bien mieux en utilisant un petit bout de code unsafe:
MyVertex[] vertices = new MyVertex[10];

GraphicsStream vbData =  vb.Lock(0, 0, LockFlags.None);

MyVertex *unmanagedArray = (MyVertex *) vbData.InternalDataPointer;

for (int i = 0; i < vertices.Length; i++)
{
    unmanagedArray[i] = vertices[i];
}

vb.Unlock();
Cette méthode bien qu'un peu moins élégante possède le net avantage d'être jusqu'à 4 fois plus rapide.
 
» Démarrer une discussion