Seite 1 von 1

WindowedScreen 100% auslasung

Verfasst: 12.06.2009 19:38
von FosJonas
Habe jetzt ein weilchen in der forensuche nach ner antwort gesucht aber nichts gefunden deshalb frage ich jetzt mal:
wen ich ein WindowedScreen öffne steigt meine cpu auf 100% bei der größe von 1280x768 kratzt das spiel nach paar sekunden sogar ganz ab. aber wiso? ich habe doch alles richtig gemacht oder? wen ich das Windowedscreen gegen Openscreen ersetze läuft alles super.

Code: Alles auswählen

InitSprite()
InitMouse()
InitKeyboard()
UsePNGImageEncoder()
UsePNGImageDecoder()

OpenWindow(0,0,0,1280,768,"Magier")
OpenWindowedScreen(WindowID(0),0,0,1280,768,0,0,0)
Dim Key.w(240)
Dim Button.w(200)
Dim Head.w(200)
Dim Hand.w(200)

LoadSprite(8,"Grafik\IMG_Tiles.png")
CopySprite(8,7)
ClipSprite(8,0,0,64,64)
LoadSprite(1,"Grafik\Button_Neu.png")
LoadSprite(2,"Grafik\Button_Magier_Menü.png")
LoadSprite(3,"Grafik\Button_Kampagne.png")
LoadSprite(4,"Grafik\Button_Mission.png")
LoadSprite(5,"Grafik\Button_Duell.png")
LoadSprite(6,"Grafik\Mauszeiger.png")
TransparentSpriteColor(6,255+256*0+256*256*255)

Repeat
ExamineKeyboard()
ExamineMouse()
mx=MouseX()
my=MouseY()
ClearScreen(0)
WindowEvent()
WaitWindowEvent(60)
If mode=0

