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

05.02.2011, 23:44

Geschwindigkeitsproblem (zeichnen von meshs)

Hallo zusammen,

ich habe in meinem Spiel einen 3D raum, in dem ich mich frei bewegen kann (FPS). Dabei läuft mein Spiel mit c.a. 850 FPS.
Jetzt lade ich mit Assimp einen mesh und lasse diesen zwei mal darstellen (sollen zwei Gegner sein). Wenn jetzt diese zwei Gegner im raum stehen sinken die FPS von 850 auf 80!
Da in dem Spiel mal deutlich mehr Gegner zu sehen sein sollen muss ich da wohl etwas drastisch verbessern.

hier mein Code der den Gegner zeichnet (wid in einer Schleife für alle Gegner aufgerufen):

C-/C++-Quelltext

1
2
3
4
5
void drawGegner(float x, float y, float z) {
    glTranslatef(x,y,z);
    glCallList(gegner->getScene_list());
    glTranslatef(-x,-y,-z);
}


Wie man sich denken kann sind x, z und y die koordinaten, wo sich der Gegner befinden soll. gegner ist von der Klasse ModellLoader.
Ich vermute, dass Translatef so lange braucht. Oder ist Assimp einfach so langsamm?
Wie könnte man den Code performanter machen.

Ach ja, zur Info, ich hab ein .obj Model (250 KB) mit einer .bmp Textur (192 KB).

Gruß
crazyTron

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

06.02.2011, 00:06

Wenn jetzt diese zwei Gegner im raum stehen sinken die FPS von 850 auf 80!

FPS sind nicht unbedingt ein verlässliches Maß da sie nichtlinear sind. Es ist oft besser sich die Zeit die ein Frame zum Rendern braucht anzuschauen (1 / fps). Der Drop von 850 auf 80fps macht z.B. in etwa gleich viel aus wie ein Drop von 80 auf 42 fps.

Da in dem Spiel mal deutlich mehr Gegner zu sehen sein sollen muss ich da wohl etwas drastisch verbessern.

Wie genau zeichnest du die Gegner, bzw. wie genau erzeugst du die Display List da? Display Listen sind, gleich wie glBegin/glEnd, jedenfalls deprecated. Eine moderne Lösung verwendet VBOs. An Assimp liegts sicherlich nicht, oder ladest du das Model in jedem Frame neu?

Wenn du anständige Performance willst solltest du jedenfalls grundsätzlich mal auf VBOs und indizierte Dreieckslisten setzen.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (06.02.2011, 00:12)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

06.02.2011, 08:38

Mal was ganz nebensächliches: Statt "drawGegner" solltest Du Dich vielleicht auf eine Konvention einigen. Entweder alles deutsch (was meiner Meinung nach nur schwer geht, weil die Sprachen und Bibliotheken ohnehin englisch sind) oder alles englisch. Schlechte Angewohnheiten wird man nämlich nur schwer wieder los.
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]

Werbeanzeige