 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
_Gorgon

Anmeldungsdatum: 04.01.2008 Beiträge: 16 Wohnort: Heidelberg
|
Verfasst am: 16.01.2008, 18:31 Titel: Quellcode Optimieren |
|
|
Hi.. ich bin eigentlich vom DarkBASIC-Forum (http://www.fastsync.de/3dgc/modules/news/), aber ich programmiere in FreeBASIC eine 2D Physik-Engine (in eine dll) für DarkBASIC.
Die Engine muss natürlich möglichst schnell sein.. deshalb frag ich mich beim Coden immer ff.:
1. Ein Körper besteht in meiner Engine aus mehreren Polygonen (2D-Vielecke), welche welche wieder aus Vertices bestehen (Eckpunkte der Polygone).
Wenn ich nun auf ein bestimmten Vertex zugreifen will, dann muss ich Beispielsweise ff. Code schreiben:
Code: | Bd[BdInd].Poly[T].Vert[U].StateDist |
ich habe also mehrere dynamische Arrays in dynamischen Arrays..
Ich frage mich nun, ob es nicht rechenintesiv ist, über mehrere Pointer auf einen Vertex zuzugreifen..
An der Programmstruktur will ich nichts ändern, aber wissen, ob es vielleicht ein Performancegewinn gibt, wenn man am Anfang der jeweiligen Sub einfach den Zeiger auf das obige Vertexarry extra speichert, um die vielen Pointerverschachtelungen zu umgehen.
Also:
Code: | Dim Vertices As TVertex Ptr = Bd[BdInd].Poly[T].Vert |
Es macht im normalfall wahrscheinlich keinen großen unterschied. Ich frage mich aber, ob Funktionen die oft aufgerufen werden dadurch einen
Performancegewinn haben?!
So.. sehr umständlich gefragt! Ich hoffe, ihr versteht mich
2. Dann verwende ich natürlich auch den rechenintensiven cosinus und sinus..
Wenn ich nun Beispielsweise 50000 Werte des Sinus am Anfang in ein statisches Array schreibe und dann statt des Sinuses die Werte aus dem Array abfrage, hätte ich dann einen Performancegewinn?!
Ist nur mal so eine spontane Idee..
Danke schonmal
mfg Gorgon
PS: Achja.. hier ist übrigens ein Beispielprogramm:
http://people.freenet.de/gorgons-data/RBD_Collision.zip
Man braucht dx9.. vielleicht fehlt euch eine dll (dafür kann ich nichts, das liegt an DarkBASIC oder eher an den verplanten Microsoftfritten, die mehrere dx9.0c builds in den Umlauf gebracht haben)
Die kann man hier downloaden.. http://www.dll-files.com/dllindex/dll-files.shtml?d3dx9_31 _________________ Who is general failure
and why is he reading my harddisk? |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 16.01.2008, 18:44 Titel: |
|
|
Zitat: | 2. Dann verwende ich natürlich auch den rechenintensiven cosinus und sinus..
Wenn ich nun Beispielsweise 50000 Werte des Sinus am Anfang in ein statisches Array schreibe und dann statt des Sinuses die Werte aus dem Array abfrage, hätte ich dann einen Performancegewinn?!
Ist nur mal so eine spontane Idee.. |
Das ist etwas, was bei modernen spielen sehr oft gemacht wird. Vor allem sich wiederholende Rechnungen kann so schneller machen/vermeiden. Denn ein speicherzugriff ist viel schneller als sin/cos.
Zu 1. kann ich dir leider nichts sagen. _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 16.01.2008, 19:04 Titel: |
|
|
Hallo!
Michael712 hat Folgendes geschrieben: | _Gorgon hat Folgendes geschrieben: | 2. Dann verwende ich natürlich auch den rechenintensiven cosinus und sinus..
Wenn ich nun Beispielsweise 50000 Werte des Sinus am Anfang in ein statisches Array schreibe und dann statt des Sinuses die Werte aus dem Array abfrage, hätte ich dann einen Performancegewinn?!
Ist nur mal so eine spontane Idee.. |
Das ist etwas, was bei modernen spielen sehr oft gemacht wird. Vor allem sich wiederholende Rechnungen kann so schneller machen/vermeiden. Denn ein speicherzugriff ist viel schneller als sin/cos. |
Das Berechnen der Werte im Vorhinein, um sie dann im Laufe der Programmausführung ständig im Speicher parat zu haben, dürfte - wie Michael bereits beschrieben hat - zu einem Performancegewinn führen. Auch kannst du anstelle der Standardfunktionen eine Assembler-optimierte Function für die trigonometrischen Berechnungen verwenden: FBSinCos auf freebasic-portal.de
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
_Gorgon

Anmeldungsdatum: 04.01.2008 Beiträge: 16 Wohnort: Heidelberg
|
Verfasst am: 17.01.2008, 17:09 Titel: |
|
|
ahaa.. danke!
Die praktische FBSinCos-Funktion hab ich mir gleich mal ins Projekt integriert..
Die erste Frage könnte ich mir ja auch selber mithilfe dieser Counter.bas beantworten. Was hat es denn damit auf sich.. gibt es dazu irgendeinen Thread oder eine Erklärung?! In der Suchfunktion gab es zu viele Ergebnisse^^
mfg Gorgon
PS: Habt ihr euch das Programm angesehen? _________________ Who is general failure
and why is he reading my harddisk? |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 17.01.2008, 17:42 Titel: |
|
|
Zitat: | Man braucht dx9.. vielleicht fehlt euch eine dll (dafür kann ich nichts, das liegt an DarkBASIC oder eher an den verplanten Microsoftfritten, die mehrere dx9.0c builds in den Umlauf gebracht haben) |
Zitat: | PS: Habt ihr euch das Programm angesehen? |
da ich linux habe, und somit kein directx benutzen kann, konnte ich es mir nicht ansehen. könntest du vielleicht mal ein oder 2 screenshots hochladen? _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 17.01.2008, 17:51 Titel: |
|
|
_Gorgon hat Folgendes geschrieben: | Die praktische FBSinCos-Funktion hab ich mir gleich mal ins Projekt integriert.. | cool.. _Gorgon hat Folgendes geschrieben: | Die erste Frage könnte ich mir ja auch selber mithilfe dieser Counter.bas beantworten. Was hat es denn damit auf sich.. gibt es dazu irgendeinen Thread oder eine Erklärung?! | Ich habe versucht, die Arbeitsweise von und mit Counter.Bas mal anschaulich zu machen..
Kuckstu hier..
(Da gibt's auch noch mehr zum Ansehen und wesentlich aktuellere Beiträge als auf freebasic.de..)
Bzgl. Programmoptimierung:
Ein Programm läßt sich immer optimieren..
..doch dazu muß es erstmal fehlerfrei sein!
Im Klartext: Wenn du eine laufende Version deines Programmes hast, kannst du jederzeit anfangen, den Ablauf zu optimieren..
Imho bringt es bei der Entwicklung wenig, bereits zu optimieren, ggfs. fliegen die (mühsam) optimierten Teile ja sowieso wieder raus
Aber mach, wie du denkst
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
_Gorgon

Anmeldungsdatum: 04.01.2008 Beiträge: 16 Wohnort: Heidelberg
|
Verfasst am: 17.01.2008, 19:47 Titel: |
|
|
Hi..
Zitat: | da ich linux habe, und somit kein directx benutzen kann, konnte ich es mir nicht ansehen. könntest du vielleicht mal ein oder 2 screenshots hochladen? |
mmmh naja.. ganz ehrlich das sieht nicht so interessant aus! Die Dynamik ist ja das interessante. Ein paar rote Vielecke und 3 gelbe würdest du sehen^^ aber wenn du willst, kann ich dir welche machen..
Zitat: | Ein Programm läßt sich immer optimieren..
..doch dazu muß es erstmal fehlerfrei sein!
Im Klartext: Wenn du eine laufende Version deines Programmes hast, kannst du jederzeit anfangen, den Ablauf zu optimieren..
Imho bringt es bei der Entwicklung wenig, bereits zu optimieren, ggfs. fliegen die (mühsam) optimierten Teile ja sowieso wieder raus
Aber mach, wie du denkst |
mmmhh... irgendwie hast du recht! Es quält einen nur beim Coden, wenn man sich immer wieder fragen muss, wie das jetzt mit den verschachtelten Pointern ist, oder immer Cos oder Sin in dem Wissen zu tippen, dass es viele Takte braucht.
Aber ich werde erst mal das Programm selbst vorran treiben! Hast recht
Danke für die viele Hilfe
Wenns was neues zu berichten gibt, dann lass ich was von mir hören!
Gruß Gorgon
EDIT: Also dieses Counter.bas zeuchs ist extrem praktisch!!
Werd damit mal die DBP_Funktionen messen, die ich auch über FB (mit Funktionspointern etc.) aufrufen kann.. will ja nicht wissen, was da so bei rauskommt. _________________ Who is general failure
and why is he reading my harddisk? |
|
Nach oben |
|
 |
Bimi
Anmeldungsdatum: 03.12.2007 Beiträge: 66
|
Verfasst am: 17.01.2008, 23:40 Titel: |
|
|
Zitat: |
Das ist etwas, was bei modernen spielen sehr oft gemacht wird. Vor allem sich wiederholende Rechnungen kann so schneller machen/vermeiden. Denn ein speicherzugriff ist viel schneller als sin/cos.
Zu 1. kann ich dir leider nichts sagen. |
Das wird nicht erst bei modernen Spielen gemacht, das wird schon immer so gemacht - bei modernen Spielen ist aufgrund der leistungsfähigen GPI's der bedarf bei weitem nicht mehr so hoch.
Alte Spiele wären ohne eine Tabellengestützte Trigonometrie überhaupt nicht möglich gewesen. Auf älteren Prozessoren dauerte die Berechnung einer trigonometrischen Funktion mittels des Coprozessors zwischen drei und 35 Taktzyklen. Dazu kommt noch das Laden der FP-Register und das zurückschreiben. Das ist um den Faktor 6-10 teuerer als den Wert aus einer Tabelle auszulesen.
Bei diesen Tabellen gibt es drei Grade:
Grad 1 ist auf Grad genau, eindimensional und enthält 90 Einträge. Die drei anderen Quardranten erreicht man durch Spiegelung und Vorzeichenänderung, müssen also nicht extra gespeichert werden. Bei 80Bit Genauigkeit (double) ergibt das einen Speicherbedarf von 900 Byte, der maximale Fehler des Ergebnisses bei einem Kreis mit Erdradius beträgt 111 km
Grad 2 ist auf Minuten genau, ist zweidimensional und enthält 5400 Einträge, die einen Speicherbedarf von rund 50kb ergeben. Der maximale Fehler liegt bei 1850m bezogen auf den Erdradius
Grad 3 ist sekundengenau, dreidimensional und enthält 324000 Einträge, welche rund 3,3MB Speicher benötigen. Der Fehler liegt maximal bei 30 meter, im Schnitt somit bei 15metern - komisch, genau die Genauigkeit eines billigen GPS
Werden feiner granulare Werte benötigt, kann linear interpoliert werden. Gute Algorithmen haben dann noch eine Fehlerkorrekturtabelle für die Interpolation und erreichen damit Genauigkeiten von bis zu 8 Stellen hinter dem Komma ohne auch nur eine einzige Rechnung durchführen zu müssen. _________________ Rechtbehelf:
Rechschreibverfehlungen, Vergehen an der Deutschen Sprache sowie Stabwechselverbuchselungen unterliegen dem Urheberrecht, sind voll beabsichtigt und fördern das aufmerksame Lesen. |
|
Nach oben |
|
 |
atari gesperrt
Anmeldungsdatum: 26.08.2007 Beiträge: 144
|
Verfasst am: 18.01.2008, 16:10 Titel: |
|
|
.....komisch, genau die Genauigkeit eines billigen GPS .......
das hat damit garnichts zu tun. es kommt auf die anzahl der satelliten die empfangen werden können. wenn du nur 4 empfangen kannst ist die auflösung geringer als wenn du von 6 empfangen kannst. es gibt auch teure geräte die nicht die optimale anzahl der satelliten empfangen. |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|