GDI+ CachedBitmap managé (Wrapper)

Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 - 30 déc. 2007 à 23:35
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 - 31 déc. 2007 à 13:18
Bonsoir,

Je cherche à développer un système de couches graphiques performant en .NET 2.0 dans le but de créer des animations graphiques fluides en plein-écran. J'ai déjà fais le tour du Graphics et du BufferedGraphics du framework, mais rien de ce qu'il offre n'est assez performant pour peindre plusieurs grandes images de façon fluide (30 FPS).

L'élément central dans le dessin GDI+ est l'objet Graphics, repris dans le code managé du framework .NET 2.0. Pour peindre plusieurs images à la suite (couches) dans un Graphics, il faudra donc successivement appeler sa méthode DrawImage (ou DrawImageUnscaled pour de meilleur performances). Le problème, c'est que lorsque on peint une image, cette image doit être traité afin de la rendre compatible avec le périphérique d'affichage, et cela prend du temps.

La solution, c'est l'utilisation d'une CachedBitmap. Il s'agit d'une image en mémoire qui à déjà été traité afin de la rendre compatible avec le périphérique d'affichage. Il est impossible de la modifier une fois créé, mais il est très rapide de la peindre dans un Graphics (comme une texture en Direct3D). Elle est créé à partir d'un objet Bitmap (qui sert d'image source) et d'un Graphics (afin de la rendre compatible avec celui-ci).

La où est le hic, c'est que CachedBitmap n'est pas implémenté dans le framework 2.0 (elle l'est dans le framework 3.5). Mon but est donc de la créer en code managé (wrap de l'objet non-managé), et évidement de rendre possible sa peinture dans un Graphics. Mais perso, je ne maitrise pas très bien les appels aux DLL depuis le code de VB.NET, c'est donc avant tout là que j'ai besoins de vous (un appel à une fonction passe encore, mais l'appel à un objet, aucune idée)

Voici la référence de GDI+ pour CachedBitmap: http://msdn2.microsoft.com/en-us/library/ms534425(VS.85).aspx#

Et voici comment je vois mon wrapper CachedBitmap managé:

Public Class CachedBitmap
    Private _CachedBitmap as NonManagedCachedBitmap     ' CachedBitmap non-managé

    Public Sub New(SourceBitmap as Bitmap, TargetGraphics as Graphics)
       ' Création de l'objets non managé CachedBitmap à partir de SourceBitmap et TargetGraphics
       _CachedBitmap = ....
    End Sub

    Public Sub Draw(TargetGraphics as Graphics, X as Interger, Y as Integer)
       ' Dessin de la CachedBitmap non-managé sur TargetGraphics
       ' Il faut appeler la méthode DrawCachedBitmap du Graphics non-managé
       Dim _Graphics as NonManagedGraphics = Trouver le Graphics non-managé à partir de TargetGraphics
       _Graphics.DrawCachedBitmap(_CachedBitmap,X,Y)
    End Sub
End Class

Donc voici ma (1ère) question, comment puis-je déclarer et utliser cet objet CachedBitmap non-managé?

1 réponse

Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
31 déc. 2007 à 13:18
Personne ne sais wrapper un objet non-managé?
0
Rejoignez-nous