# Kollisionserkennung optimieren



## manuche (1. Jun 2008)

Hallo!

Ich programmiere nebenbei einen TankWar-Clon... Mitlerweile ist das Spiel doch sehr umfangreich geworden!
Das ganze basiert in den Grundzügen auf quaxlis Tutorial...
Seit einiger Zeit ist mir aufgefallen, dass zwischendurch Framerateeinbrüche auftauchen... Im Prinzip so minimal, dass man eigentlich nichts erkennt...
Problem ist nur, dass wenn einem Panzer der Boden unter den Füßen weggeschossen wurde, fällt er hinunter... Wenn nun aber genu dann ein Framerateeinbruch auftritt, fällt der Paner so tief, dass er schon unter der Oberfläche ist...
Die Kollisionserkennenung mit dem Boden geschieht einfach darüber,  dass ich die Farbwerte der aktuellen y-Position des Panzers abfrage! Nun kann es aber geschehen, dass eine Kollisionserkennung erst dann ausgeführt wird, wenn ein Panzer schon tiefer als die aktuelle Oberfläche gefallen ist.
Wie kann ich die Kollisionserkennung jetzt so gestalten, dass meine Panzer nicht tiefer als die Oberfläche fallen?
Mir scheint es im Moment sehr sinnvoll, einen Thread alleine für die Physik laufen zu lassen und einen, der zeichnet und die restliche Logik des Spiels übernimmt!

Gruß manuche


----------



## Illuvatar (1. Jun 2008)

Das mit mehreren Threads ist generell sinnvoll, erfordert aber wahrscheinlich eine generelle Code-Umstrukturierung. Und wenn die generelle Framerate einbricht wird (außer evtl. auf einem Multi-Core-Prozessor) auch der Physikthread langsamer werden.

Für das Problem mit dem "durch den Boden fallen" könnte ich mir zwei Lösungen vorstellen, ich weiß nicht welche für dein Projekt besser wäre:

 - Immer wenn ein Panzer fällt, überprüfst du nicht nur am neuen Punkt ob da irgendwas im Weg ist, sondern an jedem Punkt zwischen dem letzten und dem aktuellen Punkt. Sobald da irgendwo was im Weg ist, fällt der Panzer eben nur bis da.

 - Eine generelle HeightMap die für jeden Punkt (muss ich mir das ganze eigentlich 2- oder 1-dimensional vorstellen? Aber ist an der Stelle ja egal) die Höhe des Bodens angibt. Das ist dann performanter als der Vorschlag oben, da berechnest du normal die neue Höhe und machst dann noch ein

```
newHeight = Math.max (newHeight, heightMap.getHeightAt(x, y));
```
oder so was. Funktioniert aber nur, wenn es nicht sein kann dass z.B. über dem Boden noch irgendwelche Plattformen sind.


----------



## manuche (1. Jun 2008)

Den ersten Punkt hab ich mir auch schon überlegt, hab ihn aber aus Gründen der Performance gelassen...
Bei deinem zweiten Vorschlag trifft genau der Vorfall ein, den du beschrieben hast!
Dann bleibt wohl nur noch der Punkt mit dem zweiten Thread! Dachte das es so vielleicht günstiger ist, da der Physik Thread eine höhere Prio bekommen könnte und somit öfter die Kollision erkennen würde... Zur Not kann man dann ja noch den ersten Vorschlag von dir einbauen! Halt nur für den Fall der Fälle!
Ich hatte mich halt nur gefragt, ob es eine technisch einwandfreie Lösung gibt, da professionelle Entwickler bestimmt mit dem gleichen Problem zu tun haben, und deren Spiele weitaus mehr Systemressourcen in Anspruch nehmen!


----------



## Kr0e (10. Jun 2008)

Naja, davon abgesehen erscheint es mir sehhhhhr unperformant die farbe zu überprüfen...
Mach dir einfach ein Array von Float oder Int Variablen, wo du dann die Eckpunkte des Panzers der reihe nach speicherst... Dann hasteim prinzip ein Polygon .... Und dann die Kollision zu berechnen geschieht nur noch auf "zahlenebene" und nicht mehr auf dem was gezeichnet wird.


----------



## manuche (11. Jun 2008)

Das ganze basiert auf quaxlis Tutorial...
O-Ton von quaxli: Man malt nicht in einem Picasso rum 
Allerdings wirst du schon recht haben!
Hab das ganze jetzt so gelöst, dass der Panzer erst fällt, wenn das zeichnen der Explosion vorbei ist, sprich keine rechenintensiver Code mehr ausgeführt wird!
Ich denk mal dass ich das ganze irgendwann mal in einer überarbeitet Verion in C++ implementieren werde! Da würde ich das Konzept sowieso nochmal überdenken!


----------



## Kr0e (11. Jun 2008)

Ähm, nur aus Interesse, da ich auch grade Java lerne und aus der C++ Ecke komme... Wieso unbedingt C++ ?  Java hat doch nicht weniger Ressourcen  Und wenn du wirklich Perfomence haben willst brauchste eh OpenGL, was es ja netter weise auch für Java gibt. JOGL! Also klar ich bin und bleibe GroßerFan! von C++ aber ich finde Java genauso gut und habe zur Zeit nur sehr wenige Sachen gefunden die nicht realisierbar sind in JAva... Immerhin gibt es ja JNI!

Gruß Chris

EDIT: JOGL ist nur messbar langsamer als C++ !


----------



## manuche (11. Jun 2008)

Also ich programmiere erst wirklich seit einem Jahr und da ich Java in der Schule habe hat sich das angeboten mit Java anzufangen  (von wegen oop)...
Aber C++ ist (für mich zumindest) die Königin unter den Programmiersprachen!


----------



## Kr0e (11. Jun 2008)

Damit liegst du auch schon richtig ! Aber wie alles was es lange gibt hat auch seine gewissen Makken. Java ist natürlich nicht das Maß aller Dinge, aber man sollte sich überlegen was besser geeignet ist. Ich programmiere C/C++ schon ziemlich lange, und kann aus meiner Sicht sagen dass man ohne Bibliotheken nur schwer große Programme schreiben kann, die auch leistungs fähig sind (->Boost, ->wxWidgets...)! Natürlich ist gegen den Gebraucht von Libs nichts einzuwenden, aber da C++ einfach umfangreicher ist, lernt man manchmal Sachen die man nicht Wirklich braucht. So als wenn man sich für den Bau eines Baumhauses eine Baufirma kauft, anstatt Schrauben mit Bohrer.... Kann auch sein dass ich nach soo langer Zeit einfach nur sehr begeistert bin von Java, da es viele Makken von C++ beseitigt aber uach viele neue schafft klar! In welcher Klasse bist du denn ? Ic hwäre froh gewesen damals Java gemacht zu haben! Wir haben Delphi gelernt -.-

Gruß Chris


----------

