2011-10-26 2 views
2

윈도우의 크기가 진화 했으므로, 최대화 된 윈도우에서 장면을 렌더링하려면 프로그램이 완전한 코어를 필요로하는 것이 정상입니까?

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 장의 그림을 렌더링하는 설명이나 다른 방법을 찾지 못했습니다.
그래픽 태블릿이나 마우스를 사용하여 그림을 수정할 수 있습니다 (더 정확하게이 그림의 레이어는 더 많은 텍스처를 의미 함). 따라서 속도 개선이 필요합니다.

+0

GPU에 얼마만큼의 RAM이 있습니까? – genpfault

+1

@genpfault 256MB, GeForce 6800 – Aigrefin

+1

나쁘다. 질감이 적다. 235MB를 대표하는 27 가지 이상의 비 압축 텍스처에 대한 문제가 있습니다. 너무 많은 메모리를 사용하고 있습니다. 스케일 팩터가 증가했다면 풀 해상도로 볼 수있는 반면, 나는 그 150 장의 사진을 어떻게 표시해야할지 모르겠습니다. 스케일 팩터가 바뀔 때마다 적절한 해상도를로드해야합니다. 그러나 그렇지 않습니다. 실시간으로 렌더링 된 변경 사항을보고 싶다면 렌더링 속도가 느립니 까? – Aigrefin

답변

0

빠른 렌더링과 낮은 메모리 부족을 위해 이미지의 크기를 줄입니다. 그런 다음 이미지의 특정 하위 세트를 확대하면 전체 해상도를로드하고 저해상도 텍스처 대신이를 표시 할 수 있습니다.

+0

좋아, 나는 그것을하기 시작했다. 비록 여전히 성능 문제가 있기 때문에 나는 또 다른 질문이 있습니다 : glTexImage2D (GLuint 수준 x에서 호출 할 때 낮은 mimap 축소 이미지에 대한 쿼리를 더 빨리 또는 그림 축소 된 복사본을로드하려면 0에서 GLuint 수준? – Aigrefin

+0

텍스처 LOD 바이어스를 사용하여로드 된 밉맵 레벨 만 샘플링 할 수는 있지만 OpenGL은 여전히 ​​모든 밉 레벨을 가진 전체 텍스처에 메모리를 할당한다고 생각합니다. 그러므로 저해상도 이미지를 자신의 텍스처 객체에 붙이면 (밉맵 (mipmapped) 여부에 상관없이 메모리 사용에 많은 영향을 미치지 않을 것입니다.) glTexSubImage2D()를 통해 다시로드 할 수있는 텍스처 ID 풀 (5-10, 보기가 움직이는대로 고해상도 이미지로 일반적으로'glTexImage2D()'보다 느리기 때문에'glTexImage2D()'로 텍스처를 다시 만들고 싶지는 않습니다. – genpfault

+1

고마워, 예상대로 작동하고있어. 'glTexSubImage2D()'는 텍스처의 일부분에만 적용되기 때문에 해상도를 변경할 때마다 텍스처를 만들어야합니다. (그리고 전체를 변경해야합니다.) 그러나이 방법으로 모든 것이 원활하게 진행되고 있습니다. – Aigrefin