Мне нужно взять 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 кадров в секунду, когда отображается только куб, без этих двух строк он работает на 6500 FPS! Если сравнить его с 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
и 512x512 окно работает на 400 FPS даже с огромной сеткой (Quake 3 карты) нагруженной! Учтите, что я использую openGL в качестве драйвера внутри irrlicht. Для моего неопытного глаза кажется, что glReadPixels
копирует каждый пиксельный файл из одного места в другое, а (uint8_t*)screenShot->lock()
просто копирует указатель на уже существующий массив. Можно ли сделать что-то подобное последнему с помощью freeGlut? Я ожидаю, что это будет быстрее, чем irrlicht.
Обратите внимание, что Irrlicht использует OpenGL тоже (ну предлагает DiRectX и другие варианты, как хорошо, но в этом примере я дал выше я использовал OPENGL и, кстати, это был самый быстрый по сравнению с другими вариантами)
Look up Pixel Buffer Объекты, которые позволяют делать это асинхронно. – immibis
Если вы поместите этот код в незанятую функцию, его можно вызвать более одного раза за кадр. Кроме того, вы теряете память, если вы никогда не освобождаете данные, которые вы выделяете. –
@RetoKoradi хорошо, нет, я буквально не выполняю эти строки каждый раз, когда вызывается 'idle'. 'data' выделяется только один раз в конструкторе, и я использую его снова и снова. Теперь я смотрю в PBO .... –