glBufferSubData在许多Android设备上都很慢

问题描述 投票:0回答:1

我已经请求大约2M gl缓冲区用于共享,并使用glBufferSubData更新顶点和索引的数据,它在我的iOS设备上工作正常。而当我在我的Android设备上测试时,它非常慢。

我从官方网站上找到了一些笔记:https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBufferSubData.xhtml

“在数据存储可以更新之前,渲染必须从管道中消失”是什么意思?

opengl-es opengl-es-2.0 opengl-es-3.0
1个回答
1
投票

您所看到的性能差异可能不仅仅是iOS / Android差异,而是非常特定于您对API的使用以及驱动程序中glBufferSubData的实现。如果没有看到更多代码,或者知道您正在收集哪些性能指标,则很难进一步评论。

“在数据存储可以更新之前,渲染必须从管道中消失”是什么意思?

这里的想法是,虽然OpenGL API给出了在继续之前执行每个命令以完成的错觉,但事实上,绘图通常是在背景中异步完成和异步完成的。这里的问题是glBufferSubData可能会添加一个同步点,这意味着驱动程序必须停止,直到使用该缓冲区的所有先前渲染完成后再继续。

请考虑以下示例。在一个好的情况下,我们可能会有这样的事情:

  • glBufferSubData使用ABCDE进入缓冲区1
  • 使用缓冲区1绘制调用
  • glBufferSubData使用FGHIJ进入缓冲区2
  • 使用缓冲区2绘制调用
  • 交换缓冲区<-----同步点,驱动程序必须等待渲染完成才能交换缓冲区

但是,如果你要覆盖相同的缓冲区,那么你将得到它。

  • glBufferSubData使用ABCDE进入缓冲区1
  • 使用缓冲区1绘制调用
  • glBufferSubData进入缓冲区1,用FGHIJ <-----同步点覆盖,因为驱动程序必须确保缓冲区在修改数据之前已被第一次绘制调用完成
  • 使用更新的缓冲区1绘制调用
  • 交换缓冲区<-----同步点,驱动程序必须等待渲染完成才能交换缓冲区

如您所见,您可能最终得到第二个同步点。但是如前所述,这在一定程度上取决于驱动程序。例如,某些驱动程序可能能够检测到您正在更新的缓冲区部分未被上一次绘制调用使用的情况,而其他驱动程序可能没有。这种性质的东西可能是导致你所看到的性能差异的原因。

© www.soinside.com 2019 - 2024. All rights reserved.