문제

프레임 당이 기능을 한 번 호출했는데 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;
}
도움이 되었습니까?

해결책

성능을 위해 텍스처를 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();

보시다시피 루프에서 반복하는 대신 매개 변수에 텍스처를 감싸 수 있습니다.

다른 팁

자세한 내용은 말하기 어렵지만 잠재적 인 문제는 너무 큰 질감을 사용하여 운전자의 소프트웨어 폴백을 유발할 수 있습니다. 또한 당신은 명백한 이유없이 350 번 루프하는 것처럼 보입니다.

각 gltexcoord/glvertex 쌍을 개별적으로 발행하는 대신 일련의 데이터를 구축 한 다음 GlDrawArrays를 호출하여 성능을 향상시킬 수 있습니다.

어쩌면 당신은 2의 힘으로 텍스처를 사용하지 않을 것입니다 (예 : 1024x512 대신 1024x768)?

어떤 이유로 든 쿼드를 화면에 350 번 끌어 당기는 것처럼 보입니다. 이것이 전체 화면 인 경우 화면의 모든 픽셀을 350 회 텍스처로 텍스처링하여 프레임이 성능을 손상시킬 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top