Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 2009
-
30 déc. 2007 à 23:35
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDerniè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)
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é?