performance probleme mit structures

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Purebasium
Beiträge: 74
Registriert: 05.02.2014 22:08
Computerausstattung: Ein Computer halt.
Mit Windows 7
und mit AMD Phenom(tm) II X4 B50 Prozessor
und einer ATI Radeon HD 5450 Grafikkarte
Wohnort: Mars, Kraterstr. 57b, Apartment 7

performance probleme mit structures

Beitrag von Purebasium »

hallo allerseits,
ich hab ein kleines Performance Problem damit:

Code: Alles auswählen


Structure Objeigenschaft
  x.l
  y.l
  name.s
EndStructure


Global Dim Mensch.Objeigenschaft(1000)

;main beginnt hier 

  ;häuser anzeigen
    For y = 1 To 200
    For x = 1 To 200
      bau=BauDaten(X, y);map in welcher die häuser gespeichert sind
      

      If bau <>0;wenn Bau =0 dann steht kein Haus
        DisplayTransparentSprite(bau+100, x*50,y*25)
      EndIf  
      
      ;-menschen
      For z = 1 To 100 
            If x = mensch(z)\x And y=mensch(z)\y
             DisplayTransparentSprite(7, mensch(z)\x*50,mensch(z)\y*25)
            EndIf
      Next z

      
    Next x
  Next y
  
Ich will grundsätzlich eine kleine Stadt anzeigen mit einigen Häusern und Menschen.

das mit den Häusern klappt ganz gut.
Nur mit den Menschen hab ich folgendes Problem:
Die perspektive entsteht ja dadurch, dass die hintersten häuser zuerst angezeigt werden und somit die häuser, die weiter vorne sind, diese teilweise überdecken.
Da ein mensch ja z.b. auch hinter einem haus sein kann, muss ich doch jedes mal abfragen, ob ein mensch auf einem Feld steht.
Ich kann die häuser problemlos in einer map speichern, da auf jedem Feld nur EIN haus sein kann. auf einem Feld können aber mehrere Menschen stehen.
das Problem ist halt ich habe somit 200*200*100(bei 100 Menschen) abfragen auf

Code: Alles auswählen

If x = mensch(z)\x And y=mensch(z)\y
pro Frame und das packt das Programm nicht.
kann mir jemand helfen oder hab ich mich zu unklar ausgedrückt?
danke schonmal im vorraus!
"Ordnung braucht nur der Dumme, das Genie beherrscht das Chaos. "
Albert Einstein
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: performance probleme mit structures

Beitrag von edel »

Nicht das ich davon Ahnung haette von dem was du da machs, aber warum nutzt du nicht einfach nur eine Objektliste?
Benutzeravatar
Purebasium
Beiträge: 74
Registriert: 05.02.2014 22:08
Computerausstattung: Ein Computer halt.
Mit Windows 7
und mit AMD Phenom(tm) II X4 B50 Prozessor
und einer ATI Radeon HD 5450 Grafikkarte
Wohnort: Mars, Kraterstr. 57b, Apartment 7

Re: performance probleme mit structures

Beitrag von Purebasium »

Nicht das ich eine Ahnung hätte was du damit meinst.
Mein Problem ist dabei, dass wenn ich den menschen anzeigen will, der hinter dem Haus sein soll, das vor ihm liegt, aber auch vor dem haus, das hinter ihm liegt.
deshalb muss ich nachdem ein Feld angezeigt wird, jedes mal alle 100 menschen überprüfen muss, ob jetzt angezeigt einer werden muss.(er muss mitten drin angezeigt werden, dass falls ihn ein haus weiter vorne wirklich überdeckt und das er alle häuser hinter sich überdeckt)
"Ordnung braucht nur der Dumme, das Genie beherrscht das Chaos. "
Albert Einstein
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: performance probleme mit structures

Beitrag von edel »

Ja, und genau das hast du bei einer Liste eben nicht. Du schiebst das Objekt vom Typ Mensch einfach zwischen 2 andere Objekte.
Benutzeravatar
Purebasium
Beiträge: 74
Registriert: 05.02.2014 22:08
Computerausstattung: Ein Computer halt.
Mit Windows 7
und mit AMD Phenom(tm) II X4 B50 Prozessor
und einer ATI Radeon HD 5450 Grafikkarte
Wohnort: Mars, Kraterstr. 57b, Apartment 7

Re: performance probleme mit structures

Beitrag von Purebasium »

Wie setzte ich das im Code um?
"Ordnung braucht nur der Dumme, das Genie beherrscht das Chaos. "
Albert Einstein
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: performance probleme mit structures

