前言
glReadPixels 用于从帧缓冲区读取像素块,通常在一帧渲染完毕后用于读取渲染的结果像素。
那 glReadPixels 的性能究竟如何呢?
测试
使用 iPhone Xs max 手机分别用 glReadPixels 读取 BGRA 和 RGBA 像素,测试结果如下:
接口名 | 颜色通道类型 | 分辨率 | 平均耗时(ms) |
---|---|---|---|
glReadPixels | GL_BGRA | 2688*1242 | 1~2 |
glReadPixels | GL_RGBA | 2688*1242 | 5~6 |
memcpy | GL_BGRA/GL_RGBA | 2688*1242 | 1~2 |
分析
1、GPU 的颜色通道顺序应该是BGRA形式的,所以读取 GL_BGRA 耗时与 memcpy 一致,这种情况应该是只用拷贝下就可以得到输出结果了;
2、读取 GL_RGBA 的耗时很长,所以这个转换过程应该是在 cpu 上完成的,占用的是 cpu 的时间片;
总结
glReadPixels 读取像素 BGRA 比 RGBA 要快很多,所以使用 glReadPixels 读取像素,最好是读取 BGRA ,这样对渲染线程的影响是最小的;如果需要得到其它通道顺序的 像素,可以读取到 BGRA 之后切换线程再做转换;