매 프레임마다 sceenshots를 가져와야하고 매우 높은 성능이 필요합니다 (저는 freeGlut을 사용하고 있습니다). 내가 알아 낸 것은 참으로 작업을 수행하지만 그것으로 큰 문제가, 정말 느리다는 glutIdleFunc(thisCallbackFunction)
왜 glReadPixels가 느리고 다른 대안이 있습니까?
GLubyte *data = (GLubyte *)malloc(3 * m_screenWidth * m_screenHeight);
glReadPixels(0, 0, m_screenWidth, m_screenHeight, GL_RGB, GL_UNSIGNED_BYTE, data);
// and I can access pixel values like this: data[3*(x*512 + y) + color] or whatever
내에서 다음과 같이 수행 할 수 있다는 것입니다. 내 윈도우가 512x512 일 때 큐브 만 렌더링 될 때 초당 90 프레임보다 빠른 속도로 실행됩니다.이 두 라인은 6500FPS에서 실행되지 않습니다! 우리는 그래픽 엔진으로 Irrlicht을 비교하면, 거기에 나는이
// irrlicht code
video::IImage *screenShot = driver->createScreenShot();
const uint8_t *data = (uint8_t*)screenShot->lock();
// I can access pixel values from data in a similar manner here
와 512 × 512 창에도 큰 메쉬 (퀘이크 3 맵)로드 400 FPS로 작동 할 수있다! irrlicht 내에서 OpenGL을 드라이버로 사용하고 있다는 점을 감안하십시오. 내 경험이없는 눈에 그것은 (uint8_t*)screenShot->lock()
그냥 이미 존재하는 배열에 대한 포인터를 복사하는 동안 glReadPixels
한 곳에서 다른 모든 픽셀 데이터를 복사하는 것 같습니다. FreeGlut을 사용하여 후자와 비슷한 것을 할 수 있습니까? irrlicht보다 빠를 것으로 기대합니다. 으로 Irrlicht가 너무 OpenGL을 사용하는 것이
주 (물론 그것뿐만 아니라 DirectX와 다른 옵션을 제공하지만 내가 위에서 준 예제에서 나는 OpenGL을 사용하고 그런데 그것이 가장 빠른 다른 옵션 비교 하였다)
비동기 적으로 처리 할 수있는 픽셀 버퍼 객체를 찾으십시오. – immibis
코드를 유휴 기능에 넣으면 프레임 당 두 번 이상 호출 될 수 있습니다. 또한 할당 한 데이터를 절대 사용하지 않으면 메모리가 누출됩니다. –
@RetoKoradi 글쎄, 아니, 나는 문자 그대로 '유휴'가 호출 될 때마다이 줄을 실행하지 않는다. 'data'는 생성자에서 한 번만 할당되며, 반복해서 사용합니다. 이제 PBO를 조사하고 있습니다 .... –