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




 
 