Optimierungsthread

Übersicht BlitzBasic FAQ und Tutorials

Neue Antwort erstellen

Eingeproggt

Betreff: Optimierungsthread

BeitragMi, Jun 27, 2007 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Auf "Wunsch" von Abrexxes eröffne ich mal den Optimierungs-Thread. (Hoffentlich nicht ganz ohne Eigennutzen Very Happy )
Also es stehen folgende Seiten als Diskussionsgrundlage zur Verfügung:

Blitzbase - Speedoptimierungs-Tutorial
Blitzbase - "10 goldene Regeln" Smile
Der Anstoß der Diskussion

Achja, zum Thema Framelimiter noch ein Suchergebnis:
https://www.blitzforum.de/foru...amelimiter

So. und jetzt hoffe ich, dass etwas vernünftiges herauskommt Smile
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

Dreamora

BeitragMi, Jun 27, 2007 16:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verschieb ihn Mal in die FAQ Sektion, da es sich um kein Programmierproblem handelt, dennoch nicht irrelevant ist.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Abrexxes

BeitragMi, Jun 27, 2007 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Speicherbänke am Anfang des Programms erstellen und am Ende löschen. Das anlegen innerhalb das Programmablaufs kostet Zeit.

Funktionen mit Maus Abfragen nur dann durchlaufen lassen wenn sie benötigt werden. Wenn zb eine UI am unteren Bildschirmrand ist, ist es effektiver zuerst mal nur zu prüfen ob die Maus überhaupt in der Nähe ist. Ist also die Maus nicht über der UI brauchen die Schleifen zum Abfragen was gedrückt wurde auch nicht durchlaufen zu werden und können übersprungen werden.

Grössere Textpassagen werden ein paar 1000% schneller wenn man sie mit TEXT in den Imagebuffer schreibt maskiert und dann nur noch als Bild auf den Bildschirm (Backbuffer) kopiert. Dazu am besten eine kleine Funktion schreiben.

Das gleiche gilt für Tiles die fix dargestellt werden. Einmal auf den Imagebuffer und als ganzes Bild angezeigt gibt es Tempo Gewinn satt.

Silver_Knee

Betreff: Geordnete listen

BeitragMi, Jul 25, 2007 21:45
Antworten mit Zitat
Benutzer-Profile anzeigen
hat man eine große type menge und man will nur eine bestimmte "sorte" überprüfen/updaten dann macht man das normalerweise einfach so:
Code: [AUSKLAPPEN]
Type Beispiel
Field sorte
End Typ

For count=1 to 99
 b.beispiel=New beispiel
 b\sort=count mod 3
Next

while not Keyhit(1);Main-LOOP
 ;DA ist der hund Begraben
 y=0
 For b.beispiel=Each Beispiel
  If b\sorte=1
   ;Mach was
   Text 0,y,"COOL"
   y=y+FontHeight()
  Endif
 Next


 Flip
 cls
Wend

Das problem bei solchen Abfragen ist das obwohl man nur einen Teil bearbeiten will ALLE objekte durchgegangen werden... man stelle sich vor der PC würde eine Image im arbeitsspeicher verändern, indem er durch den kompletten arbeitsspeicher rennen würde und sich die einzelnen Bytes zusammensuchen würde. Bei 2 GB Arbeitsspeicher wäre er damit bestimmt einige zeit beschfftigt.
Der erste Schritt wäre die Liste zu sortieren und dann beim suchen nach dem letzten objekt das meiner bedingung entspricht die suche abbrechen, da die Liste soritiert ist und danach SICHER keine objekte kommen die ich bei meiner überprüfung vergessen könnte.
also sortieren:
Code: [AUSKLAPPEN]
;Es gibt bestimmt viel bessere und schnellere Sortier algos nur derhier ist übersichtlich
;Zuerst werden alle 2er an den anfang gesetzt
;danach alle 1
;und als letztes werden alle 0er an den anfang der type-liste gesetzt
For count=2 to 0 Step -1
 For b.beispiel=Each Beispiel
  If b\sorte=count
   insert b before first beispiel
  Endif
 Next
Next

und dem code können wir mitteilen wenn wir bereits einen 1er gefunden haben und die schleife einen nicht-einser findet können wir aufhören. in unserem beispiel werden nun statt vorher alle 99 nurnoch 67 durchgegangen (33 nuller, 33 einser und ein zweier der die schleife beendet). der code sieht im ganzen dann so aus:
Code: [AUSKLAPPEN]
Type Beispiel
Field sorte
End Typ

For count=1 to 99
 b.beispiel=New beispiel
 b\sort=count mod 3
Next

;sortieren
For count=2 to 0 Step -1
 For b.beispiel=Each Beispiel
  If b\sorte=count
   insert b before first beispiel
  Endif
 Next
