| |
|
|
- 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. » |
|
| 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
|
|
|
| |
|
|
|
|
Dieter Zornow | ich arbeite grundsätzlich nicht mit XPSE, aber Xprofan hat doch die Befehle Line und LineTo. Um auf ein Bitmap zu zeichnen musst du Startpaint Handle und Endpaint verwenden. |
|
|
| XProfan X2Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2 | 05.09.2012 ▲ |
|
|
|
|
Andreas Koch | Danke. Aber das wusste ich schon. Es geht darum, dass das mit den Profan Befehlen zu lange dauert und ich das Ganze mit XPSE beschleunigen möchte. |
|
|
| |
|
|
|
funkheld | Hallo, ich hatte so etwas schon mal mit XPIA gemacht, dort sind auch einige Beispiele drin. XPSE und XPIA können ja zusammen genutzt werden. Ich hatte damals keinen grossen Geschwindigkeitsunterschied feststellen können, weil die Grafik-Windows-Befehle(API-Befehl ) auch bei XPIA(ASM) genutzt werden. Das einzige was beschleunigt wird sind unter umständen Schleifen und Zählvariablen , diese Zeit wird aber wieder durch die Grafik-Windows-Befehle(API-Befehl ) verschlampt.
Ausser du schreibst jetzt selbst ein Linienprogramm usw., da musst du dann aber auch wieder die Punkte selber ausrechnen mit ASM, nämlich wenn du dafür wieder den Plotbefehl(API-Befehl ) nimmst , geht die Zeitschlamperei wieder los.
ich arbeite grundsätzlich nicht mit XPSE, aber Xprofan hat doch die Befehle Line und LineTo. Um auf ein Bitmap zu zeichnen musst du Startpaint Handle und Endpaint verwenden.
Ohne XPSE oder XPIA ist das gesamte Profanprogramm grottenlangsam.
Schau hier mal für XPIA : [...] Das einzige was dort gross geschleunigt wird ist die Zählschleife.
Gruss |
|
|
| |
|
|
|
funkheld |
Dann bliebe da noch das Umlenken der Zeichenbefehle auf eine Bitmap....
Du brauchst die Anfangsadresse der Bitmap die du ändern möchtest, Breite, Höhe und Bitmaptiefe, dann kannst du loslegen mit XPIA.
Gruss |
|
|
| |
|
|
|
Andreas Koch | Sorry für das verfrühte Posting. Ich hatte den Link zu dem Beispiel nicht gesehen. Ich denke, damit kann ich was anfangen. Allerdings erhalte ich immer die Fehlermeldung, dass er GetXpiaProcAddress nicht kennt. Muss ich dafür noch irgendwas einstellen? KompilierenMarkierenSeparieren $MAKE CLE
$H Windows.ph
Declare hwin&,x&,y&,f&,hdcwin&
Window 20,20-200,200
hWin& = Create("Window", %hWnd, "Test", 250, 20, 650,500)
hDCWin& = ~GetWindowDC(hWin&)
If 0
AsmStart pset
Parameters hdcwin&,x&,y&,f&
mov ecx,para1
mov eax,para2
mov ebx,para3
mov edi,para4
invoke SetPixel,ecx,eax,ebx,edi
AsmEnd
EndIf
whileloop 0,100,1
x&=&loop
y&=&loop
f&=$ff0000
Call(GetXpiaProcAddress(XpiaModule&,"pset"),hdcwin&,x&,y&,f&)
endwhile
WaitInput
End
|
|
|
| |
|
|
|
funkheld |
GetXpiaProcAddress
Ich glaube der Aufrufname hat sich geändert ?
Aber "Setpixel" verwendet wieder diese langsame WindowsAPI.
Gruss |
|
|
| |
|
|
|
| |
|
| |
|
|
|
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: [...] |
|
|
| |
|
|
|
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 |
|
|
| |
|
|