Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Quellcode Optimieren

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
_Gorgon



Anmeldungsdatum: 04.01.2008
Beiträge: 16
Wohnort: Heidelberg

BeitragVerfasst am: 16.01.2008, 18:31    Titel: Quellcode Optimieren Antworten mit Zitat

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 geschockt

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 lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 16.01.2008, 18:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 16.01.2008, 19:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
_Gorgon



Anmeldungsdatum: 04.01.2008
Beiträge: 16
Wohnort: Heidelberg

BeitragVerfasst am: 17.01.2008, 17:09    Titel: Antworten mit Zitat

ahaa.. lächeln 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
Benutzer-Profile anzeigen Private Nachricht senden
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 17.01.2008, 17:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 17.01.2008, 17:51    Titel: Antworten mit Zitat

_Gorgon hat Folgendes geschrieben:
Die praktische FBSinCos-Funktion hab ich mir gleich mal ins Projekt integriert..
cool..happy
_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..) cool
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 happy
Aber mach, wie du denkst grinsen
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
_Gorgon



Anmeldungsdatum: 04.01.2008
Beiträge: 16
Wohnort: Heidelberg

BeitragVerfasst am: 17.01.2008, 19:47    Titel: Antworten mit Zitat

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 zwinkern

Danke für die viele Hilfe lächeln
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.. happy will ja nicht wissen, was da so bei rauskommt.
_________________
Who is general failure
and why is he reading my harddisk?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Bimi



Anmeldungsdatum: 03.12.2007
Beiträge: 66

BeitragVerfasst am: 17.01.2008, 23:40    Titel: Antworten mit Zitat

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 zwinkern

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
Benutzer-Profile anzeigen Private Nachricht senden
atari
gesperrt


Anmeldungsdatum: 26.08.2007
Beiträge: 144

BeitragVerfasst am: 18.01.2008, 16:10    Titel: Antworten mit Zitat

.....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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz