Java 缓冲VBO数据时的小延迟

Java 缓冲VBO数据时的小延迟,java,multithreading,opengl,vbo,lwjgl,Java,Multithreading,Opengl,Vbo,Lwjgl,我正在开发一个以minecraft为灵感的图形引擎,不久将在实际游戏中实现。我已经让引擎在几何应力测试下达到60+每秒。我只使用LWJGL进行图形辅助。在本地内存上更新VBO数据时,我曾经有过很大的延迟,但我通过多线程、优化和同步通用块剔除器/构造函数解决了这一问题 在剔除后将VBO数据缓冲到视频内存的过程中,我偶尔会遇到一个小故障(20-3000毫秒),这可能会导致屏幕在该时间段内冻结。我认为出现延迟的原因是因为我每两帧通过glBufferData(静态绘制模式)向VBO(3-5mb)发送大量

我正在开发一个以minecraft为灵感的图形引擎,不久将在实际游戏中实现。我已经让引擎在几何应力测试下达到60+每秒。我只使用LWJGL进行图形辅助。在本地内存上更新VBO数据时,我曾经有过很大的延迟,但我通过多线程、优化和同步通用块剔除器/构造函数解决了这一问题

在剔除后将VBO数据缓冲到视频内存的过程中,我偶尔会遇到一个小故障(20-3000毫秒),这可能会导致屏幕在该时间段内冻结。我认为出现延迟的原因是因为我每两帧通过glBufferData(静态绘制模式)向VBO(3-5mb)发送大量几何数据。我已经实现了块截锥剔除、块截锥剔除、空气块剔除和定向环境剔除器

这给我留下了两个问题:

  • 我是否可以使用比glBufferData更快的另一种数据缓冲方法?(可能是多线程处理第二个缓冲区作为准备的一种方法,它会将挂接装置移动到第二个线程)

  • 如果没有,我将如何使用表示立方体角的浮点矩阵(易于操作),从本地内存(可能是视频内存)实现直接遮挡剔除?注意,反端口与我的框架不兼容

  • 或者,简单地说:如何使用glBufferData加速数据到vram的缓冲,而不进一步减小数据大小

    更新:将运行自定义遮挡剔除路由。我相当肯定我的数据缓冲时间大大增加了添加阻塞块所需的时间,甚至可能由于消隐更新程序获取锁而被同步延迟。如果有人建议从缓冲区中剔除遮挡,那就太好了


    更新2:当我添加了隐藏面剔除(两个接触面=两个都不渲染)后,问题巧合地解决了。我现在不需要额外的性能提升,因为仅此一项就可以将缓冲区大小降低90%,帧速率提高400%。谢谢你的回答。

    是的,有两种方法

  • 使用glBufferSubData
  • 将缓冲区使用设置为动态或流
  • 使用glMapBuffers
  • 使用较小的顶点基本体(float而不是double,或short而不是int)
  • 确保数据对齐
  • 交错VBO,以便只需执行一次缓冲区更新
  • 使用VAO(顶点阵列对象)
  • 使用双缓冲,以便在需要使用帧进行渲染时,将数据以高级格式上载到VBO,以避免资源冲突
  • 使用连接的基本体避免重复的顶点(GL_三角形条、GL_三角形扇等)

  • 1.我尝试将此函数替换为我的VBO更新程序函数,但它没有发送任何数据。这似乎对ARB不起作用。2.将其设置为动态,虽然有一点帮助,但还不够。3.仍然需要进行实验,在这么晚的时间里努力工作。4.它尽我所能小(浮动)。5.完成。6.已经有了。7.不是选项,因为我使用的是drawrangeelements和交错格式。8.设置了双缓冲。9我尝试过这样做,但无论我多么希望它能工作,它都无法与此设置一起工作。这就给我留下了一些实验和遮挡剔除的机会。@Sean你确定9点吗。您应该能够使用GL_三角形_带和退化三角形制作任何形状。此外,还要确保正确使用glBufferSubData,因为它需要一系列必须更新的数据。glBufferSubData通常应该更快,因为它不必重新锁定缓冲区。但是,缓冲区必须足够大,以容纳顶点数据。