Programm wird langsamer und langsamer

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Milchshake
Beiträge: 166
Registriert: 30.01.2006 17:47
Wohnort: Zwischen dem Sessel und dem Computer

Programm wird langsamer und langsamer

Beitrag von Milchshake »

Hab da ein problem
Wenn ich das programm starte wird es immer langsamer und langsamer und irgentwan ist es aus.Was tun?

Code: Alles auswählen

;TST 03
InitSprite()
InitKeyboard()
OpenScreen(1024,768,32,"TST 2")

CreateSprite(0,64,64)
  StartDrawing( SpriteOutput(0) )
    Circle(32,32,16,$ff0000)
  StopDrawing()
CreateSprite(50,64,64)
  StartDrawing( SpriteOutput(2))
    Box(2,2,60,60,$aa6666)
  StopDrawing()
SetFrameRate(70)
Structure Mauer
 x.w
 y.w
 Image.w
 mauer.w 
EndStructure 
NewList Mauer .Mauer()
Procedure Obj(Sprite, x, y,mauer)
  AddElement(Mauer())           
  Mauer()\x      = x
  Mauer()\y      = y
  Mauer()\Image  = Sprite
  Mauer()\mauer  = mauer
EndProcedure
Procedure Ojball(Sprite, x, y,mauer)
  AddElement(Mauer())           
  Mauer()\x      = x
  Mauer()\y      = y
  Mauer()\Image  = Sprite
  Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\x      = x+0
Mauer()\y      = y+64
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\x      = x+0
Mauer()\y      = y+128
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\x      = x+0
Mauer()\y      = y+192
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\y      = y+0
Mauer()\x      = x+256
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\x      = x+0
Mauer()\y      = y+320
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\x      = x+0
Mauer()\y      = y+384
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\x      = x+0
Mauer()\y      = y+448
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\x      = x+0
Mauer()\y      = y+512
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\x      = x+0
Mauer()\y      = y+576
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\x      = x+0
Mauer()\y      = y+640
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\x      = x+0
Mauer()\y      = y+192
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\x      = x+0
Mauer()\y      = y+704
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\x      = x+0
Mauer()\y      = y+256
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
EndProcedure


lvl = 1
playergo = 0
Repeat
    ExamineKeyboard()
If lvl = 1
Gosub iniobj
  Gosub grundgras
  Gosub steuerung
Gosub collision
  DisplayTransparentSprite(0, offX,offY)
EndIf  





  FlipBuffers()
  ClearScreen(0,0,0)
  
