Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以在非主线程中创建openGL VBO/显示列表_Java_Multithreading_Opengl_Lwjgl - Fatal编程技术网

Java 是否可以在非主线程中创建openGL VBO/显示列表

Java 是否可以在非主线程中创建openGL VBO/显示列表,java,multithreading,opengl,lwjgl,Java,Multithreading,Opengl,Lwjgl,我有一个无限生成的世界,运行得很好。每次生成一个新块时,它的高度映射都会在第二个线程中生成。但是创建显示列表是不可能的,因为除了主线程外,任何线程中都没有“GLContext”。这意味着每次生成一个新的块时,都会出现一个小的滞后峰值,当一次生成几个块时,这个峰值就会变得明显 我要问的是,是否有一种方法可以在另一个线程中创建显示列表或顶点缓冲区对象,然后在主线程中绑定它或其他对象 我已经用VBO尝试过了,但与显示列表相比速度非常慢。一种可能更简单的方法是使用第二个线程在内存中生成VBO数据,然后使

我有一个无限生成的世界,运行得很好。每次生成一个新块时,它的高度映射都会在第二个线程中生成。但是创建显示列表是不可能的,因为除了主线程外,任何线程中都没有“GLContext”。这意味着每次生成一个新的块时,都会出现一个小的滞后峰值,当一次生成几个块时,这个峰值就会变得明显

我要问的是,是否有一种方法可以在另一个线程中创建显示列表或顶点缓冲区对象,然后在主线程中绑定它或其他对象


我已经用VBO尝试过了,但与显示列表相比速度非常慢。

一种可能更简单的方法是使用第二个线程在内存中生成VBO数据,然后使用异步数据传输从主线程传输到GPU(使用现在无处不在的)


现在,从VBO渲染数据应该相当快。务必使用
gldrawerelements
glmultidrawerelements
glPrimitiveRestartIndex
和该系列的其他部分,以尽量减少绘图调用的次数。因此,根本不需要显示列表。

一种可能更简单的方法是使用第二个线程在内存中生成VBO数据,然后使用异步数据从主线程传输到GPU(使用现在无处不在的)


现在,从VBO渲染数据应该相当快。务必使用
gldrawerelements
glmultidrawerelements
glPrimitiveRestartIndex
和该系列的其他部分,以尽量减少绘图调用的次数。因此,根本不需要显示列表。

是的,您需要使用多个渲染上下文来执行此操作,因为在任何给定时刻,只有一个线程可以拥有上下文。此外,您需要启用多个上下文之间的资源共享。但一旦这样做,某些类型的对象(例如缓冲区对象和显示列表)就可以在上下文之间共享。请注意,每个上下文都有其唯一的状态机,您真正共享的唯一内容是数据和缓冲区/显示列表名称。是的,您需要使用多个渲染上下文来完成此操作,因为在任何给定时刻,只有一个线程可以拥有上下文的所有权。此外,您需要启用多个上下文之间的资源共享。但一旦这样做,某些类型的对象(例如缓冲区对象和显示列表)就可以在上下文之间共享。请注意,每个上下文都有其独特的状态机,您真正共享的唯一内容是数据和缓冲区/显示列表名称。伙计,对于您为我提供的所有答案,我真的非常感谢您,我觉得我现在可以真正地完成我的项目了。非常感谢:-德曼,对于你提供给我的所有答案,我真的非常感谢你,我觉得我现在真的可以完成我的项目了。非常感谢你