Seite 1 von 1

Probleme mit Sprites

Verfasst: 05.08.2007 18:11
von gnasen
Ich habe mal wieder einen schönen Fehler, der mich zum wahnsinn bringt.
Das Programm soll 36 Sprites zeichnen, wobei sich der Inhalt der Sprites andauernd ändern kann, die Koordinaten etc werden in nem array gespeichert, sowie die Spritenummern. (Am besten mal den Code anschauen). In einem Ordner \pics befindet sich die Datei 0.jpg.

Code: Alles auswählen

;/sprite_array(x,0) = Spritenummer
;/sprite_array(x,1) = X-coor.
;/sprite_array(x,2) = Y-coor.
;/sprite_array(x,3) = bild Nr.
;/sprite_array(x,4) = Sprite3DNummer


InitSprite()
InitSprite3D()

Enumeration
  #image0
  #Window_Main
EndEnumeration

Global Dim sprite_array.l(37,5)

;{ Fenster erstellen
;-Fenster erstellen

Image0 = CatchImage(#image0, ?Image0)
DataSection
Image0:
IncludeBinary "background.jpg"
EndDataSection
OpenWindow(#Window_Main, 0, 0, 800, 600, "...", #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered| #PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(#Window_Main), 0, 0, 590, 570, 0, 0, 0)

ClearScreen(RGB(255, 255, 255))

For i = 1 To 36
  sprite_array(i,0) = i
  sprite_array(i,3) = 0
  sprite_array(i,4) = 0
  sprite_array(i,5) = 0
Next

Global Dim arrays(filereadin_counter, 1)
For i = 0 To filereadin_counter
  arrays(i, 0) = i
  arrays(i, 1) = i
  LoadSprite(arrays(i, 0), "pics\" + Str(i) + ".jpg", #PB_Sprite_Texture) 
  CreateSprite3D(arrays(i, 1), arrays(i,0))
Next
LoadSprite(filereadin_counter+1, "background.jpg")

sprite_array(1,1)=100
sprite_array(1,2)=100
sprite_array(2,1)=200
sprite_array(2,2)=200
;- ..... ausgelassen
sprite_array(36,1) = 0
sprite_array(36,2) = 0

;}

Procedure redraw()
    ClearScreen(RGB(0,0,0))
    DisplaySprite(filereadin_counter+1,0,0)
    Start3D()
    For i = 1 To 36
      If i => 13 And i <= 18
        DisplaySprite3D(arrays(sprite_array(i,3),1), sprite_array(i,1),sprite_array(i,2))
      Else
        DisplaySprite(arrays(sprite_array(i,3),0), sprite_array(i,1), sprite_array(i,2)) 
      EndIf
      Debug sprite_array(i,3)
    Next  
    Stop3D()
    
    FlipBuffers()

EndProcedure

Repeat
  EventID = WaitWindowEvent()
  redraw()
Until EventID=#PB_Event_CloseWindow
filereadin_counter ist übrigens die Anzahl verschiedener Sprites, hier aber nicht relevant!

Es geht darum, dass das Prog nicht mehr auf Befehle reagiert, solange es in der Schleife ist (dabei ist das hier schon stark entschlackt!).
Wenn ich es in einen Thread oder eine endlosschleife packe, wird die CPU auslastung enorm, bzw das Bild zieht schlieren.

Mache ich was grundelegendes falsch? ich kann mir nicht vorstellen, dass 36 sprites zuviele sind....

Schonmal danke im Vorraus ;)

Verfasst: 05.08.2007 18:13
von Kaeru Gaman
schau dir mal in der Help zu OpenWindowedScreen() das Beispiel an,
dort wird gezeigt, wie ein Eventloop für nen Windowedscreen aussehen sollte...

Re: Probleme mit Sprites

Verfasst: 05.08.2007 18:43
von PureLust
gnasen hat geschrieben:Es geht darum, dass das Prog nicht mehr auf Befehle reagiert, solange es in der Schleife ist (dabei ist das hier schon stark entschlackt!).
Was soll das heissen "nicht mehr auf Befehle reagiert"?
MausBefehle, Keyboard- oder Joystick-Befehle?
In Deinem EventLoop sind keinerlei Abfragen dafür. :roll:

Verfasst: 05.08.2007 19:18
von gnasen
Was soll das heissen "nicht mehr auf Befehle reagiert"?
MausBefehle, Keyboard- oder Joystick-Befehle?
In Deinem EventLoop sind keinerlei Abfragen dafür.
zB das verschieben vom Fenster. Eigentlich waren da abfragen, habs aber fürs Forum gekürzt ;)

Ich hab mir das in der Hilfedatei mal angeschaut, zieht nicht mehr nach etc, alles okay, nur die CPU Last ist auf ~75% gestiegen

Verfasst: 05.08.2007 19:46
von Kaeru Gaman
> nur die CPU Last ist auf ~75% gestiegen

deine eventschleife brät ja auch voll durch... verwende lieber ein WaitWindowEvent(10) oder so....

außerdem, jedesmal wenn das programm bei FlipBuffers ankommt,
und der nächste VSync noch nicht erreicht ist, wartet FlipBuffers unter Vollast.

sowas kann man aber erst am schluß abstellen, wenn man alles drin hat,
vorher ergeben feinabstimmungen des timings keinen sinn -
du weißt ja noch garnicht, wieviel zeit deine algorithmen brauchen werden.

Verfasst: 05.08.2007 22:42
von gnasen
ok danke für den Tipp, dann lasse ich das ganze erstmal so, tuning dann halt zum schluss, kann man wohl nix machen