2009-07-09 18 views
8

Quando GDI + è uscito, ricordo tutto il brutto aspetto di come fosse il "nuovo, più veloce, migliore" modo di mostrare contenuti in Windows. Ma ogni volta che lo guardavo, mi sembrava che fosse davvero solo un wrapper COM attorno a GDI.GDI + è solo un livello sopra GDI o qualcosa di nuovo?

È vero? O GDI + è davvero una libreria grafica indipendente che condivide semplicemente alcuni paradigmi con GDI?

Personalmente, non sono sicuro di come potrebbe essere indipendente, ma non ho mai visto una dichiarazione definitiva in un modo o nell'altro.

risposta

7

Molte funzioni GDI sono accelerate dall'hardware grafico e alcune routine GDI + possono utilizzare GDI al di sotto. Ma la maggior parte di GDI + è indipendente da GDI.

Un esempio importante e significativo è il rendering del testo. In GDI + il rendering del testo viene eseguito completamente nel software; l'anti-aliasing, gli effetti del pixel del glifo e altri effetti sono fatti senza la scheda video.

alt text http://i.msdn.microsoft.com/ms533818.fontstext10(en-us,VS.85).png

Chris Jackson di Microsoft ha avuto un interessante post sul blog dove si profila l'speed difference between text rendering in GDI and GDI+:

... il mio percorso di codice GDI è stato il rendering circa 99.000 glifi al secondo, mentre il mio GDI + codice percorso era rendering di circa 16.000 glifi al secondo.

Un altro esempio è il disegno al tratto.GDI + supporta anti-aliasing linea/poligono e cerchio/disegno ellisse, mentre GDI non lo fa:

alt text http://i.msdn.microsoft.com/ms536351.aboutgdip02_art33(en-us,VS.85).pngalt text http://i.msdn.microsoft.com/ms536351.aboutgdip02_art34(en-us,VS.85).png

alt text http://i.msdn.microsoft.com/ms536351.aboutgdip02_art36(en-us,VS.85).png

+3

Ma per rispondere alla tua domanda in modo più diretto: GDI + è completamente nuovo. Questo diventa effettivamente un problema poiché è più lento di GDI (cioè non è accelerato dall'hardware) e il rendering del testo è diverso da GDI (che porta a un testo che può apparire diverso nelle diverse parti di un'applicazione .NET). Non è un wrapper COM attorno a GDI, infatti non è nemmeno COM. È piatta C api. Microsoft ha creato un set di classi C++ che semplificano la chiamata delle funzioni flat. 'System.Drawing' in .NET è un insieme di classi che chiamano anche le funzioni flat. –

9

GDI + è basato su GDI e aggiunge molte altre funzionalità. Ad esempio, GDI + aggiunge il supporto per la trasparenza, l'allungamento bitmap anti-aliasing, ecc ...

GDI + è principalmente un'API basata su oggetti e GDI è una funzione API. La maggior parte delle funzionalità in GDI + non sono ottimizzate per l'hardware (sono gestite dal software), a differenza di GDI. Ad esempio, in GDI, BitBlt viene gestito direttamente dall'hardware. Le funzioni di pittura bitmap GDI + non lo sono.

GDI + è una potente API, ma attenzione alle sue prestazioni.

GDI + è disponibile in C++, COM e .NET

8

GDI + non è COM. GDI + ha un'API "piatta" sottostante che è richiamabile da C (o qualsiasi altra lingua, quindi) e un wrapper orientato agli oggetti in C++ che chiama solo l'API piatta. Ci sono anche wrapper in .NET (System.Drawing) e Delphi che chiamano anche semplicemente l'API piatta. Funziona completamente diverso da GDI in quanto non si impostano oggetti (penne, pennelli, font) in un contesto di dispositivo, ma piuttosto passandoli a funzioni di disegno. Non ha molto in comune con GDI. Non so però se l'implementazione di GDI + utilizza GDI, ma probabilmente non lo fa, perché ha così tante funzionalità che non sono disponibili in GDI.

Sfortunatamente, è più lento di GDI. È molto potente però.

Come evidenziato nel frattempo da decasteljau, i problemi di prestazioni potrebbero derivare dal fatto che non è reso in hardware, a differenza di OpenVG o WPF. Recentemente ho usato XNA per questo per un'applicazione grafica in tempo reale.

Problemi correlati