0

我每帧调用一次这个函数,它使我的 FPS 从 >400 到 33。为什么?

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;
}
4

4 回答 4

2

很难说没有更多细节,潜在的问题可能是使用了太大的纹理,导致驱动程序中的软件回退。此外,您似乎无缘无故地循环了 350 次。

您可以通过构建数据数组然后调用 glDrawArrays 而不是单独发出每个 glTexCoord/glVertex 对来提高性能

于 2009-01-06T08:12:17.047 回答
1

为了提高性能,您应该在 init 函数中加载纹理并使用列表显示,然后在主渲染函数中显示,例如:

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

然后在主渲染功能上你有类似的东西:

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

如您所见,您可以将纹理包装在参数上,而不是在循环中一遍又一遍地重复它。

于 2009-01-06T08:28:15.343 回答
1

也许您没有使用 2 次方的纹理(例如 1024x768 而不是 1024x512)?

于 2010-10-21T18:32:57.203 回答
0

看起来您出于某种原因将四边形绘制到屏幕上 350 次。如果这是全屏,那么将屏幕上的每个像素纹理化 350 次一帧势必会损害您的性能。

于 2009-01-06T08:22:39.753 回答