Until KeyboardReleased(#PB_Key_Escape) 





steuerung :
  
  If KeyboardReleased(#PB_Key_Right) And playergo = 0
    offX+64
  playergo = 7
  go = 1
  EndIf
  If KeyboardReleased(#PB_Key_Left) And playergo = 0
    offX-64
  playergo = 7
  go = 2
  EndIf
  If KeyboardReleased(#PB_Key_Up) And playergo = 0
    offY-64
  playergo = 7
  go = 3
  EndIf
  If KeyboardReleased(#PB_Key_Down) And playergo = 0
    offY+64
  playergo = 7
  go = 4
  EndIf
  If offX < 0
  offX = 0
  EndIf  
  If offY < 0
  offY = 0
  EndIf 
  If offy > 704
  offY = 704
  EndIf 
  If offX > 960
  offX = 960
  EndIf 
  playergo - 1
  If playergo < 0
  playergo = 0
  EndIf 
    StartDrawing(ScreenOutput())
  FrontColor(225,225,225)
  DrawingMode(1)
  Locate(10,0)
  DrawText(Str(offX))
  Locate(10,10)
  DrawText(Str(offY))
  StopDrawing()
  Return 


collision :
 ResetList(Mauer())
  While NextElement(Mauer())
If SpriteCollision(0,offx,offy,Mauer()\Image,Mauer()\x,mauer()\y)
If go = 1 And Mauer()\x = offX And Mauer()\y = offY And Mauer()\mauer = 1
offx - 64
EndIf
If go = 2 And Mauer()\x = offX And Mauer()\y = offY And Mauer()\mauer = 1
offx + 64
EndIf
If go = 3 And Mauer()\x = offX And Mauer()\y = offY And Mauer()\mauer = 1
offy + 64
EndIf
If go = 4 And Mauer()\x = offX And Mauer()\y = offY And Mauer()\mauer = 1
offy - 64
EndIf
EndIf
Wend
 Return
 
 iniobj :
 ResetList(Mauer())
  While NextElement(Mauer())
    DisplayTransparentSprite(Mauer()\Image,Mauer()\x, Mauer()\y)
   Wend   
   Return 
   
 grundgras :
Ojball(50,0,0,0)
Ojball(50,64,0,0)
Ojball(50,128,0,0)
Ojball(50,192,0,0)
Ojball(50,256,0,0)
Ojball(50,320,0,0)
Ojball(50,384,0,0)
Ojball(50,448,0,0)
Ojball(50,512,0,0)
Ojball(50,576,0,0)
Ojball(50,640,0,0)
Ojball(50,704,0,0)
Ojball(50,768,0,0)
Ojball(50,832,0,0)
Ojball(50,896,0,0)
Ojball(50,960,0,0)
 Return   

Bitte Helfen :mrgreen:
Hab jetzt PB 4.02
Muhahaha!!!!
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Du springst während jedes Programmdurchlaufs zu "grundgras"

Da wir x mal diese Procedure ausgeführt

Code: Alles auswählen

Procedure Ojball(Sprite, x, y,mauer)
  AddElement(Mauer())           
  Mauer()\x      = x
  Mauer()\y      = y
  Mauer()\Image  = Sprite
  Mauer()\mauer  = mauer 
AddElement(Mauer())

ist das Problem, deine Linked List wächst ins unendliche.
Benutzeravatar
Milchshake
Beiträge: 166
Registriert: 30.01.2006 17:47
Wohnort: Zwischen dem Sessel und dem Computer

Beitrag von Milchshake »

wie soll ich das am besten beheben?
Hab jetzt PB 4.02
Muhahaha!!!!
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Milchshake hat geschrieben:wie soll ich das am besten beheben?
Durch DeleteElement()?
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Milchshake
Beiträge: 166
Registriert: 30.01.2006 17:47
Wohnort: Zwischen dem Sessel und dem Computer

Beitrag von Milchshake »

thx(bin gar ned auf die idee gekommen)
Hab jetzt PB 4.02
Muhahaha!!!!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

DarkDragon hat geschrieben:
Milchshake hat geschrieben:wie soll ich das am besten beheben?
Durch DeleteElement()?
quark!

man behebt doch ein problem nicht dadurch, dass man es direkt nach seiner erzeugung eliminiert,
jedenfalls nicht, wenn man selbst für die erzeugung verantwortlich ist.

verhindere gleich die erzeugung des problems!

also, strick den code so um, dass unnötige creates überhaupt nicht aufgerufen werden!
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Milchshake
Beiträge: 166
Registriert: 30.01.2006 17:47
Wohnort: Zwischen dem Sessel und dem Computer

Beitrag von Milchshake »

hab ich vorher probiert(das mit delete element) doch irgentwie hab ich einen generrellen hänger im prog
sobald ich die Procedure Obj aufrufe ( ich habs daweil umgeprogt a bissl) hängt das ganze mal und wird automatisch langsamer und langsamer uns langsamer
das gleiche problem besteht also noch immer :(
hab kA was ich falsch gmacht habe :?
Hab jetzt PB 4.02
Muhahaha!!!!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

...den aufruf in ner schleife, wo er nich hingehört?


...permanent aufgerufen, obwohl er nur bedingt aufgerufen werden sollte?

..ey, normalle "that's it"
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Es könnte auch an dem seltsamen Coding-Style liegen, dass du nicht mehr durchblickst.
Wie kann sowas z.B. passieren:

Code: Alles auswählen

Repeat
    ExamineKeyboard()
If lvl = 1
Gosub iniobj
  Gosub grundgras
  Gosub steuerung
Gosub collision
  DisplayTransparentSprite(0, offX,offY)
EndIf 





  FlipBuffers()
  ClearScreen(0,0,0)
 
Until KeyboardReleased(#PB_Key_Escape)
Findest du sowas nicht irgendwie übersichtlicher ?:

Code: Alles auswählen

Repeat
	ExamineKeyboard()
	If lvl = 1
		Gosub iniobj
		Gosub grundgras ;(*Hust*)
		Gosub steuerung
		Gosub collision
		DisplayTransparentSprite(0, offX,offY)
	EndIf 

	FlipBuffers()
	ClearScreen(0,0,0)

Until KeyboardReleased(#PB_Key_Escape)
Werden bei dir Leer- bzw. Tabzeichen per Zufallsgenerator gesetzt ?

Ich denke mal durch etwas bessere Strukturen fällt dir auch der Fehler auf.
Benutzeravatar
Milchshake
Beiträge: 166
Registriert: 30.01.2006 17:47
Wohnort: Zwischen dem Sessel und dem Computer

Beitrag von Milchshake »

habs jetzt nochmal ein paar mal probiert und komm
trotzdem nicht auf die richtige idee
ich denke ,das sich mehrere Sprites überlappen und das dass der fehler ist,
nur ich weiß nicht wie ich das beheben soll
ich glaub ich bin unfähig :freak:
Hab jetzt PB 4.02
Muhahaha!!!!
Antworten