If mx<542 And mx>150 And my<180 And my>100 And MouseButton(#PB_MouseButton_Left)
mode=1
EndIf
For x= 0 To 19
For y= 0 To 11
DisplaySprite(7,x*64,y*64)
Next
Next

For x= 1 To 2
DisplaySprite(x,150,100*x)
Next
For x= 3 To 5
DisplaySprite(x,725,100*x-200)
Next

EndIf

DisplayTransparentSprite(6,mx,my)
FlipBuffers(20)
Until KeyboardPushed(#PB_Key_F1) Or quit=1
End
sorry fals der code unordentlich ist (ich versuche grade Bmax mit Purebasic zu vergleichen)

Verfasst: 12.06.2009 19:42
von Andesdaf
ändere mal bitte den schreibfehler im Titel. :wink:
[glaub-ich-modus]
Ich kenn mich mit dem ganzen Spritezeug nicht aus aber ich glaube du musst
dem Prog 'Zeit zum Einatmen' geben. Siehe Delay()
[/glaub ich]

Verfasst: 12.06.2009 19:42
von ts-soft

Code: Alles auswählen

  WindowEvent()
  WaitWindowEvent(60)
? Doppelt gemoppelt?
Einrückungen würden den Code ja lesbar machen.

Verfasst: 12.06.2009 19:48
von Andesdaf
hab das Ganze mal in (m)eine ordentliche Einrückung gebracht:

Code: Alles auswählen

Dim Key.w(240)
Dim Button.w(200)
Dim Head.w(200)
Dim Hand.w(200)

InitSprite()
InitMouse()
InitKeyboard()
UsePNGImageEncoder()
UsePNGImageDecoder()

If OpenWindow(0,0,0,1280,768,"Magier")
  OpenWindowedScreen(WindowID(0),0,0,1280,768,0,0,0)

  LoadSprite(8,"Grafik\IMG_Tiles.png")
  CopySprite(8,7)
  ClipSprite(8,0,0,64,64)
  LoadSprite(1,"Grafik\Button_Neu.png")
  LoadSprite(2,"Grafik\Button_Magier_Menü.png")
  LoadSprite(3,"Grafik\Button_Kampagne.png")
  LoadSprite(4,"Grafik\Button_Mission.png")
  LoadSprite(5,"Grafik\Button_Duell.png")
  LoadSprite(6,"Grafik\Mauszeiger.png")
  TransparentSpriteColor(6,255+256*0+256*256*255)
EndIf

Repeat
  ExamineKeyboard()
  ExamineMouse()
  mx=MouseX()
  my=MouseY()
  ClearScreen(0)
  ;WindowEvent()
  WaitWindowEvent(60)
  If mode=0
    If mx<542 And mx>150 And my<180 And my>100 And MouseButton(#PB_MouseButton_Left)
      mode=1
    EndIf
    
    For x= 0 To 19
      For y= 0 To 11
        DisplaySprite(7,x*64,y*64)
      Next
    Next
    
    For x= 1 To 2
      DisplaySprite(x,150,100*x)
    Next
    
    For x= 3 To 5
      DisplaySprite(x,725,100*x-200)
    Next
    
  EndIf
    
  DisplayTransparentSprite(6,mx,my)
  FlipBuffers(20)
Until KeyboardPushed(#PB_Key_F1) Or quit=1

End 

Verfasst: 12.06.2009 22:29
von Kaeru Gaman
100% auslastung ist normal, wenn du ein einfaches FlipBuffers() benutzt.
das wartet in einer internen Vollschleife auf den VSync.

das mit dem Abschmieren müßte ich austesten, kann ich grad nicht, weil ich TitanQuest minimiert laufen habe.

... und jetz guck ich erstmal Medium bevor ich weiterzock.

Verfasst: 12.06.2009 22:35
von Vermilion
@Kaeru: :mrgreen: Muhaha, ich hatte schon Angst mir würde jemand zuvorkommen...

Aber hier nochmal der Code aufgebessert:

Code: Alles auswählen

EnableExplicit ; Um Übersicht zu bewahren, Variablendeklaration erzwingen

Global Title.s = "Magier", WindowEvent
Global X, Y, MouseX, MouseY
Global mode

If InitSprite() = #False
	
	MessageRequester(Title, "Konnte DirectX für Grafikausgabe nicht initialisieren!")
	End
	
EndIf

If InitMouse() = #False
	
	MessageRequester(Title, "Konnte DirectX für Mauseingabe nicht initialisieren!")
	End
	
EndIf

If InitKeyboard() = #False
	
	MessageRequester(Title, "Konnte DirectX für Tastatureingabe nicht initialisieren!")
	End
	
EndIf

; Da PNGs nur gelesen und nicht geschrieben werden, wird der Encoder nicht benötigt
UsePNGImageDecoder()

If OpenWindow(0, 0, 0, 1280, 768, Title) = #False
	
	MessageRequester(Title, "Konnte Fenster nicht öffnen!")
	End
	
EndIf

OpenWindowedScreen(WindowID(0), 0, 0, 1280, 768, 0, 0, 0)

LoadSprite(8, "Grafik\IMG_Tiles.png")

CopySprite(8, 7)

ClipSprite(8, 0, 0, 64, 64)

LoadSprite(1, "Grafik\Button_Neu.png")
LoadSprite(2, "Grafik\Button_Magier_Menü.png")
LoadSprite(3, "Grafik\Button_Kampagne.png")
LoadSprite(4, "Grafik\Button_Mission.png")
LoadSprite(5, "Grafik\Button_Duell.png")
LoadSprite(6, "Grafik\Mauszeiger.png")

TransparentSpriteColor(6, RGB(255, 255, 255)) ; Transparente Farbe des Mauszeigers ist weiß
  
Repeat
  
  Repeat
	  
	  WindowEvent = WindowEvent()
	  
	  If WindowEvent = #PB_Event_CloseWindow
	  	
	  	End
	  	
	  EndIf
	  
  Until WindowEvent = #False
  
  ClearScreen(0)
  
  ExamineKeyboard()
  ExamineMouse()
  
  MouseX = MouseX()
  MouseY = MouseY()
  
  If mode = 0
  	
    If MouseX < 542 And MouseX > 150 And MouseY < 180 And MouseY > 100 And MouseButton(#PB_MouseButton_Left)
    	
      mode = 1
      
    EndIf
   
    For x = 0 To 19
    	
      For y = 0 To 11
        
        DisplaySprite(7, x * 64, y * 64)
        
      Next
      
    Next
   
    For x = 1 To 2
    	
      DisplaySprite(x, 150, 100 * x)
      
    Next
   
    For x = 3 To 5
    	
      DisplaySprite(x, 725, 100 * x - 200)
      
    Next
   
  EndIf
   
  DisplayTransparentSprite(6, MouseX, MouseY)
  FlipBuffers()
  
Until KeyboardPushed(#PB_Key_F1)

End 
Funktioniert hier einwandfrei. Die 100% Auslastung kommen daher, dass er eben immer so schnell wie möglich versucht zu rendern. Und wenn du CPU-unabhängige Bewegung etc. implementieren willst, benutze einfach mal die Suchfunktion des Forums.