| |
|
|
- Seite 1 - |
|
Andreas Koch | Hallo zusammen,
es gibt mal wieder ein Problem, bei dem ich nicht weiterkomme. Es geht darum, das Zeichnen eines Graphen auf eine Bitmap zu beschleunigen. Dabei geht es erst einmal nur um aneinander hängende Linien und ich würde das Ganze gerne mit XPSE angehen. Dabei stehe ich nun vor zwei Problemen.
1. XPSE kennt nur den Befehl Setpixel, Frage: kennt jemand einen API-Befehl, mit dem man eine Linie zeichnen kann? Einstellungsmöglichkeiten von Farbe, Start- und Endpunkt sowie Linienstärke wären nötig. 2. XPSE zeichnet grundsätzlich erst einmal nur auf dem Hauptfenster. Kann man das Zeichnen irgendwie auf eine Bitmap umleiten?
Zu 1.: das kann ich mir wahrscheinlich auch noch selbst basteln, der API-Befehl würde das Ganze nur vereinfachen.
Zu 2. habe ich versucht, mir etwas aus der nProc drawhPicRotated zu ziehen, was diese Funktion zu haben scheint, klappt aber nicht so ganz.... KompilierenMarkierenSeparieren {$cleq}
$I Pixels.Inc
Window 0,0 - %Maxx, %Maxy
var hPic&=create("hNewPic",400,400,$FF)
StartPaint hPic&
UseFont "Arial",30,0,1,0,0
textcolor $FFFF,-1
drawtext 5,0,"XProfan.Com"
textcolor $AA,-1
drawtext 5,0,"XProfan"
EndPaint
DrawPic hPic&,0,0,0
nproc Test
Parameters hPic&
long hDCBits=CreateCompatibleDC(hDC)
selectObject(hDCBits, hPic&)
WhileLoop 50
SetPixel(hDCBits,50+&loop,50,0)
EndWhile
EndProc
Test(hPic&)
DrawPic hPic&,500,0,0
WaitInput
Wäre prima, wenn ihr mir da weiterhelfen könntet.
Schönen Gruß
Andreas Koch |
|
|
| |
|
|
|
« Dieser Beitrag wurde als Lösung gekennzeichnet. » |
|
- Seite 2 - |
|
| Sagen wir einfach weil da etwas "geschludert" wurde.
(habe die Stellen im Code markiert) KompilierenMarkierenSeparieren {$cleq}
Window 0,0 - %Maxx, %Maxy
var hPic&=create("hNewPic",400,400,$FF)
StartPaint hPic&
UseFont "Arial",30,0,1,0,0
textcolor $FFFF,-1
drawtext 5,0,"XProfan.Com"
textcolor $AA,-1
drawtext 5,0,"XProfan"
EndPaint
DrawPic hPic&,0,0;0// <-- statt DrawPic hPic&,0,0,0
Test(hPic&)
DrawPic hPic&,500,0;0// <-- statt DrawPic hPic&,500,0,0
WaitInput
nproc Test
Parameters hPic&
long hDCBits=CreateCompatibleDC(hDC)
selectObject(hDCBits, hPic&)
WhileLoop 50
SetPixel(hDCBits,50+&loop,50,0)
EndWhile
deleteDC(hDCBits)// <-- vergessen, eigentlicher Knackpunkt
EndProc
|
|
|
| |
|
|
|
|
| |
|
- Seite 1 - |
|
| |
|
| |
|
|
|
Andreas Koch | Das sieht jetzt so aus, als könnte ich das direkt benutzen. Schönen Dank schon mal.
Ich möchte aber wirklich nur sehr ungern auf dem Hauptfenster malen, eigentlich gar nicht. Kann man das nicht irgendwie umleiten? Ich habe da dieses hdc im Verdacht, weiß aber nicht wirklich etwas damit anzufangen, siehe erster Beitrag.
PS: Was bedeutet das DC eigentlich in lang? |
|
|
| |
|
|
|
| |
|
| |
|
|
|
| Nachtrag: Gib auch ne pixels.inc [...] für Beispiele schneller Grafik- Effekte
und eine hPic.inc auch für fortgeschrittenes Rumbildereihen: [...]
und schau auch mal hier rein: [...] |
|
|
| |
|
|
| |
|
- Seite 2 - |
|
|
funkheld | Hmm.., was du meinst sind ja auch wieder die langsamen internen Grafik-Windowsbefehle(API): MoveToEx(hDC,20,30,0) LineTo(hDC,100,100) Für ein flotte Grafik taugen die nichts.
Es geht doch direkt viel schneller mit (DirectX) und/oder mit XPIA(ASM) ohne diese fertigen langsamen Move und LineTo.
Gruss |
|
|
| |
|
|
|
| LineTo etc. ist alles GDI ( [...] ) -
sind alles hochoptimierte Funktionen die Du wohl selbst (egal wo mit) nicht schneller
programmieren kannst. Natürlich kannst Du eine Linie auch per DX zeichnen aber das
ist ja eine komplett andere Nummer ähnlich wie als wenn Du eine Linie per OpenGL
zeichest. Bei letzteren beiden Beispielen wirst Du aber auch mindestens einmal eine
Linie anweisen müssen. Siehe hierzu die oglui [...] samt oglhelper.inc.
Was nun performanter ist hängt streng genommen zu sehr vom jeweiligen Anwendungs/
Einzelfall ab und ganz pauschal kann man nicht sagen das man mit DX eine
Linie schneller auf den Schirm bekommt als mit der GDI alleine schon wegen
der enormen Vorbereitungsmassnahmen die für DX oder OGL notwendig sind
bevor man überhaupt was zeichnen kann. |
|
|
| |
|
|
|
| Nachtrag: Mein nicht so schneller Computer zeichnet damit 100.000 Linien in weniger als 1 Sekunde (953ms) : KompilierenMarkierenSeparieren
Was ich jetzt nicht unbedingt "langsame interne Grafik-Windowsbefehle(API)" nennen würde
aber Du hast schon Recht damit das es einen auch nicht "vom Hocker haut". |
|
|
| |
|
|
|
Andreas Koch | Das mit der pixels.inc und Anhang hatte ich schon rausgefunden und auch in meinem Beispielcode oben eingebaut. Wenn ich das richtig sehe, habe ich sogar die Umleitung mit createcompatibledc richtig gemacht. Trotzdem malt der nicht richtig.
PS: DirectX hört sich zwar auch cool an, aber hey Leute, vor einem Jahr hatte ich das Wort "Profan" noch nie gehört, so schnell bin ich nicht. Wenn mir das was bringt, mache ich das aber auch noch. Vorher wollte ich aber eigentlich noch OpenGL ausloten. Vielleicht reicht das für meine Bedürfnisse aus. |
|
|
| |
|
|
|
| Ich weiß zwar nicht was genau Du vor hast aber zu "Trotzdem malt der nicht richtig." kann ich nur sagen "Zeig mal her, der Fehler liegt wo anders...".
Andreas Koch (05.09.12)
aber hey Leute, vor einem Jahr hatte ich das Wort "Profan" noch nie gehört, so schnell bin ich nicht.
Willkommen! |
|
|
| |
|
|
|
Andreas Koch | Ich hab in meinem ersten Beitrag einen Beispielcode, wo auf eine Bitmap eigentlich eine schwarze Linie gemalt werden sollte. Die vermiss ich irgendwie.... |
|
|
| |
|
|
|
| Sagen wir einfach weil da etwas "geschludert" wurde.
(habe die Stellen im Code markiert) KompilierenMarkierenSeparieren {$cleq}
Window 0,0 - %Maxx, %Maxy
var hPic&=create("hNewPic",400,400,$FF)
StartPaint hPic&
UseFont "Arial",30,0,1,0,0
textcolor $FFFF,-1
drawtext 5,0,"XProfan.Com"
textcolor $AA,-1
drawtext 5,0,"XProfan"
EndPaint
DrawPic hPic&,0,0;0// <-- statt DrawPic hPic&,0,0,0
Test(hPic&)
DrawPic hPic&,500,0;0// <-- statt DrawPic hPic&,500,0,0
WaitInput
nproc Test
Parameters hPic&
long hDCBits=CreateCompatibleDC(hDC)
selectObject(hDCBits, hPic&)
WhileLoop 50
SetPixel(hDCBits,50+&loop,50,0)
EndWhile
deleteDC(hDCBits)// <-- vergessen, eigentlicher Knackpunkt
EndProc
|
|
|
| |
|
|
|
Andreas Koch | Ok, wieder was gelernt. Danke, damit kann ich weitermachen. |
|
|
| |
|
|