Optimierungsthread
Übersicht

![]() |
EingeproggtBetreff: Optimierungsthread |
![]() Antworten mit Zitat ![]() |
---|---|---|
Auf "Wunsch" von Abrexxes eröffne ich mal den Optimierungs-Thread. (Hoffentlich nicht ganz ohne Eigennutzen ![]() Also es stehen folgende Seiten als Diskussionsgrundlage zur Verfügung: Blitzbase - Speedoptimierungs-Tutorial Blitzbase - "10 goldene Regeln" ![]() 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 ![]() |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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_KneeBetreff: Geordnete listen |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
es geht nicht um die anzahl der Childs in einer Mesh sondern der Gesamtzahl aller Meshs und surfaces | ||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group