2010-08-10 : Direct2D, un GDI 32 bits intéressant

Documentation officielle

Direct2D : https://docs.microsoft.com/en-us/windows/win32/direct2d/direct2d-portal Lien externe à heclium.astronomie.science

GDI+ : http://msdn2.microsoft.com/en-us/library/ms533798(VS.85).aspx Lien externe à heclium.astronomie.science

GDI : http://msdn2.microsoft.com/en-us/library/ms536795(VS.85).aspx Lien externe à heclium.astronomie.science

Petite histoire

Le vieux GDI utilisé par Windows est un vilain GDI 16 bits. Concrètement, cela signifie qu'il est impossible d'utiliser les fonctions graphiques en utilisant des points de coordonnées à l'extérieur du domaine [-215;215-1]² soit [-32768;32767]². C'est ridiculement faible.

GDI+ est un GDI sorti en 2001. Il assure de base une compatibilité avec la majorité des systèmes d'exploitation en place à l'époque (Windows 2000, Windows 98, Windows Me, Windows XP, et même Windows NT). Il contient pas mal de primitives intéressantes, il assure la prise en charge de la transparence avec la canal alpha. Et il supporte la manipulation des images issues de nombreux formats possibles. Mais j'adresse 2 reproches à GDI+ :

Fin octobre 2008, Microsoft annonçait la sortie d'un nouveau GDI appelé Direct2D. A priori prometteur car il repose essentiellement sur Direct3D, donc il est normalement accéléré par le GPU. Mais un inconvénient notable : Direct2D n'est prévu que pour Windows 7, Windows Server 2008 et leurs successeurs. Le moment venu, je testerai la version finale de cette API, comme je l'avais fait dès 2001 pour le GDI+.

Il y a un peu plus d'un an, Héclium était enfin doté d'une interface dynamique. Les nombreuses optimisations dont il est doté permettent au logiciel de se comporter avec une fluidité acceptable. Seule la partie purement graphique (le dessin des polygones) pose réellement problème : les compteurs de performance m'indiquent clairement que la partie dessin est la plus consommatrice de temps CPU.
Ce qui est étonnant, c'est que la puissance des processeurs stagne depuis des années alors que la puissance des processeurs graphiques continue sa course en avant. Jusqu'à en devenir déraisonnable. Ainsi, le monstre de puissance graphique du moment, le GeForce GTX 480 doté de pas moins de 512 cœurs vient d'être testé. Dès lors, il semble naturel que la partie graphique d'Héclium doit être traitée par le processeur graphique et non le processeur central. Mais DirectX ou OpenGL restent des choix trop douloureux et en tout cas bien trop éloignés des graphismes 2D.

Août 2010 : le temps est venu de tester réellement Direct2D sur Windows 7, même si certains blogueurs se sont déchaînés contre Direct2D et m'invitent donc à ne pas m'enthousiasmer d'avance.

Direct2D : enfin un GDI 32 bits

Premier test : est-ce que Direct2D fait mieux que GDI+ pour tracer des segments dont les extrémités sont à l'extérieur du domaine [-223-1;223-1]² ?

La réponse est oui. Voici un extrait de code source simple :

hr = m_pRT->CreateSolidColorBrush(
D2D1::ColorF(D2D1::ColorF::Red),
&m_pRedBrush
);

m_pRT->BeginDraw();

m_pRT->Clear(D2D1::ColorF(D2D1::ColorF(0x0a1a44, 1.0f)));

D2D1_POINT_2F d1 = D2D1::Point2F(-99655379.0f, -99655379.0f);
D2D1_POINT_2F d2 = D2D1::Point2F( 99655379.0f, 99655379.0f);
m_pRT->DrawLine(d1, d2, m_pRedBrush, 13.6F);

HRESULT hr = m_pRT->EndDraw();

Voici ce que ça donne en images :

Le segment est donc correctement dessiné comme prévu.

Direct2D : une API intéressante

L'API Direct2D est un peu lourde à manier. Elle nécessite d'écrire beaucoup de lignes de code. Mais elle possède beaucoup de fonctionnalités. Ne serait-ce que l'API dédié aux gradients qui est fort intéressante. Dans Héclium, la partie dessin de la Terre et de son atmosphère peut enfin être largement simplifiée en utilisant Direct2D (en dessinant des disques), alors que jusque là, il était nécessaire de dessiner des polygones savamment calculés par le CPU.

Au niveau performances, elle semble assez efficace, même sur une carte graphique ne disposant que d'un pilote WDDM 1.0 au lieu de 1.1.

Conclusions

Ces quelques tests m'ont convaincu d'aller plus loin et aller jusqu'à écrire une version spécifique d'Héclium pour les systèmes d'exploitation dotés de Direct2D.