Hallo,
Ich hab ein Delphi Programm geschrieben was unter anderem ein Netzwerkzeichenfunktion enthält. Funktionierte auch sehr gut nur das die Zeichenfläche von 2000x2000 Pixel nicht die kleinste ist und ich mittlerweile einige Funktione habe die erfordern das ganze Bild neu zu Zeichnen. Die Standard Delphi Canvas Funktionen wurden mit aber mittlerweile zu langsam, bzw die CPU auslastung war ungebefriedigend. Andorra 2D scheint mir die Lösung zu sein.
Also Programm genommen und umgebaut auf Andorra Funktioniert soweit allerdings nicht mit 100% der Funktionen die ich hatte.
Die Ursprungsfunktion war diese:
1. Eine Liste mit der Grafikobjekten wurde durchgegangen und diese auf meinen Backbuffer gezeichnet.
2. Dann hatte ich noch einen Overlay Buffer der Bereiche verdecken soll vom Bild. Alles wurde schwarz überdeckt nur die Bereiche die vom Admin Weiss gezeichnet wurden waren dann vom Hintergrund sichtbar. Also letztendlich eine Maske mit Löchern durch die durchgeschaut werden konnte.
3. Dieser wurde dann mit TransparentBlt auch auf den Backbuffer gezeichnet und der dann natürlich angezeigt.
So mit Andorra hab ich direkt angefangen das nach den Tutorials auf der Seite umzustellen. Es funktioniert alles aus Schritt 1. so wie erhofft. Bei schritt 2 hänge ich schon an der durchführung. Am wenigsten Aufwand währe es wenn ich auch mit Andorra eine zweite (Unsichtbare)Zeichenfläche hätte auf der ich eben diese Maske zusammensetzen und anschliessend auf die erst erstellte Zeichnung legen kann, mit entsprechend angegebener Transparentfarbe.
Es klappt aber irgendwie nicht, hab mir mit
Delphi-Quellcode:
AdSurface: TAdTextureSurface;
//und im Form1.Create Teil
AdSurface := TAdTextureSurface.Create(AdDraw);
AdSurface.SetSize(2000, 2000);
Eine Surface angelegt. Zum einen klappt es anscheinend nicht mit dem Drauf zeichnen und dann Transparent anzeigen nicht wirklich. Hier währe ich für einen ersten Tipp dankbar welche Funktion die Surface mit Transparenten bereichen ausgibt.
Zum anderen bekomme ich Grafikfehler angezeigt. Allerdings nur wenn ich eine SetSize größe von über 1000x1000 wähle. Entweder es Funktionert generell nicht mit einer so großen Surface, ich muss es mit
OpenGL Modus anstelle von
DirectX versuchen oder es ist einfach ein Bug.
Hoffe jemand hat eine idee was machen kann um dieses Problem zu umschiffen ohne meine Komplette Draw funktion umbauen zu müssen die ja an sich wenn auch langsam Funktioniert.
-----EDIT -----
Ok mit
OpenGL Funktioniert es auf jeden fall. Auch funktioniert es wenn ich meine Zeichenfläche auf 2048x2048 vergrößere und eben diese Surface auch auf 2048 setze.
Nach etwas Probieren kapiere ich auch den zusammenhang. Ich darf keine große wählen die großer als mein Zeichenbereich ist, und muss das nächst kleinere auf dem Binär System Basierenden wert nehmen der Rein past.
Also bei 1023 dürfte ich maximal 512 als wert wählen.
Gut damit ist das eine Problem gelöst ob das jetzt 48 Pixel größer ist macht keinen unterschied für mich. Bleibt nur noch die Frage wie ich das Transparent zeichne.