Beitrag von NicTheQuick »

Ich würde an das Bau()-Array noch eine Struktur dran hängen, in der die Bau-ID und eine LinkedList aller Menschen ist.
Benutzeravatar
Purebasium
Beiträge: 74
Registriert: 05.02.2014 22:08
Computerausstattung: Ein Computer halt.
Mit Windows 7
und mit AMD Phenom(tm) II X4 B50 Prozessor
und einer ATI Radeon HD 5450 Grafikkarte
Wohnort: Mars, Kraterstr. 57b, Apartment 7

Re: performance probleme mit structures

Beitrag von Purebasium »

Ich würde an das Bau()-Array noch eine Struktur dran hängen, in der die Bau-ID und eine LinkedList aller Menschen ist.
Ich bin jetzt nicht gerade der experte in dem gebiet structures.
Kann du mir vielleicht sagen, wie ich das umsetzten kann?
Danke!
"Ordnung braucht nur der Dumme, das Genie beherrscht das Chaos. "
Albert Einstein
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: performance probleme mit structures

Beitrag von edel »

Vielleicht so:

Code: Alles auswählen

enumeration
 #OBJ_MENSCH
 #OBJ_HAUS
endenumeration

Structure ObjectListe
 Type.l
 x.l
 y.l
 Name.s
Endstructure

Newlist ObjList.ObjectListe()
Addelemnt(ObjList())
ObjList()\Type = #OBJ_MENSCH
ObjList()\x = 10
ObjList()\x = 12

Addelemnt(ObjList())
ObjList()\Type = #OBJ_Haus
ObjList()\x = 14
ObjList()\x = 17

[...]

foreach ObjList()
	[...]
next
Benutzeravatar
Purebasium
Beiträge: 74
Registriert: 05.02.2014 22:08
Computerausstattung: Ein Computer halt.
Mit Windows 7
und mit AMD Phenom(tm) II X4 B50 Prozessor
und einer ATI Radeon HD 5450 Grafikkarte
Wohnort: Mars, Kraterstr. 57b, Apartment 7

Re: performance probleme mit structures

Beitrag von Purebasium »

@edel

hab ich damit nicht dann das Problem, dass bei ForEach ObjList() die Reihenfolge (damit hinten ist was hinter gehört und vorne ist was vorne sein soll)
irgendwann nicht stimmt, wenn man z.b. neue Objekte einfügt oder sich Attributwerte verändern?
"Ordnung braucht nur der Dumme, das Genie beherrscht das Chaos. "
Albert Einstein
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: performance probleme mit structures

Beitrag von NicTheQuick »

So wie edel das gemacht hat, meinte ich das auch nicht. Eher eine Liste pro Feld.

Code: Alles auswählen

Enumeration
	#OBJ_MENSCH
	#OBJ_HAUS
EndEnumeration

Structure Object
	Type.i
	Name.s
EndStructure

Structure Field
	List objects.Object()
EndStructure

#MAP_WIDTH = 200
#MAP_HEIGHT = 200

Global Dim Fields.Field(#MAP_WIDTH - 1, #MAP_HEIGHT - 1)

Procedure.i addObject(x.i, y.i, type.i)
	If (x < 0 Or x >= #MAP_WIDTH Or y < 0 Or y >= #MAP_HEIGHT)
		ProcedureReturn #False
	EndIf
	With Fields(x, y)
		If AddElement(\objects())
			\objects()\Type = type
			ProcedureReturn #True
		EndIf
	EndWith
	ProcedureReturn #False
EndProcedure

Procedure.i addHuman(x.i, y.i)
	ProcedureReturn addObject(x, y, #OBJ_MENSCH)
EndProcedure
Procedure.i addHouse(x.i, y.i)
	ProcedureReturn addObject(x, y, #OBJ_HAUS)
EndProcedure

; Füge zwei Menschen und ein Haus an Position 10, 20 hinzu
addHuman(9, 19)
addHuman(9, 19)
addHouse(9, 19)

; Zeige alle Felder an
For y = 0 To #MAP_HEIGHT - 1
	For x = 0 To #MAP_WIDTH - 1
		ForEach Fields(x, y)\objects()
			With Fields(x, y)\objects()
				Select \type
					Case #OBJ_HAUS:
						;Male Hause
					Case #OBJ_MENSCH
						;Male Mensch
				EndSelect
			EndWith
		Next
	Next
Next
Da du aber sagst, dass pro Feld eh nur ein Haus sein kann, kann man das auch noch optimieren.
Antworten