JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=cdd875893f22bef9f5b8b4d143c8e56fMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Anwendung mit echtzeitphysik, optimieren
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
boeserZwilling
Mini JLI'ler


Alter: 36
Anmeldedatum: 26.08.2007
Beiträge: 11

Medaillen: Keine

BeitragVerfasst am: 26.08.2007, 11:54    Titel: Anwendung mit echtzeitphysik, optimieren Antworten mit Zitat

Heho JLI'ler,

Ich schreibe gerade an einer Emulationssoftware für die Automatidierungstechnik. Es sollen beladene Europaletten
auf Förderbändern bewegt werden. Eine SpeicherProgSteuerung
die via TCP/IP vebunden ist steuert die virtuellen Elemente
(Motoren,Pneum.Zyl) und erhält feedback (Lichtschranken,Sensoren).

Die Elemente verhalten sich nach echter Physik, darum kümmert sich
die Newtón Physics engine. Die Graphische Darstellung übernimmt
Irrlicht. Ich verwende zusätzlich einen Wrapper, IrrNewt, der Newton besser in Irrlicht einbindet (Matrizen umrechnet).
Die Szenarien werder per XML geschrieben bzw geschpeichert.


Ich wende mich an euch weil die Physikberechnung extrem aufwändig ist
und 98% CPU frisst bei je nach system 4 bis 32 FPS. Ich habe mir gedacht die Physikberechnung in einen separaten thread zu verlegen....(damit kenn ich mich noch nicht aus) Kann das einen Perforce gewinn bringen auf einmem mehrkernigen System. Was könnte ich sonst noch machen??

PS: Testszenario sind 360 Paletten auf 120 Förderern, mit allen möglichen Phys kräften und alles kann mit allem kollidieren......es sollen noch mehr werden.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 26.08.2007, 16:42    Titel: Antworten mit Zitat

hast du den Petzold? dort stehen ziemlich viel basics über threads drinne (auch wann es sinnvoll ist sie zu benutzen und wann besser nicht). Sonst musst du eben mal bei Google gucken oder die MSDN durchforsten. Dann hängt das ganze nat. auch von deinem OS ab (Petzold bezieht sich auf Windows). Oder du wartest noch 2 Jahre bis C++0x rauskommt, das wird ein paar wundervolle Unterstützungsmöglichkeiten für Multithreading anbieten Razz

Ob das überhaupt sinnvoll ist, kann ich so pauschal nicht sagen, weil es darauf ankommt was du genau erreichen willst: Willst du ein paar mehr FPS haben würde ich sagen ja. Allerdings musst du bedenken dass auch ein 2. Thread deine CPU auslastet (kommen nat. auch noch Faktoren wie Dual Core etc hinzu), und wenn deine Physik so aufwändig ist dass sie nicht nur deine FPS runterzieht sondern die ganze CPU, wird das nicht viel bringen.

Naja die einzige andere Möglichkeit die mir noch einfällt ist: Optimieren optimieren optimieren... solang bis es passabel ist. Ich kenne diese Newton engine nicht gut genug um dir da helfen zu können, aber generell würd ich sagen, dass du vllt ein paar tricks einbaust die physikalisch zwar nicht korrekt sind, aber nicht auffallen (z.B. wenn du manche Kollisionstests umgehst o.ä.)...

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 26.08.2007, 17:32    Titel: Antworten mit Zitat

Naja IMO muss man sich überlegen, ob man es genau haben will, dann lässt man einen großen Rechner ein Modell durchrechnen und guckt was dabei herauskommt, am nächsten morgen. Oder man will Echtzeit, und vereinfacht das ganze etwas, d.h. nur wenige Objekte die interagieren und ungenauere Näherungsrechnungen.
Das erste macht man in der Wissenschaft, das zweite bei Spielen. Meiner Meinung nach musst du dich entscheiden, wenn du Echtzeit haben möchtest wirst du höchstwahrscheinlich weniger Objekte haben müssen.
Man könnte natürlich versuchen einen Thread daraus zu machen, oder sogar auch per TCP/IP das ganze auf einen komplett anderen Rechner auslagern. Aber auch damit wirst du wahrscheinlich sehr bald an die Grenzen kommen, müsste man dann aber ausprobieren.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
boeserZwilling
Mini JLI'ler


Alter: 36
Anmeldedatum: 26.08.2007
Beiträge: 11

Medaillen: Keine

BeitragVerfasst am: 26.08.2007, 17:52    Titel: Antworten mit Zitat

Danke für die schnelle Hilfe. Very Happy

@Jonathan_Klein:
Das Problem ist das ich beides brauche. Denn die Steuerung ist mit dem rechner verbunden und soll nicht merken das da gar kein echter Blechhaufen steht. Die SPS überprüft ständig ob eine Palette schon am
Ziel ist und wenn nicht gibt sie eine Fehlermeldung an das Leitsystem.....
Und dann ist da noch das Problem der Kreuzungen -> ob eine Förderanlage richtig dimensioniert ist sieht man am stau bei hoher belastung (zB 950 Paletten pro Stunde).
Bis jetzt hat man die Anlage einfach mal gebaut und dann umgebaut wenns staut. Wink
Das mit dem übers Netzwerk auslagern werd ich mir merken. Gibts da irgendwo infos ev. ein Buch darüber?


