Seite 1 von 1

Starfield- Plötzlich höhere Auslastung

Verfasst: 09.09.2008 07:27
von Captain_Qwark
Hey Folk's
Ich hab mal wieder ein Problem mit meinen kleinen Starfield. Am Anfang läuft alles wunderbar, doch nach ein bis zwei Minuten geht die Prozessorauslastung von ca. 20% auf 30% und das ganze fängt an zu ruckeln. Könnte das jemand mal testen, ob das bei Ihm auch so ist? (Vielleicht liegt es ja an meinem Win Vista).

Code: Alles auswählen

;	========================================================================
	Enumeration
		#myWindowID
	EndEnumeration

	#myWindowWidth    = 800 : #myWindowHeight = 600 : #myStarQuantity    = 100
	#myStarSpeedF     = 1.5 : #myStarSpeedM   =   1 : #myStarSpeedB      = 0.5
	#myTwinkleMaxGrey = 100 : #myTwinkleSpeed =   1 : #myTwinkleQuantity = 250

;	========================================================================
	Structure ntStarType
		PositionX.f
		PositionY.f
	EndStructure
	
	Structure ntTwinkleType
		PositionX.w
		PositionY.w
		GreyValue.c
		BrightOrDark.b
	EndStructure

	Global Dim TwinkleLayer.ntTwinkleType(#myTwinkleQuantity)
	Global Dim StarsLayerF.ntStarType(#myStarQuantity)
	Global Dim StarsLayerM.ntStarType(#myStarQuantity)
	Global Dim StarsLayerB.ntStarType(#myStarQuantity)

	Global myEvent.l    = 0 : Global myKeyPressed.l = 0
	Global myCounterA.w = 0

;	========================================================================
	Procedure DrawAllThings()
		ClearScreen(RGB(0, 0, 0))
		StartDrawing(ScreenOutput())
			; --- Den animierten Hintergrund berechnen und zeichnen ----------
			For myCounterA = 0 To #myTwinkleQuantity Step 1
				If TwinkleLayer(myCounterA)\BrightOrDark = 0
					If (TwinkleLayer(myCounterA)\GreyValue - #myTwinkleSpeed) < 0
						TwinkleLayer(myCounterA)\PositionX    = Int(Random(#myWindowWidth - 1))
						TwinkleLayer(myCounterA)\PositionY    = Int(Random(#myWindowHeight - 1))
						TwinkleLayer(myCounterA)\GreyValue    = 0
						TwinkleLayer(myCounterA)\BrightOrDark = 1
					Else
						TwinkleLayer(myCounterA)\GreyValue = TwinkleLayer(myCounterA)\GreyValue - #myTwinkleSpeed
					EndIf
				Else
					If (TwinkleLayer(myCounterA)\GreyValue + #myTwinkleSpeed) > #myTwinkleMaxGrey
						TwinkleLayer(myCounterA)\GreyValue    = TwinkleLayer(myCounterA)\GreyValue - #myTwinkleSpeed
						TwinkleLayer(myCounterA)\BrightOrDark = 0
					Else
						TwinkleLayer(myCounterA)\GreyValue = TwinkleLayer(myCounterA)\GreyValue + #myTwinkleSpeed
					EndIf
				EndIf
				Plot(TwinkleLayer(myCounterA)\PositionX, TwinkleLayer(myCounterA)\PositionY, RGB(TwinkleLayer(myCounterA)\GreyValue, TwinkleLayer(myCounterA)\GreyValue, TwinkleLayer(myCounterA)\GreyValue))
			Next myCounterA
			; --- Den Hintergrundlayer berechnen und zeichnen ----------------
			For myCounterA = 0 To #myStarQuantity Step 1
				If (StarsLayerB(myCounterA)\PositionX - #myStarSpeedB) < 0
					StarsLayerB(myCounterA)\PositionX = #myWindowWidth -1
					StarsLayerB(myCounterA)\PositionY = Int(Random(#myWindowHeight -1))
				Else
					StarsLayerB(myCounterA)\PositionX = StarsLayerB(myCounterA)\PositionX - #myStarSpeedB
				EndIf
				Plot(StarsLayerB(myCounterA)\PositionX, StarsLayerB(myCounterA)\PositionY, RGB(150, 150, 150))
			Next myCounterA
			; --- Den mittleren Layer berechnen und zeichnen ------------------
			For myCounterA = 0 To #myStarQuantity Step 1
				If (StarsLayerM(myCounterA)\PositionX - #myStarSpeedM) < 0
					StarsLayerM(myCounterA)\PositionX = #myWindowWidth -1
					StarsLayerM(myCounterA)\PositionY = Int(Random(#myWindowHeight - 1))
				Else
					StarsLayerM(myCounterA)\PositionX = StarsLayerM(myCounterA)\PositionX - #myStarSpeedM
				EndIf
				Plot(StarsLayerM(myCounterA)\PositionX, StarsLayerM(myCounterA)\PositionY, RGB(200, 200, 200))
			Next myCounterA
			; --- Den Vordergrund Layer berechnen und zeichnen ---------------
			For myCounterA = 0 To #myStarQuantity Step 1
				If (StarsLayerF(myCounterA)\PositionX - #myStarSpeedF) < 0
					StarsLayerF(myCounterA)\PositionX = #myWindowWidth -1
					StarsLayerF(myCounterA)\PositionY = Int(Random(#myWindowHeight - 1))
				Else
					StarsLayerF(myCounterA)\PositionX = StarsLayerF(myCounterA)\PositionX - #myStarSpeedF
				EndIf
				Plot(StarsLayerF(myCounterA)\PositionX, StarsLayerF(myCounterA)\PositionY, RGB(250, 250, 250))
			Next myCounterA
			; --- Textausgabe ------------------------------------------------
			DrawingMode(#PB_2DDrawing_Transparent)
			DrawText(15, 15, "Ecs zum beenden", RGB(80, 80, 80), RGB(0, 0, 0))
		StopDrawing()
		FlipBuffers()
	EndProcedure

;	========================================================================
	If Not InitSprite()
		MessageRequester("Sternenfeld", "Es ist ein DirectX Fehler aufgetreten - InitSprite( )", #PB_MessageRequester_Ok ) : End
	EndIf

	If Not InitKeyboard()
		MessageRequester("Sternenfeld", "Es ist ein DirectX Fehler aufgetreten - InitKeyboard( )", #PB_MessageRequester_Ok ) : End
	EndIf

	If Not OpenWindow(#myWindowID, 0, 0, #myWindowWidth, #myWindowHeight, "Sternenfeld", #PB_Window_ScreenCentered|#PB_Window_BorderLess)
		MessageRequester("Sternenfeld", "Es ist ein Fehler aufgetreten - OpenWindow( )", #PB_MessageRequester_Ok ) : End
	EndIf

	If Not OpenWindowedScreen(WindowID(#myWindowID), 0, 0, #myWindowWidth, #myWindowHeight, 0, 0, 0)
		MessageRequester("Sternenfeld", "Es ist ein Fehler aufgetreten - OpenWindowedScreen( )", #PB_MessageRequester_Ok ) : End
	EndIf

;	========================================================================
	; --- Den animierten Hintergrund initialisieren ------------------------
	For myCounterA = 0 To #myTwinkleQuantity Step 1
		TwinkleLayer(myCounterA)\PositionX    = Int(Random(#myWindowWidth - 1))
		TwinkleLayer(myCounterA)\PositionY    = Int(Random(#myWindowHeight - 1))
		TwinkleLayer(myCounterA)\GreyValue    = Int(Random(#myWindowWidth + 1))
		TwinkleLayer(myCounterA)\BrightOrDark = Int(Random(1))
	Next myCounterA
	; --- Die 3 Sternenfeld Layer erstmalig initialisieren -----------------
	For myCounterA = 0 To #myStarQuantity Step 1
		StarsLayerB(myCounterA)\PositionX = Int(Random(#myWindowWidth - 1))
		StarsLayerB(myCounterA)\PositionY = Int(Random(#myWindowHeight - 1))

		StarsLayerM(myCounterA)\PositionX = Int(Random(#myWindowWidth -1))
		StarsLayerM(myCounterA)\PositionY = Int(Random(#myWindowHeight - 1))

		StarsLayerF(myCounterA)\PositionX = Int(Random(#myWindowWidth -1))
		StarsLayerF(myCounterA)\PositionY = Int(Random(#myWindowHeight -1))
	Next myCounterA

;	========================================================================
	Repeat
		myEvent = WaitWindowEvent(10)
		ExamineKeyboard()
		If KeyboardPushed(#PB_Key_Escape)
			myKeyPressed = #PB_Key_Escape
		EndIf
		DrawAllThings()
	Until myKeyPressed = #PB_Key_Escape

;	========================================================================
	End

;	========================================================================
M.f.G.
Captain Qwark

Verfasst: 09.09.2008 09:30
von gnasen
bei mir startet das mit 38% und bleibt auch dabei.

Wenn sich das Starfield eh nimmer verändert, könnteste die Schichten auch direkt auf Sprites malen und diese dann anzeigen. Müsste viel schneller sein.

Verfasst: 09.09.2008 09:39
von Captain_Qwark
Danke erstmal fürs testen. <)

Ich hab das ganze auch mal als Vollbild probiert ... mit den gleichen Resultat ... naja schieb ich mal Vista den schwarzen Peter zu.
...könnteste die Schichten auch direkt auf Sprites malen und diese dann anzeigen. Müsste viel schneller sein.
Bestimmt. Aber das Programm ist nur als kleiner Einstieg gedacht, da wollte ich nicht gleich mit Sprites & Co. arbeiten, sondern nur mit Plot() etc.

Gruß
Qwark

Verfasst: 09.09.2008 14:04
von KatSeiko
Also bei mir ist und bleibt die Auslastung durch das Programm bei 12% - trotz Vista...
Die Kernellast ist bei Vista höher als bei XP - hast du unter den Prozessen oder unter der Gesamtlast nachgesehen? Bei der Gesamtlast hilft es, wenn der Kernel rot eingefärbt wird, um die Last der durch den Benutzer gestarteten Programme erkennen zu können...

Verfasst: 09.09.2008 15:49
von Captain_Qwark
Servus
trotz Vista
Damit verabschiedet sich meine Theorie ... wär ja auch zu einfach.
(Schaltet das Programm bei die auch das Aero Klimbim ab? Und wenn ja weißt du wie man das Umgehen kann? Also so das das anbleibt :D )
hast du unter den Prozessen oder unter der Gesamtlast nachgesehen
Weder das eine noch das andere ... Debugger -> CPU-Monitor
Der Task Manager (Prozesse) ist aber der gleichen Meinung erst ca.20% und nach einer halben Minute, zack 30% Auslastung. Hab noch ein bisschen mit der Kernen gespielt (Nur auf den 1. oder 2.), hat aber auch nichts gebracht.

Gruß
Qwark

Edit: Bah hat sich erledigt. Im abgesicherten Modus läuft das auch ohne Probleme. Muß also irgendetwas im Hintergrund herumgeistern. :|

Verfasst: 09.09.2008 22:54
von KatSeiko
Aero schaltet sich immer ab, wenn ein Programm mit OpenScreen oder OpenWindowedScreen geöffnet wird. Das wird wohl erst mit einer zukünftigen Version von PureBasic funktionieren.
Sobald irgendein Programm alle Register von DirectX für sich beansprucht, schaltet sich Aero aus. Aber du kannst dich an dieser Setelle beruhigen - nicht mal Apple hat es bisher geschafft, ein Quicktime herzustellen, das unter Vista korrekt funktioniert, ohne Aero abzuschalten...

Was den CPU-Monitor des Debuggers angeht - der zeigt nur die Gesamtlast an. Was dein Programm selbst verwendet, sieht das Teil nicht. Dazu ist erst der Task-Manager fähig...

Verfasst: 13.09.2008 00:01
von dllfreak2001
Apple hat auch kein Interesse daran für Vista eine derart funktionale Version zu verpassen.

Damit sich Aero nicht abschaltet muss man nur mit aktiviertem DX9-Subsystem kompilieren. Allerdings ist die aktuelle Version in PB mehr als buggy.