Java 使用glMapBuffer的优点
当我使用Java 使用glMapBuffer的优点,java,opengl,Java,Opengl,当我使用glMapBuffer时,我得到一个float(byte)缓冲区作为返回类型,我可以使用它修改服务器端的数据 但是这样做有什么性能优势吗 我有一个例子 方法1: 我使用顶点数据创建一个浮点缓冲区,并将其直接传递给glBufferData 方法2: 我使用glBufferData分配空间,不传递任何数据。。。 我得到一个浮点缓冲区的引用。。。 我将浮点值写入到。。。我取消了缓冲区的映射 两种方法的优缺点是什么 我在这两方面都做了同样的事情吗 我认为第二种方法避免了缓冲区的重复。这有两个非常
glMapBuffer
时,我得到一个float(byte)缓冲区作为返回类型,我可以使用它修改服务器端的数据
但是这样做有什么性能优势吗
我有一个例子
方法1:
我使用顶点数据创建一个浮点缓冲区,并将其直接传递给glBufferData
方法2:
我使用glBufferData
分配空间,不传递任何数据。。。
我得到一个浮点缓冲区的引用。。。
我将浮点值写入到。。。我取消了缓冲区的映射
两种方法的优缺点是什么
我在这两方面都做了同样的事情吗
我认为第二种方法避免了缓冲区的重复。这有两个非常相关的方面:
glBufferData()
,包括以下内容:
glBufferData()
时,OpenGL实现为数据分配内存glBufferData()
时,OpenGL实现为数据分配内存glMapBuffer()
时,OpenGL实现返回指向其内存的指针glMapBuffer()
通常会减少额外的数据复制量,但它可能会以不希望的同步为代价。因此,为glBufferData()
或glBufferSubData()
所需的额外副本支付费用可能更有效,以避免同步点
如果您有这些更复杂的情况,您经常修改缓冲区数据,那么您确实需要开始基准测试,并且您必须预期供应商之间的差异。您还可以研究使用缓冲区映射的方案,但使用循环使用的缓冲区池而不是单个缓冲区,以减少/避免同步带来的性能损失
最重要的是,如果您在需要考虑电源/热的设备上工作,除了执行速度之外,您可能还需要测量电源使用情况。因为最快的解决方案不一定是最省电的。图形卡和驱动程序很可能会有所不同。唯一确定的方法是测量。但一般来说,
glBufferData
的性能可能会更好。创建池…并不意味着经常切换状态?。。顺便提一下thanks@YashwanthCB您需要一些绑定缓冲区的调用,但这没什么大不了的。这种方法更大的缺点是,您当然会再次使用更多内存。因此,使用更少内存的优势消失了,但您可以通过避免额外的数据复制来最大限度地提高效率。@YashwanthCB:注意,这篇文章是在讨论C/C++如何与OpenGL交互。一旦Java和它的ByteBuffer
类型参与进来,它就开始完全依赖于那些ByteBuffer
类型的工作方式。那么它将如何依赖。我已经将它标记为Java。我用过bytebuffer。因此,在您的解释中要清楚,plzI希望如果您使用直接缓冲区(如果您不知道这意味着什么),就不会因为使用Java而产生额外的副本。但我还没有证实。无论如何,一旦JavaAPI调用被编组到其本机实现中,我的答案中的所有内容仍然适用。