Werd mal fröhlich weitercoden und sehn was sich ergibt. Hab da noch ein paar grundlegende Fragen:

Question Meinst du wenn ich 2 threads auf einer single core CPU laufen lasse ist
es langsamer als wenn ich alles in einen packe?
Arrow Hab mal getestet wie die Anwendung auf einem dual core Laptop läuft und hab dabei bemerkt das ich nur einen Kern ausnutzen kann, weil ich alles in einem thread mache.

Question Wenn V-sync an ist, bedeutet das, das die anwendung in der Hauptschleife wartet bis die GraphikKarte bereit ist und dann erst rendert? Also alles bremst.


PS: Charles Petzold hat recht viele Bücher übers programmieren geschrieben welchel empfiehlst du?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 26.08.2007, 18:11    Titel: Antworten mit Zitat

also wenn programmierer vom "Petzold" reden, meint man eigtl immer http://www.amazon.de/Windows-Programmierung-Das-Entwicklerhandbuch-zur-WIN32-API/dp/3860631888
Es gibt hier auf dem Forum viele (auch aktuelle) Threads über das buch, einfach mal Forensuche Arrow Petzold eingeben.

Also zu den CPUs: Wenn du 2 Threads machst und die auf einem System mit mehr als 1 CPU laufen lässt, wird idR auf jeden Fall ein Vorteil erkennbar sein.

zu VSync:wikipedia

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
boeserZwilling
Mini JLI'ler


Alter: 36
Anmeldedatum: 26.08.2007
Beiträge: 11

Medaillen: Keine

BeitragVerfasst am: 26.08.2007, 18:48    Titel: Antworten mit Zitat

Also schrib ich das bild nur in den Buffer und die Karte weiß dann schon wann sie es braucht. -> Kann es jetzt auch dazu kommen das der Backbuffer überschrieben wird bevor er dargestellt wird?

Werd mir den Petzold mal bestellen, steht da auch etwas über netzwerkprogrammierung drin?

/e: hab das buch grad mal virtuell durchgeblättert, is nicht das was ich erwartet hab. Da bleib ich lieber bei den tutorials die hier im Forum sind.


Zuletzt bearbeitet von boeserZwilling am 26.08.2007, 18:51, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 26.08.2007, 18:51    Titel: Antworten mit Zitat

boeserZwilling hat Folgendes geschrieben:

Werd mir den Petzold mal bestellen, steht da auch etwas über netzwerkprogrammierung drin?
jo, so ziemlich alles über windows programmierung (nur leider in c, aber das umzusetzen ist kein problem; außerdem is die WinAPI ja auch C)

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
boeserZwilling
Mini JLI'ler


Alter: 36
Anmeldedatum: 26.08.2007
Beiträge: 11

Medaillen: Keine

BeitragVerfasst am: 26.08.2007, 18:53    Titel: Antworten mit Zitat

sorry wegen dem edit, das ging alles etwas schnell hintereinander.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 26.08.2007, 18:59    Titel: Antworten mit Zitat

boeserZwilling hat Folgendes geschrieben:

Werd mir den Petzold mal bestellen, steht da auch etwas über netzwerkprogrammierung drin?

Jo, da ist ein Kapitel über Netzwerke drin. Aber ich bin der Meinung, dazu gibt es genügend Ressourcen im Internet. Ansonsten hat man danach viel Ahnung von der WinAPI und auch von anderen Themen, wie eben Netzwerk. Unicode wird ausführlich beschrieben, es gibt einiges Interessantes zum Thema MIDI, über Threads ist was drin und auch ein ziemlich detailliertes Kapitel über BMP Dateien usw.
Leider fehlen ein paar Dinge wie z.b. TreeView Elemente, die ich irgendwann mal benutzen wollte.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
boeserZwilling
Mini JLI'ler


Alter: 36
Anmeldedatum: 26.08.2007
Beiträge: 11

Medaillen: Keine

BeitragVerfasst am: 26.08.2007, 19:33    Titel: Antworten mit Zitat

Gibts auch ein buch das die anwendungsplanung behandelt speziel in verbindung mit mehreren threads.

Zur zeit hab ich nur so eine art experimentierversion in der ich die grundlegenden techniken mit der Physikengine umzugehen geübt habe.
Muss also meine Anwendung von Begin an planen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 26.08.2007, 23:54    Titel: Antworten mit Zitat

Das könnte dich interessieren:
Multithread-Programmierung mit Open-Source-Bibliothek von Intel
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
boeserZwilling
Mini JLI'ler


Alter: 36
Anmeldedatum: 26.08.2007
Beiträge: 11

Medaillen: Keine

BeitragVerfasst am: 27.08.2007, 07:14    Titel: Antworten mit Zitat

Danke, das klingt sehr interessant.

