WindowedScreen 100% auslasung

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
FosJonas
Beiträge: 121
Registriert: 12.11.2008 19:31

WindowedScreen 100% auslasung

Beitrag 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)
Purebasic 5.10 | Kubuntu 12.04 (64 bit) | Opera 12.01 | Nvidia GT 9800
Xubuntu 12.04 (64 bit) | Intel HD Graphis (Onboard)
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag 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]
Zuletzt geändert von Andesdaf am 12.06.2009 19:43, insgesamt 1-mal geändert.
Win11 x64 | PB 6.20
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Code: Alles auswählen

  WindowEvent()
  WaitWindowEvent(60)
? Doppelt gemoppelt?
Einrückungen würden den Code ja lesbar machen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag 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 
Win11 x64 | PB 6.20
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag 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.
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Antworten