ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-缓冲VBO数据的小延迟

2019-12-08 02:01:17  阅读:249  来源: 互联网

标签:lwjgl multithreading vbo opengl java


我正在研究一款受《我的世界》启发的图形引擎,即将在实际游戏中实现.在几何压力测试下,我的引擎达到了60 FPS.我仅将LWJGL用于图形帮助.有一次,更新本地内存上的VBO数据有很大的延迟,但是我通过多线程,精简和同步通用块剔除器/构造器解决了这一问题.

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

这给我留下了两个问题:

>是否可以使用比glBufferData更快的另一种数据缓冲方法? (也许是一种将第二个缓冲区作为准备的多线程方法,它将把挂钩移动到第二个线程)?
>如果没有,我将如何使用指示多维数据集角的浮点矩阵(易于操作)从本地内存(可能是视频内存)实现直接遮挡剔除?请注意,反门户与我的框架不兼容.

或者,用“普通”英语:如何在不进一步减小数据大小的情况下使用glBufferData加快将数据缓冲到vram的速度?

更新:将运行自定义遮挡剔除路线.我相当确定我的数据缓冲时间会大大增加添加被阻塞的块所花费的时间,并且甚至有可能由于同步更新而被延迟,因为剔除更新程序会锁定这些数据.如果有人对从缓冲区中剔除遮挡提出建议,那就太好了.

更新2:一旦添加了隐藏脸部剔除(两个接触的脸部=没有渲染),问题就被同时解决了.我现在不需要额外的性能提升,仅此一项就使我的缓冲区大小减小了90%,帧速率提高了400%.感谢您的回答RTS.

解决方法:

是的,有两种方法.

>使用glBufferSubData
>将缓冲区使用率设置为动态或流
>使用glMapBuffers
>使用较小的顶点图元(浮点型而不是双精度型,或者短型而不是int精度)
>确保数据对齐
>交织您的VBO,因此您只需要做一次缓冲区更新
>使用VAO(顶点数组对象)
>使用双重缓冲,以便在需要使用帧渲染时将数据提前上载到VBO,以避免资源冲突.
>使用连接的图元来避免重复的顶点(GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN等)

标签:lwjgl,multithreading,vbo,opengl,java
来源: https://codeday.me/bug/20191208/2088203.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有