Hab mir die multi-threading tutorials im forum durchgelesen und
wollte wissen ob z.B:

Code:

//thread 1

.
.
CarUpshift (); //hochschalten
.
.

//thread 1 ende



als ein "Block" abgearbeitet wird wenn die Funktion so aussieht:

Code:


void CarUpshift ()
{
   disengage (); //auskuppeln
   shift (1);   //einen Gang raufschalten
   engage ();  //wieder einkuppeln
}



Oder ist es möglich ist, dass die Funktion nach einer beliebigen Anweisung
die CPU an einen anderen thread abgeben muss?
z.B während gerade shift (1); ausgeführt wird.


/e Oder kann sogar nach einer abgeschlossenen Assembleranweisung gesprungen werden?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 27.08.2007, 11:02    Titel: Antworten mit Zitat

Da missverstehst du MultiThreading.
Ein Prozess (z.B. ExeDatei) kann aus einem oder mehreren Threads bestehen.
Ein Thread ist ein Ausführungspfad, also eine Reihe von Codeanweisungen. Funktionsaufrufe, Classeninstanzen oder Ereignisse ändern nicht den Thread, ein Thread kann aber währens seiner Laufzeit zwischen beliebigen Prozessoren hin und herspringen.
Dieses Springen kann nach jedem Maschinenbefehl eintreten und man hat als Programmierer keinen (direkten) Einfluss darauf, auf welchem Prozessor(kern) der einzelne MaschinenCodeBefehl ausgeführt wird.
Hat man jetzt mehrere Threads werden sie parallel nebeneinander ausgeführt. (Wie als wenn es einzelne Exe-Dateien wären) Mit dem Unterschied, dass beide Threads ggf. auf die selben Variablen und Klasseninstanzen zugreifen können. Jeder dieser Threads kann zu jeder Zeit durch das Betriebssystem unterbrochen und später auf einem anderem Prozessor(kern) wieder fortgesetzt werden.

Du musst also wissen, was man jetzt "auslagern" kann und was nicht.
Dein Beispiel "Gang hochschalten" ist jetzt wahrscheinlich nicht der passende Kandidat für einen eigenen Thread
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
boeserZwilling
Mini JLI'ler


Alter: 36
Anmeldedatum: 26.08.2007
Beiträge: 11

Medaillen: Keine

BeitragVerfasst am: 27.08.2007, 11:52    Titel: Antworten mit Zitat

Danke, hab ich schon in den tutorials vom forum gelesen.

Hast recht das beispiel ist so wie ich es geschrieben hab sinnlos.
Wenn du jetzt aber bedenkst das andere dinge "zeitgleich" passieren
sollten währe es so sinnvoll. z.B. eine funktion die permanent einen
weg zum ziel sucht.....
(In einem Spiel würde das natürlich nicht so umgesetzt werden das man
das alles in einen eigenen thread packt.) War ein schlechtes Beispiel

Man kann einen geringen Einfluss darauf nehmen auf welchem Kern der Prozess ausgeführt wird. Brauch der thread extrem viel rechenpower
kommt er auf den Kern der am meißten frei hat. (Is mal geraten)

Zitat:

Du musst also wissen, was man jetzt "auslagern" kann und was nicht.

Tut mir leid kann dir nicht folgen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 27.08.2007, 12:13    Titel: Antworten mit Zitat

Allgemein ist es wichtig, das die Threads möglichst wenig miteinander zu tun haben. Es sollte wenige Variablen geben, auf die mehrere Threads gleichzeitig zugreifen müssen, da es dann sehr oft zu unvorhersehbaren Fehlern kommen kann.
Ein gutes Beispiel wäre z.B. in einem seperaten Thread das nächste Level zu laden. Da diese Daten noch nicht gebraucht werden, gibt es keine Überschneidungen und damit relativ wenige Probleme.
In deinem Beispiel benötigt sowohl die Physik als auch die Grafik die Position aller Objekte. Ein Vorteil ist, das die Grafik wohl nur lesen muss und damit das wahrscheinlich nicht zum Absturz bringen kann. Es könnte allerdings gut sein, das es zu Grafikfehlern kommt, wenn die einen Objekte schon berechnet sind, und andere noch nicht, und eins mitten in seiner Berechnung gerendert wird.

Richtig viel Erfahrung habe ich mit Threads jetzt auch nicht, aber genug um zu wissen, dass man ziemlich aufpassen sollte, weil es eben sehr leicht zu sehr schwer findbaren Fehlern kommen kann, eben insbesondere wenn Threads Daten gemeinsam benutzen.

PS:
Eine Möglichkeit wäre es natürlich, eine seperate Kopie aller Objekte zu habne, die alle Daten beinhaltet, die die Grafik zum rendern braucht. Immer wenn die Physik die Szene fertig berechnet hat, könnte sie innerhalb einer critical section die neuen Positionen und so schnell in diesen Spiecher kopieren und von da aus könnte man das ganze wahrscheinlich etwas gefahrloser rendern lassen. Evtl. jedenfalls.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
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.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum