Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

31.07.2014, 11:00

[C++/Directx] Auf einen Terrain laufen (Performanceeffektiv)

hi ich suche eine effektive Möglichkeit zum laufen auf einen 3D Terrain.

Zu zeit nutze ich eine einfache Kollisionserkennung welche aber schnell die FPS beim laufen runter hauen.
könnt ihr mir vielleicht ein paar effektivere Möglichkeiten nennen?

Danke schon mal im Voraus.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Brager« (31.07.2014, 16:24)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

31.07.2014, 11:26

Was heißt "es haut die FPS runter"? Von 700 auf 550? Und wie machst Du das genau?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

31.07.2014, 13:22

  • Space Partitioning nutzen, rekursiv unterteilen (Octree, Quadtree, ...)
  • Einfache Collision shapes (Sphere, Capsule = 2 Spheres + 1 Cylinder) nutzen, statt komplexe (Box, Mesh, ...)
  • Mathematik vereinfachen: Wurzeln und Divisionen vermeiden
    Beispiel:

    C-/C++-Quelltext

    1
    2
    3
    4
    5
    6
    7
    
    // schlecht:
    if (sqrt(vec.x*vec.x + vec.y*vec.y) == length2) ...
    a = b / 2;
    
    // besser:
    if ((vec.x*vec.x + vec.y*vec.y) == length2 * length2) ...
    a = b * 0.5;

  • ...
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

4

31.07.2014, 13:23

ich habe zu zeit im spiel rund 60 fps und es zieht sie direkt durch den hohen Rechenaufwand runter auf 35fps.
Ruckelt leider schon.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

31.07.2014, 13:35

Und wie machst Du die Kollisionserkennung?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Techie

Alter Hase

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

6

31.07.2014, 13:35

Bei 35 FPS würde das nicht ruckeln....

Wie gesagt, iSmokiieZz hat dir einige Lösungsansätze gegeben, diese müssen nur noch implementiert werden. Auch empfiehlt es sich Occlusion Culling zu nutzen, hat zwar weniger etwas mit Kollisionerkennung zu tun,
aber kann die FPS trotzdem deutlich hoch schrauben.

Außerdem, ich bin nicht gut in Deutsch, aber ich glaube du meintest "Performanceeffektiv" ?
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

31.07.2014, 13:36

Er meint damit "schnell" ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

8

31.07.2014, 21:19

C-/C++-Quelltext

1
2
3
4
5
6
7
// schlecht:
if (sqrt(vec.x*vec.x + vec.y*vec.y) == length2) ...
a = b / 2;

// besser:
if ((vec.x*vec.x + vec.y*vec.y) == length2 * length2) ...
a = b * 0.5;

Ist beides schlecht. Der Vergleich wird wahrscheinlich nie true ergeben.
Wer vergleicht denn zwei floats mit "=="?!

Ausserdem macht der Compiler aus einer solchen Division sowieso eine Multiplikation. Es ist völlig egal was man schreibt.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

9

31.07.2014, 21:45

Zitat von »NachoMan«

Wer vergleicht denn zwei floats mit "=="?!

Zuviele... ;)

Zitat von »NachoMan«

Außerdem macht der Compiler aus einer solchen Division sowieso eine Multiplikation. Es ist völlig egal was man schreibt.

Ich habe es gerade mal überprüft... Der MSVC macht es in dem Fall tatsächlich.
Verlassen kann man sich darauf aber nicht, weil der Compiler durch IEEE 754 bei Standardeinstellungen leicht übervorsichtig ist. Umformungen die Mathematisch kein Problem sein sollten werden nicht durchgeführt, weil es zu anderer Rundung oder Probleme bei Unendlichkeiten/NAN führen würde. "/ 3.0" wird zum Beispiel nicht automatisch in " * (1.0 / 3.0)" umgeformt, außer wenn man explizit "fast math" aktiviert. In der Regel schadet es nicht es gleich richtig hinzuschreiben. Auf mathematische Float-Umformungen würde ich mich deshalb besser nicht verlassen.

Ich halte es allerdings für unwahrscheinlich, dass das das Problem des Fragestellers ist. Wenn es so wäre, sollte er auch über seine Vorgehensweise nachdenken, weil vermutlich noch irgend etwas anderes schiefläuft. Vielleicht mal profilen? Ein derartiger Einbruch dürfte durch soetwas Grundlegendem bei einem halbwegs normalen Spiel niemals ausgelöst werden.

10

01.08.2014, 15:17

LetsGo even further offtopic and post useless commentars...

Ich denke es ist klar geworden, was ich mit dem Codeschnipsel sagen wollte. Dass floating point precisions beim comparen ein Problem sein können spielt bei der Performance keine Rolle. Ich bin mir sicher, dass ihr das wisst.

Tragt doch bitte weitere Möglichkeiten zur Verbesserung der Performance bei, anstatt destruktiv zu agieren. Das nützt dem Fragesteller sicher mehr.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Werbeanzeige