ich habe mal eine Frage bezüglich 2D Drawing. Ist es irgendwie möglich auf 2 Grafiken zu zeichnen, ohne dass man jedes mal ein StopDrawing() durchführen muss? ....bzw. sind Threads die einzigen Möglichkeiten?
Folgender Beispiel-Quellcode: Nach jedem Zeichenvorgang, wird StopDrawing()/StartDrawing() ausgeführt
ca. 24000 Werte/Sek. 39 FPS (bei 620 Pixel pro FPS)
Code: Alles auswählen
Declare.i Draw_Graph_1 (iWert.i)
Declare.i Draw_Graph_2 (iWert.i)
Enumeration
#GUI
#Image_1
#Image_2
#Image_Gadget_1
#Image_Gadget_2
#Label
EndEnumeration
OpenWindow(#GUI, 0, 0, 640, 480, "Drawing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TextGadget (#Label, 10, 10, 600, 18, "")
CreateImage(#Image_1, 620, 200, 24, $FFFFFF)
CreateImage(#Image_2, 620, 200, 24, $FFFFFF)
ImageGadget(#Image_Gadget_1, 10, 60, 620, 200, ImageID(#Image_1))
ImageGadget(#Image_Gadget_2, 10, 270, 620, 200, ImageID(#Image_2))
Global Sin_Counter.d
Global Plottwert.d
Global Status_Graph_1.i
Global Status_Graph_2.i
Global Timer
Global Counter
Repeat
; FPS berechnen und anzeigen
If ElapsedMilliseconds() - Timer > 1000
SetGadgetText (#Label, "[Graph_1] " + Str(Counter) + " Werte/Sek " + Str(Counter/620) + " FPS")
Timer = ElapsedMilliseconds()
Counter = 0
Else
Counter + 1
EndIf
; Sinus erzeugen
Sin_Counter + 0.03035
Plottwert = Sin(Sin_Counter) * 70 + Random(10,0) - Random(10,0) + 100
; Werte in den ersten Graphen plotten
StartDrawing(ImageOutput(#Image_1))
Status_Graph_1 = Draw_Graph_1 (Plottwert)
StopDrawing()
; Graph 1 in der GUI darstellen, wenn alle Werte gezeichnet wurden
If Status_Graph_1 = 620
SetGadgetState(#Image_Gadget_1, ImageID(#Image_1))
EndIf
; ; Werte in den zweiten Graphen plotten
; StartDrawing(ImageOutput(#Image_2))
; Status_Graph_2 = Draw_Graph_2 (Plottwert)
; StopDrawing()
;
; ; Graph 2 in der GUI darstellen, wenn alle Werte gezeichnet wurden
; If Status_Graph_2 = 620
; SetGadgetState(#Image_Gadget_2, ImageID(#Image_2))
; EndIf
; irgendwelche Events
Select WindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
; Beispielgraph 1
Procedure Draw_Graph_1 (iWert.i)
Static iX_Position_alt.i
Static iY_Position_alt.i
If iX_Position_alt > 620
iX_Position_alt = 0
Box (0, 0, 620, 200, RGB(255,255,255))
Else
LineXY (iX_Position_alt, iY_Position_alt, iX_Position_alt + 1, iWert, RGB(255,0,0))
iX_Position_alt + 1
iY_Position_alt = iWert
ProcedureReturn iX_Position_alt + 1
EndIf
EndProcedure
; Beispielgraph 2
Procedure Draw_Graph_2 (iWert.i)
Static iX_Position_alt.i
Static iY_Position_alt.i
If iX_Position_alt > 620
iX_Position_alt = 0
Box (0, 0, 620, 200, RGB(255,255,255))
Else
LineXY (iX_Position_alt, iY_Position_alt, iX_Position_alt + 1, iWert, RGB(255,0,0))
iX_Position_alt + 1
iY_Position_alt = iWert
ProcedureReturn iX_Position_alt + 1
EndIf
EndProcedure
Folgender Beispiel-Quellcode: StopDrawing()/StartDrawing() wird nur ausgeführt, wenn eine Grafik Vollständig gezeichnet wurde
Ergebnis: 384000 Werte/Sek 620 FPS
...geht aber nicht bei 2 Grafiken, die gleichzeitig gezeichnet werden sollen
Code: Alles auswählen
Declare.i Draw_Graph_1 (iWert.i)
Enumeration
#GUI
#Image_1
#Image_Gadget_1
#Label
EndEnumeration
OpenWindow(#GUI, 0, 0, 640, 480, "Drawing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TextGadget (#Label, 10, 10, 600, 18, "")
CreateImage(#Image_1, 620, 200, 24, $FFFFFF)
ImageGadget(#Image_Gadget_1, 10, 60, 620, 200, ImageID(#Image_1))
Global Sin_Counter.d
Global Plottwert.d
Global Status_Graph_1.i
Global Timer
Global Counter
StartDrawing(ImageOutput(#Image_1))
Repeat
; FPS berechnen und anzeigen
If ElapsedMilliseconds() - Timer > 1000
SetGadgetText (#Label, "[Graph_1] " + Str(Counter) + " Werte/Sek " + Str(Counter/620) + " FPS")
Timer = ElapsedMilliseconds()
Counter = 0
Else
Counter + 1
EndIf
; Sinus erzeugen
Sin_Counter + 0.03035
Plottwert = Sin(Sin_Counter) * 70 + Random(10,0) - Random(10,0) + 100
; Werte in den ersten Graphen plotten
Status_Graph_1 = Draw_Graph_1 (Plottwert)
; Graph 1 in der GUI darstellen, wenn alle Werte gezeichnet wurden
If Status_Graph_1 = 620
StopDrawing()
SetGadgetState(#Image_Gadget_1, ImageID(#Image_1))
StartDrawing(ImageOutput(#Image_1))
EndIf
; irgendwelche Events
Select WindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
; Beispielgraph 1
Procedure Draw_Graph_1 (iWert.i)
Static iX_Position_alt.i
Static iY_Position_alt.i
If iX_Position_alt > 620
iX_Position_alt = 0
Box (0, 0, 620, 200, RGB(255,255,255))
Else
LineXY (iX_Position_alt, iY_Position_alt, iX_Position_alt + 1, iWert, RGB(255,0,0))
iX_Position_alt + 1
iY_Position_alt = iWert
ProcedureReturn iX_Position_alt + 1
EndIf
EndProcedure
Zwischen 24K Werte/Sek und 384K Werte/Sek ist ja schon ein starker unterschied. Wie kann ich so ein Leistungseinbruch vermeiden?
...noch so eine Nebenfrage. Gibt es so etwas wie "IsDrawing()" ? Makros die ich dazu im Internet gefunden habe, haben immer irgendwelche Fehlermeldungen erzeugt

viele Grüße,
SBond