1

我正在尝试从glMapBufferRange使用 memcpy 映射的像素缓冲区中读取 4 兆字节。我的平台是三星 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 和访问值一致的方式使用映射。以与这些值不一致的方式使用映射可能比使用普通内存慢多个数量级。

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

4

0 回答 0