Next

while not Keyhit(1);Main-LOOP
 ;variablen zurücksetzen
 y=0
 gefunden=0
 For b.beispiel=Each Beispiel
  If b\sorte=1
   gefunden=1
   ;Mach was
   Text 0,y,"COOL"
   y=y+FontHeight()
  else ;fals es kein einser sein sollte
   if gefunden=1;aber vorher einser gefunden wurden
    Exit;suchvorgang beenden
   endif
  Endif
 Next


 Flip
 cls
Wend

hmm schon besser aber auch nicht das wahre... denn die 33 nullen am Anfang werden immer noch mitgezählt und der eine zweier für den man einen Schleifendurchlauf braucht kann man doch bestimmt auch entsorgen. eigentlich müsste man nur bei dem ersten einser Anfangen und dann nur noch solange weitermachen bis das nächste Element ein nicht-einser ist... gesagt getan, aber eine For-Each Schleife taugt dazu nicht mehr da sie keinen Startpunkt hat. also erstmal eine For-Each schleife nachbauen:
Code: [AUSKLAPPEN]
b.beispiel=First Beispiel
While b<>null
;inhalt
b=After b
Wend

Damit lässt sich doch was anfangen. Das erste Element muss nun nicht "first beispiel" sein sondern der erste einser... also eine art Adresse... eine Memory-Adresse sein. da kommen wir unserem Vorbild, der Image im Arbeitsspeicher, schon näher.
Code: [AUSKLAPPEN]
For b.beispiel=Each Beispiel
 If b\sorte=1
  erster_einser.beispiel=b
  Exit
 Endif
Next

und da fangen wir unsere schleife an und hören auf sobald das nächste Element ein nicht-einser ist.
Code: [AUSKLAPPEN]
Type Beispiel
Field sorte
End Typ

For count=1 to 99
 b.beispiel=New beispiel
 b\sorte=count mod 3
Next

;sortieren
For count=2 to 0 Step -1
 For b.beispiel=Each Beispiel
  If b\sorte=count
   insert b before first beispiel
  Endif
 Next
Next

;Den ersten einser finden:
For b.beispiel=Each Beispiel
 If b\sorte=1
  erster_einser.beispiel=b
  exit
 Endif
Next

while not Keyhit(1);Main-LOOP
 ;variablen zurücksetzen
 y=0
 b.beispiel=erster_einser
 While b<>null
  If b\sorte=1
   ;Mach was
   Text 0,y,"COOL"
   y=y+FontHeight()
   b=after b;nächstes objekt anwählen
   if b<>null;wenn ein nächstes objekt existiert
    if b\sorte<>1;und es kein einser ist
     Exit ;Schleife beenden
    endif
   else;exestiert kein nächstes objekt
    Exit;sowieso aufhören
   endif
  Endif
Wend


 Flip
 cls
Wend

Diese Schleife läuft tatsächlich nur 33 mal durch wie sie es soll. Besonders hilfreich sind diese sortierten listen bei Types die zu anderen Types "gehören":
Code: [AUSKLAPPEN]
For a.alpha=Each alpha
For b.beta=Each beta
 if b\zu_alpha=a
  ;TU WAS
 Endif
Next
Next

Gibt man alpha ein Field "first_beta.beta" und ordnet die beta liste ist mit der Technik eine Einsparung von zig Schleifendurchläufen fast gewährleistet.
  • Zuletzt bearbeitet von Silver_Knee am Sa, Dez 15, 2007 13:39, insgesamt 3-mal bearbeitet

Eingeproggt

BeitragDo, Aug 02, 2007 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab jetzt mal kurz das Forum durchsucht (5 Seiten der 70 angezeigten in der Suche durchstöbert) und hab wie versprochen einiges noch zusammengekratzt.

"Warum soll mein Spiel nicht 100% CPU fressen?"
Abrexxes hat Folgendes geschrieben:
A) Reduziert die Lebenszeit des Systems bis zu 2/3 (Schätzwert normale 08/15 CPU) da die Lebensdauer durch die Temperatur der CPU masgeblich beeinflusst wird. Und das sogar für ein Pong.

B) Verbraucht bis zu 6+ mal mehr Strom, je stärker die CPU desto mehr Strom wird verpullfert, und das ohne Sinn und Zweck.

C) Kann Netzwerk/Lan Systeme lahmlegen da der PC zb Daten ncht mehr in dem Tempo freigeben kann wie gewöhnlich. Der Tot jedes Arbeitsplatzes wenn bei relevanten Daten der Server plötzlich auf minimum Ping, da fragt sich jeder Chef. "Ja was machen die denn da, ist da ein Rechner nicht in Ordung?"

