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

fkrauthan

Supermoderator

  • »fkrauthan« ist der Autor dieses Themas

Beiträge: 979

Wohnort: Vancouver

Beruf: Software engineer

  • Private Nachricht senden

1

01.03.2008, 19:54

[OpenGL] SpriteRender zu langsam

Hallo mein Sprite Render ist eindeutig zu langsam. Kaum Render ich mehr als 2 Sprites sing die Frame rate auf unter 25FPS bei 5 is sie bei 12FPS. Aber eigentlich sollte meine Graka auch wenns ne schlechte Laptop Grafikkarte ist sowas ohne Probleme darstellen können. Pingus geht auch mit 40FPS und Setzt auch OpenGL ein.

Meine Render Methode:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void CSprite::Render(int screenHeight) {
    float posX, posY;
    
    posX = m_fSpriteX;
    posY = m_fSpriteY;
    
    if(screenHeight > 0) {
        posY = screenHeight - posY;
    }
    
    GLint w = m_sSpriteSize->w;
    GLint h = m_sSpriteSize->h;
    
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glBindTexture(GL_TEXTURE_2D, m_gSprite);
    
    glPushMatrix();

    glRotatef(m_fRotateX, 1.0, 0.0, 0.0);
    glRotatef(m_fRotateY, 0.0, 1.0, 0.0);
    glRotatef(m_fRotateZ, 0.0, 0.0, 1.0);
    glScalef(m_fScale, m_fScale, m_fScale);
    
    glBegin(GL_QUADS);
        glTexCoord2f(0, 1); glVertex2f(posX, posY);
        glTexCoord2f(1, 1); glVertex2f(posX+w, posY);
        glTexCoord2f(1, 0); glVertex2f(posX+w, posY+h);
        glTexCoord2f(0, 0); glVertex2f(posX, posY+h);
    glEnd();
    
    glPopMatrix();
}


Kennt jemand vllt. eine bessere und Schnellere Methode sowas zu Rendern?

Schonmal jetzt danke für jede hilfestellung.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

01.03.2008, 20:20

Hmm, das sollte nicht der Grund sein, warum es so langsam ist..
Ev. was bei der Initialisierung falsch gemacht? Kenne mich mit OGL nicht aus, aber ich würde den Fehler jetzt eher dort suchen.

fkrauthan

Supermoderator

  • »fkrauthan« ist der Autor dieses Themas

Beiträge: 979

Wohnort: Vancouver

Beruf: Software engineer

  • Private Nachricht senden

3

02.03.2008, 13:11

Es muss daran Liegen. Im OpenGL Channel von Freenode haben die auch gemeint das es daran liegt. Nun bin ich dabei auf Vertex Buffer umzusteigen mit dem OpenGL Erweiterung: GL_ARB_Vertex_Buffer_Object Nur leider scheint das noch nicht so ganz zu funktonieren auf alle fälle sehe ich nichts. Kennt sich damit wer aus und kann mir evt etwas helfen oder mir ein Gutes Tut Nachmöglichkeit auf Deutsch dafür sagen?

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

fkrauthan

Supermoderator

  • »fkrauthan« ist der Autor dieses Themas

Beiträge: 979

Wohnort: Vancouver

Beruf: Software engineer

  • Private Nachricht senden

5

02.03.2008, 14:41

Das Tut kenn ich schon. Nur habe ich bei dem Einige Probleme. 1.) Kannich einfach die z Kooridnate nicht weglassen. 2.) Wie muss ich das mit den Textur Coordinaten genau machen. 3. Wie platziere ich dann des Sprite.

fkrauthan

Supermoderator

  • »fkrauthan« ist der Autor dieses Themas

Beiträge: 979

Wohnort: Vancouver

Beruf: Software engineer

  • Private Nachricht senden

6

02.03.2008, 14:52

