윈도우의 크기가 진화 했으므로, 최대화 된 윈도우에서 장면을 렌더링하려면 프로그램이 완전한 코어를 필요로하는 것이 정상입니까?
Windows의 C++ 언어로 Qt 4.7을 사용하여 1754 * 1240 크기의 150 개의 그림 (구성 요소는 RGBA, 각 바이트에 있음)을 그립니다. 나는이처럼 내 텍스처를로드GR 장면을 그릴 때 CPU 사용량이 많습니다. 유래?
glGenFramebuffers(TDC_NB_IMAGE, _fborefs);
glBindFramebuffer(GL_FRAMEBUFFER, _fbo);
//initialize tex
glGenTextures(TDC_NB_IMAGE, _picrefs);
for (int i = 0 ; i < TDC_NB_IMAGE ; i++)
{
qDebug() << "loading texture num : " << i;
_pics[i].scale = 1.f;
_pics[i].pos.rx() = i % ((int)sqrt((float)TDC_NB_IMAGE));
_pics[i].pos.ry() = i/((int)sqrt((float)TDC_NB_IMAGE));
_pics[i].text.load("imgTest.png");
glBindTexture(GL_TEXTURE_2D, _picrefs[i]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);//GL_LINEAR_MIPMAP_LINEAR
glTexImage2D (GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,
TDC_IMG_WIDTH, TDC_IMG_HEIGHT, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE,
_pics[i].text.toImage().bits()
);
//glGenerateMipmap(GL_TEXTURE_2D);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _picrefs[i], 0);
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
나는 이런 식으로 내 장면을 그릴 :
는glBindFramebuffer(GL_FRAMEBUFFER, _fbo);
glClear(GL_COLOR_BUFFER_BIT);
//for each image
for (int i = 0 ; i < TDC_NB_IMAGE ; i++)
{
//compute coords
if (_update)
{
//pos on 0,0
_pics[i].quad.topleft.rx() = 0;
_pics[i].quad.topleft.ry() = 0;
_pics[i].quad.topright.rx() = TDC_IMG_WIDTH;
_pics[i].quad.topright.ry() = 0;
_pics[i].quad.botright.rx() = TDC_IMG_WIDTH;
_pics[i].quad.botright.ry() = TDC_IMG_HEIGHT;
_pics[i].quad.botleft.rx() = 0;
_pics[i].quad.botleft.ry() = TDC_IMG_HEIGHT;
//translate
QPointF dec(0, 0);
dec.rx() = _pics[i].pos.x() * TDC_IMG_WIDTH + _pics[i].pos.x() * TDC_SPACE_IMG;
dec.ry() = _pics[i].pos.y() * TDC_IMG_HEIGHT + _pics[i].pos.y() * TDC_SPACE_IMG;
_pics[i].quad.topleft += dec;
_pics[i].quad.topright += dec;
_pics[i].quad.botright += dec;
_pics[i].quad.botleft += dec;
//scale
_pics[i].quad.topleft *= _globalScale;
_pics[i].quad.topright *= _globalScale;
_pics[i].quad.botright *= _globalScale;
_pics[i].quad.botleft *= _globalScale;
_update = false;
}
//prepare tex drawing
//draw drawing area
glBindTexture (GL_TEXTURE_2D, 0);
glBegin (GL_QUADS);
glTexCoord2f (0.0, 0.0);glVertex3f (_pics[i].quad.topleft.x(), _pics[i].quad.topleft.y(), 0);
glTexCoord2f (1.0, 0.0);glVertex3f (_pics[i].quad.topright.x(), _pics[i].quad.topright.y(), 0);
glTexCoord2f (1.0, 1.0);glVertex3f (_pics[i].quad.botright.x(), _pics[i].quad.botright.y(), 0);
glTexCoord2f (0.0, 1.0);glVertex3f (_pics[i].quad.botleft.x(), _pics[i].quad.botleft.y(), 0);
glEnd();
//draw texture
glBindTexture (GL_TEXTURE_2D, _picrefs[i]);
glBegin (GL_QUADS);
glTexCoord2f (0.0, 0.0);glVertex3f (_pics[i].quad.topleft.x(), _pics[i].quad.topleft.y(), 0);
glTexCoord2f (1.0, 0.0);glVertex3f (_pics[i].quad.topright.x(), _pics[i].quad.topright.y(), 0);
glTexCoord2f (1.0, 1.0);glVertex3f (_pics[i].quad.botright.x(), _pics[i].quad.botright.y(), 0);
glTexCoord2f (0.0, 1.0);glVertex3f (_pics[i].quad.botleft.x(), _pics[i].quad.botleft.y(), 0);
glEnd();
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
일부 벤치마킹 한 후에는 무거운 CPU 사용량이 "// 그릴 텍스처"블록에서 오는 것 같다. 사실, 때로는 0ms 및 때로는 400ms가 걸립니다. 전반적으로, paintGL 함수는 윈도우가 최대화 될 때 장면 렌더링에 5 초를 소요하고 윈도우가 800 * 600 크기 일 때 0에 가깝습니다.
렌더링 중 배율을 변경 (_globalScale 만 수정)하여 창 크기와 상관없이 150 개의 그림을 볼 수 있습니다. 사진의 크기가 CPU 사용량을 변경하지 않습니다.
2 주 전에 OpenGL을 사용하기 시작 했으므로 설명서와 튜토리얼에서 뭔가를 놓쳤습니다.하지만 다시 읽었을지라도 150 장의 그림을 렌더링하는 설명이나 다른 방법을 찾지 못했습니다.
그래픽 태블릿이나 마우스를 사용하여 그림을 수정할 수 있습니다 (더 정확하게이 그림의 레이어는 더 많은 텍스처를 의미 함). 따라서 속도 개선이 필요합니다.
GPU에 얼마만큼의 RAM이 있습니까? – genpfault
@genpfault 256MB, GeForce 6800 – Aigrefin
나쁘다. 질감이 적다. 235MB를 대표하는 27 가지 이상의 비 압축 텍스처에 대한 문제가 있습니다. 너무 많은 메모리를 사용하고 있습니다. 스케일 팩터가 증가했다면 풀 해상도로 볼 수있는 반면, 나는 그 150 장의 사진을 어떻게 표시해야할지 모르겠습니다. 스케일 팩터가 바뀔 때마다 적절한 해상도를로드해야합니다. 그러나 그렇지 않습니다. 실시간으로 렌더링 된 변경 사항을보고 싶다면 렌더링 속도가 느립니 까? – Aigrefin