J'essaye d'obtenir plus de performance de la fonction C# GDI + DrawLines. Lorsque j'exécute un profileur sur le code, je vois que presque la moitié du temps passé dans la fonction DrawLines prépare le tableau de points à envoyer à la DLL GDI + native. Cela semble être un gros inconvénient et je me demande si quelqu'un pourrait trouver un moyen plus efficace d'interopérer avec la fonction DrawLines qu'avec l'implémentation native de la fonction DrawLines dans System.DrawingPossibilité d'optimisation GDI + DrawLines
Voici les Systemm.Drawing natifs fonctions:
public void DrawLines(Pen pen, PointF[] points)
{
if (pen == null)
{
throw new ArgumentNullException("pen");
}
if (points == null)
{
throw new ArgumentNullException("points");
}
IntPtr handle = SafeNativeMethods.Gdip.ConvertPointToMemory(points);
int status = SafeNativeMethods.Gdip.GdipDrawLines(new HandleRef(this,this.NativeGraphics), new HandleRef(pen, pen.NativePen), new HandleRef(this, handle), points.Length);
Marshal.FreeHGlobal(handle);
this.CheckErrorStatus(status);
}
internal static IntPtr ConvertPointToMemory(PointF[] points)
{
if (points == null)
{
throw new ArgumentNullException("points");
}
int num2 = Marshal.SizeOf(new GPPOINTF().GetType());
int length = points.Length;
IntPtr ptr = Marshal.AllocHGlobal((int) (length * num2));
for (int i = 0; i < length; i++)
{
Marshal.StructureToPtr(new GPPOINTF(points[i]), (IntPtr) (((long) ptr) + (i * num2)), false);
}
return ptr;
}
Merci. Direct2D est le futur chemin, mais en ce moment je suis coincé avec GDI + ce qui n'est pas vraiment mauvais. Et pourrait être encore mieux si le C# wrapper n'avait pas de surcharge, d'où ma question. – Einar
Légèrement hors sujet, mais il convient de souligner que vous pouvez accéder à l'interface Direct2D en utilisant le Pack de code de l'API Window. – Samuel