So sieht meine Init Methode Momentan aus. Die Funktions Pointer werdenr ichitg gesetzet und gibt auch keine Fehler:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
if(g_pOpenGLExtensionARB->IsSupported())
        m_bVBOSupported = true;
    else
        m_bVBOSupported = false;       
        
    if(m_bVBOSupported) {
        m_pVertices = new Vector2D<float>[4]();
        m_pTexCoords = new Vector2D<float>[4]();
            
        m_pVertices[0].x = 0.0f;
        m_pVertices[0].y = 0.0f;
        m_pTexCoords[0].x = 0.0f;
        m_pTexCoords[0].y = 1.0f;
            
        m_pVertices[1].x = (float)m_sSpriteSize->w;
        m_pVertices[1].y = 0.0f;
        m_pTexCoords[1].x = 1.0f;
        m_pTexCoords[1].y = 1.0f;
                
        m_pVertices[2].x = (float)m_sSpriteSize->w;
        m_pVertices[2].y = (float)m_sSpriteSize->h;
        m_pTexCoords[2].x = 1.0f;
        m_pTexCoords[2].y = 0.0f;
            
        m_pVertices[3].x = 0.0f;
        m_pVertices[3].y = (float)m_sSpriteSize->h;
        m_pTexCoords[3].x = 0.0f;
        m_pTexCoords[3].y = 0.0f;
        
        g_pOpenGLExtensionARB->glGenBuffersARB(1, &m_nVBOVertices);
        g_pOpenGLExtensionARB->glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_nVBOVertices);
        
        g_pOpenGLExtensionARB->glBufferDataARB(GL_ARRAY_BUFFER_ARB, 4*2*sizeof(float), m_pVertices, GL_STATIC_DRAW_ARB);
        
        g_pOpenGLExtensionARB->glGenBuffersARB(1, &m_nVBOTexCoords);
        g_pOpenGLExtensionARB->glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_nVBOTexCoords);
        g_pOpenGLExtensionARB->glBufferDataARB(GL_ARRAY_BUFFER_ARB, 4*2*sizeof(float), m_pTexCoords, GL_STATIC_DRAW_ARB );
        
        delete [] m_pVertices; 
        m_pVertices = NULL; 
        delete [] m_pTexCoords; 
        m_pTexCoords = NULL;
    }


Und so Meine Render Methode:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
GLint w = m_sSpriteSize->w;
    GLint h = m_sSpriteSize->h;
    
    if(!m_bVBOSupported) {
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        glBindTexture(GL_TEXTURE_2D, m_gSprite);
        
        glPushMatrix();
    
        glRotatef(m_fRotateX, 1.0, 0.0, 0.0);
        glRotatef(m_fRotateY, 0.0, 1.0, 0.0);
        glRotatef(m_fRotateZ, 0.0, 0.0, 1.0);
        glScalef(m_fScale, m_fScale, m_fScale);
        
        glBegin(GL_QUADS);
            glTexCoord2f(0, 1); glVertex2f(posX, posY);
            glTexCoord2f(1, 1); glVertex2f(posX+w, posY);
            glTexCoord2f(1, 0); glVertex2f(posX+w, posY+h);
            glTexCoord2f(0, 0); glVertex2f(posX, posY+h);
        glEnd();
        
        glPopMatrix();
    }
    else {
        //mit VBO Rendern

        g_pOpenGLExtensionARB->glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_nVBOVertices); 
        glVertexPointer(2, GL_FLOAT, 0, (char*)NULL);
        g_pOpenGLExtensionARB->glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_nVBOTexCoords );
        glTexCoordPointer(2, GL_FLOAT, 0, (char*)NULL);
        
        glDrawArrays(GL_TRIANGLES, 0, 4);
        
        glDisableClientState(GL_VERTEX_ARRAY);
        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    }


Und der hat auch richtig erkannt das das Plugin bei mir FUnktoniert. Nur sehen tu ich von meinem Sprite nichts.

7

02.03.2008, 15:00

Es liegt ganz klar am Grafiktreiber. Man müsste halt nur genau wissen, was dise grottigen ATI Treiber so langsam macht.
Wenn ein Spiel bei mir unter Ubuntu mit nem nVidia Chip 580 fps hat und bei ihm 0, bei den selben Binaries dann kanns schon nicht mehr am Programm liegen.
Lieber dumm fragen, als dumm bleiben!

fkrauthan

Supermoderator

  • »fkrauthan« ist der Autor dieses Themas

Beiträge: 979

Wohnort: Vancouver

Beruf: Software engineer

  • Private Nachricht senden

8

02.03.2008, 15:33

Nur ich kann auch andere OpenGL+SDL Spiele mit 40FPS spielen. Z.b. Pingus. Also muss es eine schnellere Methode geben. Der Text Rendert ja auchmit 400 bis 500 FPS nur ein Sprite alleine drosstel diese 400 bis 500FPS auf 40FPS

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

9

02.03.2008, 15:55

1.) Nein du kannst Z-Koordinaten nicht einfach weglassen!

2.) glDawArrays(GL_TRIANGLES, 0, 4)
Du versuchst 2 Dreiecke mit nur 4 Vertices zu zeichnen, dass kann nicht gehen.

mfg Philipp

Frede

Treue Seele

Beiträge: 259

Wohnort: Hameln

Beruf: Schüler

  • Private Nachricht senden

10

02.03.2008, 18:40

Sind die Maße der Textur Zweierpotenzen?

Werbeanzeige