Frage

Ich rief einmal diese Funktion pro Frame und es dauerte meinen FPS von> 400 bis 33. Warum?

sw blt(const PtRect *dstRect, Texture *src, const PtRect *srcRect, RenderDevice::bltFlags flags=RenderDevice::bltDefault)
{
    assert(src);
    GL_Texture *glsrc = dynamic_cast<GL_Texture*>(src);
    if (glsrc == 0)
        return -1;

    PtRect srcRect2(0, 0, src->width, src->height);
    if (srcRect == 0)
        srcRect = &srcRect2;

    PtRect dstRect2(0, 0, srcRect->makeWidth(), srcRect->makeHeight());
    if (dstRect == 0)
        dstRect = &dstRect2;

    glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, *glsrc->getTex());

    glBegin( GL_QUADS );
    glNormal3f( 0.0f, 0.0f, 1.0f );
    for (size_t i=0; i<350; i++)
    {
        glTexCoord2f( srcRect->left /src->width, srcRect->top/src->height);    glVertex2f(dstRect->left,  dstRect->top);
        glTexCoord2f( srcRect->right/src->width, srcRect->top/src->height);    glVertex2f(dstRect->right, dstRect->top);
        glTexCoord2f( srcRect->right/src->width, srcRect->bottom/src->height); glVertex2f(dstRect->right, dstRect->bottom);
        glTexCoord2f( srcRect->left /src->width, srcRect->bottom/src->height); glVertex2f(dstRect->left,  dstRect->bottom);
    }
    glEnd();
    return 0;
}
War es hilfreich?

Lösung

Für Leistung sollten Sie Ihre Texturen in einer init-Funktion laden und eine Liste verwenden, dann auf der Hauptfunktion macht später angezeigt werden, zum Beispiel:

// Generate texture object ID
glGenTextures(1, img);
glBindTexture(GL_TEXTURE_2D, img);

// Set Texture mapping parameters
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR);

LoadBMP("texture.bmp");

Dann auf der Haupt-Render-Funktion haben Sie so etwas wie:

// Front face of Cube
glBindTexture(GL_TEXTURE_2D, img);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-fSize, fSize, fSize);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-fSize, -fSize, fSize);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(fSize,-fSize, fSize);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(fSize,fSize, fSize);
glEnd();

Wie Sie sehen können Sie die Textur auf die Parameter wickeln können, anstatt sie immer und immer wieder in einer Schleife wiederholt wird.

Andere Tipps

Hard ohne mehr Details zu sagen, könnten potenzielle Probleme eine zu große Textur verwenden, so dass Software-Fallbacks in Ihrem Fahrer. Auch Sie Schleife 350 Mal ohne ersichtlichen Grund erscheinen.

Unter Umständen können Sie die Leistung verbessern, indem sie eine Reihe von Daten zu bauen und dann glDrawArrays statt Ausgabe jedes glTexCoord / glVertex Paar einzeln

Aufruf

Vielleicht verwenden Sie nicht Texturen mit einer Leistung von 2 (zum Beispiel 1024x768 statt 1024x512)?

Es sieht aus wie Sie das Quad auf den Bildschirm 350 mal aus irgendeinem Grund ziehen. Wenn diese Vollbild ist, dann jedes Pixel auf dem Bildschirm 350 mal ein Rahmen Texturierung ist verpflichtet, Ihre Leistung zu beschädigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top