Types, Tiles und Performance

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Neoxit

Betreff: Types, Tiles und Performance

BeitragSo, Dez 05, 2010 12:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Halli Hallo meine lieben,

wie einige bestimmt schon in meinem Projekt Topic feststellen konnten, gibt es bei vielen Leuten ein tierisches Problem was die Auslastung des Systems angeht (ja ich habe einen Frametimer Wink ).

https://www.blitzforum.de/foru...hp?t=36205

Ich kann nur absolut nicht sagen, wie ich es noch mehr Performanceentlastender gestalten kann =/

Es geht um Grabber. Ich verwende für Verschiedene Dinge Types, zu beginn nutze ich genau 4 Types (Derzeitig noch):

(P.s.: Ja, ich weiß wortschreibungen deutsch /englisch so wie player_x, playerY schreibungen gemischt, sollte nicht sein auf eine festlege^^)

Code: [AUSKLAPPEN]

Type TLevel
   Field id,x,y,img,frame,name$,live,passable,mineable,growable,drop,drop_menge,toolaffect,blockreact
End Type

Type TUmgebung
   Field id,x,y,img,live,frame
End Type

Type TBlockdatei
   Field id,img,frame,name$,live,passable,mineable,growable,drop,drop_menge,toolaffect,blockreact,r,g,b
End Type

Type TFarbtabelle
   Field blockid,r,g,b
End Type



Soweit meine Types. Meine Blockinformationen werden folgendermaßen ausgelesen:

Code: [AUSKLAPPEN]

blockfile = OpenFile("bin/blocks/blocks.txt")
datensaetze = ReadLine(blockfile)
ReadLine(blockfile)
For i = 1 To datensaetze
   dat_block.TBlockdatei = New TBlockdatei
   dat_block\id = ReadLine(blockfile)
   img_path$ = ReadLine$(blockfile)
   dat_block\frame = ReadLine(blockfile)
   dat_block\img = LoadAnimImage(img_path$,32,32,0,dat_block\frame)
   dat_block\name$ = ReadLine(blockfile)
   dat_block\live = ReadLine(blockfile)
   dat_block\passable = ReadLine(blockfile)
   dat_block\mineable = ReadLine(blockfile)
   dat_block\growable = ReadLine(blockfile)
   dat_block\drop = ReadLine(blockfile)
   dat_block\drop_menge = ReadLine(blockfile)
   dat_block\toolaffect = ReadLine(blockfile)
   dat_block\blockreact = ReadLine(blockfile)
   dat_block\r = ReadLine(blockfile)
   dat_block\g = ReadLine(blockfile)
   dat_block\b = ReadLine(blockfile)
   ReadLine(blockfile)
Next
CloseFile(blockfile)


Und mein Level wird folgendermaßen Generiert:

Code: [AUSKLAPPEN]

;////////////////////////////////////
;Levelbitmap einlesen und erstellen
;Image zum auslesen zeichnen
mapoverlay = LoadImage("bin/level/level2.bmp")
mapoverlay_hoehe = ImageHeight(mapoverlay)
mapoverlay_breite = ImageWidth(mapoverlay)

DrawImage mapoverlay,0,0

pixelreader_x = 0
pixelreader_y = 0

For j = 1 To mapoverlay_hoehe
   For i = 1 To mapoverlay_breite
      integer_rgb = ReadPixel(pixelreader_x,pixelreader_y,BackBuffer())
      col_r = RWertLesen(integer_rgb)
      col_g = GWertLesen(integer_rgb)
      col_b = BWertLesen(integer_rgb)
      
      For dat_block.TBlockdatei = Each TBlockdatei
         If dat_block\r = col_r And dat_block\g = col_g And dat_block\b = col_b Then
            block.Tlevel = New Tlevel
            block\id = dat_block\id
            block\x = blockplacer_x
            block\y = blockplacer_y
            block\img = dat_block\img
            block\frame = 0
            block\name$ = dat_block\name$
            block\live = dat_block\live
            block\passable = dat_block\passable
            block\mineable = dat_block\mineable
            block\growable = dat_block\growable
            block\drop = dat_block\drop
            block\drop_menge = dat_block\drop_menge
            block\toolaffect = dat_block\toolaffect
            block\blockreact = dat_block\blockreact
         EndIf
      Next
      
      pixelreader_x = pixelreader_x + 1
      blockplacer_x = blockplacer_x + 32 ;Koordinaten für den nächsten Block in der weite vorbereiten
Next

pixelreader_x = 0
pixelreader_y = pixelreader_y + 1
blockplacer_x = 0
blockplacer_y = blockplacer_y + 32 ; Koordinaten für den nächsten Block in der Höhe vorbereiten

Next
;//////////////////////////////////





Liest er auch Korrekt ein, läuft also alles soweit, nun aber natürlich die beiden Abfragen die in meinen Augen Höchstwahrscheinlich der "Performanceknubbl" ist:




Code: [AUSKLAPPEN]

