Opengl은 텍스처 블릿에서 느린다
-
03-07-2019 - |
문제
프레임 당이 기능을 한 번 호출했는데 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 회 텍스처로 텍스처링하여 프레임이 성능을 손상시킬 수 있습니다.
제휴하지 않습니다 StackOverflow