2012-04-29 3 views
1

각 파일의 크기는 250KB에서 500KB 정도 여야합니다. 이 파일들 각각에는 다중 QImage가 있습니다. 각 파일은 128x64의 약 400 이미지입니다. 로딩은 메모리에 약 60MB/s입니다 (OpenGL이 PNG를 자체 포맷으로 압축을 풀어야 함을 참조하십시오).느린 텍스처 로딩

이 프로세스를 빠르게 진행할 수 있습니까? 채울 기력이있는만큼 힘들게 느립니다. 하지만 아직도 많은,

  glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits()); 

은 비 압축으로 압축 변환 가능한 시간을 저장합니다

QFile file("file.ucv"); 

if (file.open(QIODevice::ReadOnly)) { 
    qDebug() << "Read from hdd"; 

    QDataStream r(&file); 
    r.setVersion(QDataStream::Qt_4_3); 

    QImage t; 

    int i = maxPics * place; 
    glGenTextures(maxPics, &texture[i]); 
    for (int y = 0; y < yNrPics; y++) 
     for (int x = 0; x < xNrPics; x++, i++) { 

      // Write to precomputed object 
      r >> t; 

      glBindTexture(GL_TEXTURE_2D, texture[i]); 
      glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits()); 
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
     } 

프로파일 러는 가장 consumptious로이 줄을 찾습니다.

로드 된 QImage는 GL 형식입니다. 당신이 병목 코드의 부분에 있는지 경우

+1

좋은 시작은 병목 현상을 파악하기 위해 코드를 프로파일 링하는 것입니다. –

+0

GPU에 업로드하는 동안 CPU가 대기 중일 가능성이 큽니다. – RobotRock

+0

이미지가 작아서 업로드 및 설정 오버 헤드가 병목 현상이 될 수 있습니다. –

답변

2

귀하의 데이터가 확실한 지 확인하십시오 :

  • 즉. 프로파일 러가 CPU 소비뿐만 아니라 벽 시계를 표시하는지 확인하십시오 (디스크 I/O가 CPU를 소비하지는 않지만 시간이 소요됨).

또한, 일을하지 않도록 최선의 최적화입니다 :

  • 당신이 압축 된 텍스처를 사용하여 한 번만 (처음 업로드)를 압축 한 후 압축 된 데이터를 다운로드하고 디스크에 캐시하려면

    . 후속 업로드는 png-raw-to-gl에서 재 압축하지 않고 디스크에서 OpenGL로 압축 된 데이터를 직접 보내야합니다. 이미지로드에 대해 별도의 스레드를 사용하여

    • 파이프 라인 업로드 :

    파이프 라이닝 작업은, ESP I와/O는 (생산자 - 소비자 parallellism) 일을 빠르게 할 수있는 좋은 방법이며, 일반적으로 쉽게 텍스처를 생성합니다. Qt는 여기서 QtConcurrent 라이브러리를 통해 훌륭한 지원을 제공합니다. 즉, 스레드로 직접 해를 끼칠 필요가 없습니다. (당신은 QGLWidget를 사용해야합니다 ::하지만 makeCurrent을) 당신의 CPU에

사용 가능한 모든 코어를, 당신이 할 수있을 때 :

  • 에서 OpenGL에 데이터를 업로드 할 여러 스레드를 사용하는 것이 좋습니다. Pixel Buffer Objects를 사용하면 텍스처 데이터 버퍼에 대한 포인터를 얻은 다음 memcpy를 사용하여 업로드 할 수 있습니다. (memcpy-threads는 컨텍스트를 활성화 할 필요가 없습니다.)
  • 텍스처 압축은 GL 드라이버의 소프트웨어에서 수행되므로 코어를 통한 업로드를 병렬 처리하면 여기에도 도움이되지만 GL 드라이버를 압축하려면 여러 GL 컨텍스트 (데이터를 공유 함)를 만들어야 할 수 있습니다 평행선. 이것을 시도하기 전에 평행선인지 아닌지보기가 너무 어렵지 않아야합니다. 또한

, 버퍼링 API를 통해 스트리밍 데이터를 피하기는 : 메모리를 매우 효율적으로 데이터를 업로드 할 수있는 파일을 매핑하여

  • (버퍼링 없음 직선 디스크에서 : 당신이 필요하지 않은 경우에요 to GL), 매핑 된 버퍼에서 텍스처 포인터로의 memcpy.
1

, 몇 가지 당신이 할 수 있습니다 :

  • GL_COMPRESSED_RGBA를 사용하지 않는, 단순히 GL_RGBA
  • 찾기 드라이버의 최적의 유형 및 사용이 PNG 파일
  • 사용 원시 데이터 (압축을 방지) 작은 파일로
  • 분할 파일을 (당신은 OpenGL을 프로그램을 프로파일 링 할 필요)
+0

로드 된 이미지가 GLformat에 있습니다. 그보다 더 좋을 수는 없다고 생각합니다. – RobotRock

+0

다중 컨텍스트에서 텍스처로드를 분할하면 도움이됩니까? – RobotRock

+0

@RobotRock'GL_UNSIGNED_BYTE'는 그래픽 칩에 가장 적합한 유형이 아닐 수도 있습니다. 다른 유형으로 게임을 할 수 있습니다. 다른 상황에서 무엇을 의미합니까? 당신은 그것을 만든 컨텍스트에서만 텍스쳐를 사용할 수 있습니다 –

관련 문제