Question

J'ai appelé cette fonction une fois par image et mes FPS sont passés de> 400 à 33. Pourquoi?

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;
}
Était-ce utile?

La solution

Pour améliorer les performances, vous devez charger vos textures dans une fonction init et utiliser une liste pour les afficher plus tard, par exemple:

// 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");

Ensuite, sur la fonction de rendu principale, vous avez quelque chose comme:

// 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();

Comme vous pouvez le constater, vous pouvez envelopper la texture dans les paramètres au lieu de la répéter encore et encore dans une boucle.

Autres conseils

Difficile à dire sans plus de détails, des problèmes potentiels pourraient être l’utilisation d’une texture trop volumineuse, entraînant des repliements logiciels dans votre pilote. Aussi, vous semblez boucler 350 fois sans raison apparente.

Vous pourrez peut-être améliorer les performances en créant un tableau de données, puis en appelant glDrawArrays au lieu d'émettre chaque paire glTexCoord / glVertex individuellement

Peut-être n'utilisez-vous pas Textures avec une puissance de 2 (par exemple, 1024x768 au lieu de 1024x512)?

Il semble que vous ayez dessiné le quad sur l'écran 350 fois pour une raison quelconque. Si vous êtes en plein écran, texturer chaque pixel de l’écran 350 fois par une image est susceptible d’endommager votre performance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top