質問

この関数をフレームごとに1回呼び出しましたが、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;
}
役に立ちましたか?

解決

パフォーマンスのために、初期化関数でテクスチャをロードし、リストを使用してメインレンダリング関数で後で表示する必要があります。例:

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

ご覧のとおり、テクスチャをループで繰り返し繰り返すのではなく、パラメータでラップすることができます。

他のヒント

詳細を述べるまでもなく、潜在的な問題は大きすぎるテクスチャの使用であり、ドライバーのソフトウェアフォールバックを引き起こす可能性があります。また、明白な理由もなく350回ループしているように見えます。

データの配列を作成し、glTexCoord / glVertexの各ペアを個別に発行する代わりにglDrawArraysを呼び出すことにより、パフォーマンスを改善できる場合があります

2のべき乗のテクスチャ(たとえば、1024x512ではなく1024x768)を使用していないのでしょうか?

なんらかの理由で、画面にクワッドを350回描画したようです。これが全画面表示の場合、画面のすべてのピクセルを1フレームあたり350回テクスチャリングすると、パフォーマンスが損なわれます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top