D) Bringt das System in Stress-situation da alle Systemrelevanten Task (können bis zu 200 sein) ebenfalls davon betroffen sind. Dies kann bei schlecht Systemen zu Crashs führen, insbesondere bei älteren.

E) Bremst alle anderen Programme bis auf 1% runter die Nebenbei laufen und Arbeitszeit benötigen. (Auch externe dlls etc)


Für 3D-Programmierer / -Modeller:

x-pressive hat Folgendes geschrieben:
Anzahl der Surfaces

Das wichtigste ist, die Anzahl der Surface einzudämmen. Jedes Mesh nutzt eine Surface, bei einer Anzahl ab fünfzig bis hundert aufwärts ist auf langsamen PC oder Laptops schon mal Schluss mit Speed. Wenn man nun aber alle Objekte in ein einziges Mesh legt (Single-Surface Technik), springt die FPS-Zahl selbst bei einigen hundert Objekten wieder auf einige hundert FPS (sofern sie sich das selbe Mesh teilen). Wer also über Performance meckert, sollte sich erst mal in Single Surface Techniken einarbeiten und seine Hausaufgaben machen.

Mesh-Optimierung I

Der zweite häufige Fehler ist, das Meshes nicht genug optimiert werden. Viele modellieren ihre Meshes mit dutzenden von Unterobjekten und exportieren das dann als .3ds oder .b3d. Dabei bleiben alle Unterobjekte erhalten, jedes benutzt dann im schlimmsten Fall eine eigene Surface. Wenn Unterobjekte im Spiel nicht unbedingt gebraucht werden, sollte man beim Exportieren darauf achten, daß das Mesh nur als ein einziges Objekt exportiert wird bzw. mit so wenigen Unterobjekten, wie möglich. Das setzt natürlich voraus, das man möglichst nur eine Textur für das Modell benutzt (jede weitere Textur würde eine Surface hinzufügen, ausgenommen Texturen auf mehreren Layern).

Mesh-Optimierung II

Worauf viele ebenfalls nicht achten: ihre Modelle bestehen oft aus drei- bis viermal so vielen Vertices, wie nötig. Viele Modeller sind ganz klar nicht auf Low-Poly ausgelegt und scheuen sich nicht, an jeder stelle vier oder fünf Vertices zu erzeugen, wo nur eines nötig wäre. Ein gutes Beispiel ist hier LithUnwrap. Wenn man ein Modell aus Cinema4D exportiert, in Lith lädt, dort die Texturen anpasst und danach wieder in Cinema lädt, wurde die Vertex-Anzahl des Modells verfünffacht(!), ohne das man es eigentlich bemerkt. Modelle also immer vor dem entgültigen Export optimieren (mittels Plugin oder manuell).


Ebenfalls für 3D-User:
FastImage und FastText

Edit: Link dank FTC geändert.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
  • Zuletzt bearbeitet von Eingeproggt am Fr, Aug 03, 2007 7:26, insgesamt 2-mal bearbeitet
 

Dreamora

BeitragDo, Aug 02, 2007 21:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit den Unterobjekten ist kein Problem. Wenn man die nicht braucht, macht man statt LoadAnimMesh einfach LoadMesh, dann wird die Hierarchie aufgehoben und man hat den gleichen Effekt wie ohne Unterobjekte.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Evolver01

BeitragMi, Aug 08, 2007 1:09
Antworten mit Zitat
Benutzer-Profile anzeigen
x-pressive hat Folgendes geschrieben:
Anzahl der Surfaces

...Wenn man nun aber alle Objekte in ein einziges Mesh legt ...

Mesh-Optimierung I

...
Viele modellieren ihre Meshes mit dutzenden von Unterobjekten und exportieren das dann als .3ds oder .b3d. Dabei bleiben alle Unterobjekte erhalten, jedes benutzt dann im schlimmsten Fall eine eigene Surface.
...


Entschuldigung... ÄÄÄhm wiederspricht sich das nicht iwi ein bisschen?

beim ersten wird gesagt "hau ruhig ein paar mehr sachen in eine mesh", und beim zweiten "NÖÖÖ blOss nicht mehrere sachen in ein mesh hauen"
Grafiker von Space Threat...

Silver_Knee

BeitragMi, Aug 08, 2007 2:22
Antworten mit Zitat
Benutzer-Profile anzeigen
es geht nicht um die anzahl der Childs in einer Mesh sondern der Gesamtzahl aller Meshs und surfaces
 

Dreamora

BeitragMi, Aug 08, 2007 8:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Jedes Child in einer Entity (es gibt keine Childs in Meshes) ist eine eigene Entity und damit ein eigenes Mesh mit mindestens einer eigenen Surface. (ausgenommen sind Bones, die keine Meshes sind sondern naja ... Bones, was extended Pivots sind mit einigen Zusatzinfos)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzBasic FAQ und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group