使用glMapBufferRange

时间:2017-07-14 09:53:08

标签: android performance opengl-es mali

我正在尝试使用memcpy从使用glMapBufferRange映射的像素缓冲区中读取4 MB。我的平台是三星Galaxy S7 Exynos(Mali GPU)。问题是阅读表现很差。复制数据大约需要75毫秒。

我像这样初始化缓冲区:

glGenBuffers(NUM_BUFFERS, pbo_id);
for (int i = 0; i < NUM_BUFFERS; i++) {
    glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo_id[i]);
    glBufferData(GL_PIXEL_PACK_BUFFER, PBO_SIZE, 0, GL_DYNAMIC_READ);

    glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
}

我读取缓冲区的像素:

glReadBuffer(GL_COLOR_ATTACHMENT0);
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo_id[counter%NUM_BUFFERS]);
glReadPixels(0, 0, IMAGE_WIDTH, IMAGE_WIDTH, GL_RGBA, GL_UNSIGNED_BYTE, 0);

然后我使用以下代码从缓冲区中读取:

glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo_id[(counter - (NUM_BUFFERS-1)) % NUM_BUFFERS]);

void *ptr = glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, PBO_SIZE, GL_MAP_READ_BIT);

memcpy(&buffer, ptr, PBO_SIZE);

glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);

我使用以前的缓冲区进行读取,以确保异步操作完成pbo_id[(counter - (NUM_BUFFERS-1)) % NUM_BUFFERS]

只有一个缓冲区,时间增加到90毫秒,两个或更多允许在75毫秒内完成操作。

我认为这很慢,因为其他内存区域的memcpu在1或2毫秒内完成。

glMapBufferRange的文档有一个注释:

  

缓冲区对象的数据存储的映射可能具有非标准   性能特点。例如,可以标记这样的映射   作为记忆的无法解决的区域,并且在这种情况下从它们中读取   可能很慢。为确保最佳性能,客户应使用   映射的方式与GL_BUFFER_USAGE的值一致   和访问。以与这些不一致的方式使用映射   值比使用值慢几个数量级   正常的记忆。

所以问题是什么是错的,以及如何提高从缓冲区读取的性能。

0 个答案:

没有答案