For block.Tlevel = Each Tlevel   

   ;Level / Blöcke Zeichnen
   If block\x >= 0 And block\y >= 0 And block\x <= 1024 And block\y <= 768
      DrawImage block\img,block\x,block\y,Block\frame
   EndIf

   ;Untere Kollision
   If ImagesCollide(col_dummy_unten,col_dummy_unten_x,col_dummy_unten_y,0,block\img,block\x,block\y,0) And block\passable = False Then
      player_y = player_y_old
   EndIf
   
   ;Linke Kollision
   If ImagesCollide(col_dummy_links,col_dummy_links_x,col_dummy_links_y,0,block\img,block\x,block\y,0) And block\passable = False Then
      player_x = player_x_old
   EndIf
   
   ;Rechte Kollision
   If ImagesCollide(col_dummy_rechts,col_dummy_rechts_x,col_dummy_rechts_y,0,block\img,block\x,block\y,0) And block\passable = False Then
      player_x = player_x_old
   EndIf
   
   ;Obere Kollision
   If ImagesCollide(col_dummy_oben,col_dummy_oben_x,col_dummy_oben_y,0,block\img,block\x,block\y,0) And block\passable = False Then
      player_y = player_y_old
      ;Spieler kollidiert mit oberen = Jumpflag ausmachen
      flag_springen = False
      flag_fallen = True
      jumptimer = 0
   EndIf   
Next


Und ja, diese abfrage wird in JEDEM schleifendurchgang gemacht. Für jeden Blocktype der vorhanden ist. Sollte das auch in euren Punkten der extremlastige Punkt sein... sagt mir wie ich es besser machen kann geschweige denn noch anders ansprechen kann.. =/

Ich habe nun schon die meisten Punkte wo pro schleifendurchlauf häufiger der gesamte Type angesprochen wurde entfernt und verallgemeinert. Allerdings kann das langsam nich mehr sein.. selbst wenn ich ein Level mit nur 10x10 Tiles baue geht bei mir die Prozessorleistung windowed auf um die 46 % Prozessorausleistung (Dualcore also quasi 92 % auf 1 Kern) warum?

Ich bin Ratlos.

Mir ist bewusst, das ich keine Ganzen Codeteile posten soll, sondern nur fetzen, die ersten 2 - 3 sind allerdings nur dafür da, damit ihr nachvollziehen könnt für was der entsprechende Type etc. ist und was er macht.

Gruß Neoxit

mpmxyz

BeitragSo, Dez 05, 2010 12:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Da du nur 5% Auslastung im Fullscreen hast, denke ich, dass du Flip ohne 0 als Parameter verwendest und eventuell keinen Timer nutzt.
Arrow Hurra, 100% Auslastung
mfG
mpmxyz
Edit: Vermute nicht, miss! Die gebrauchte Zeit von mehreren Code-Abschnitten lässt sich einfach mit Millisecs messen.
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Neoxit

BeitragSo, Dez 05, 2010 12:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Halli Hallo meine lieben,

wie einige bestimmt schon in meinem Projekt Topic feststellen konnten, gibt es bei vielen Leuten ein tierisches Problem was die Auslastung des Systems angeht (ja ich habe einen Frametimer Wink ).


Frametimer ist also drinne und Flip habe ich auch mit VSync mal ausprobiert, die selbe auslastung. Auch laut Hubsi im anderen Topic besitzt er bei Fullscreen 100% auslastung.

Neoxit

BeitragSo, Dez 05, 2010 12:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Ahh ich hab dich missverstanden!

Riesen Dickes Dankeschön ich dacht ich werd bekloppt!
Flip 0 <> Flip 1 / Flip...

mein gott Flipp 0 hat mich gerettet.

So ein Simpler fehler und ich Stell den Code 100 x um...
0-1 % sinds nun.... DANKE! xD

Xeres

Moderator

BeitragSo, Dez 05, 2010 12:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Bitte beachte auch noch:
Arrow FAQ: ImagesCollide & Memory Access Violation ?!
Arrow Ich würde immer raten - auch wenn BB das für Anfänger nicht erzwingt - alle Variablen zu deklarieren.
Arrow Genauso sei dir IDEal angeraten, wenn du noch die Blitz Standard-IDE verwendest.
Arrow Wenn du deine Types etwas auseinander ziehst, ist der Code viel lesbarer...
Code: [AUSKLAPPEN]
Type TLevel
    Field id, x, y
    Field img, frame
    Field name$, live
    Field passable, mineable, growable
    Field drop, drop_menge
    Field toolaffect, blockreact
End Type
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neoxit

BeitragSo, Dez 05, 2010 12:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Arrow FAQ: ImagesCollide & Memory Access Violation ?! - Ist mir bereits bekannt, werde ich aber wohl erst dann umsetzen wenn die grundprobleme mit der Performance beseitigt sind.

Arrow Ich würde immer raten - auch wenn BB das für Anfänger nicht erzwingt - alle Variablen zu deklarieren. - Speicherschonender?

Arrow Genauso sei dir IDEal angeraten, wenn du noch die Blitz Standard-IDE verwendest. - Ja nutze Standart, werde sie mir mal anschauen

Arrow Wenn du deine Types etwas auseinander ziehst, ist der Code viel lesbarer... - Bis ich mir eine neue "Schreibweise" angewöhnt habe könnte das ein wenig dauern aber ich werds versuchen zu beherzigen Wink

Xeres

Moderator

BeitragSo, Dez 05, 2010 12:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Hat nichts mit dem Speicher zu tun, aber damit, wie oft man sich vertippt und damit seltsame Bugs kreiert. IDEal kann dir was falsch geschriebenes dann in leuchtend rot anzeigen - und Autokomplettieren.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neoxit

BeitragSo, Dez 05, 2010 12:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok danke nochmal Xeres, werde es mir direkt mal anschauen.

Grabber 0.00.9_2a
http://rapidshare.com/files/43...0.9_2a.rar

Das kleine Update was die Performance steigern sollte.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group