Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.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 渲染期间的高cpu负载_Java_Opengl_Jogl - Fatal编程技术网

Java 渲染期间的高cpu负载

Java 渲染期间的高cpu负载,java,opengl,jogl,Java,Opengl,Jogl,我正在渲染由大约500k个三角形组成的相当重的对象。我使用opengl显示列表,在render方法中只调用glCallList。我认为一旦图形原语被编译到显示列表中,cpu的工作就完成了,它只是告诉gpu画图。但现在一个cpu核心的负载高达100% 你能给我一些线索为什么会这样吗 更新:我已经检查了运行glCallList需要多长时间,它很快,运行它大约需要30毫秒很可能您达到了列表长度的限制,即每个列表64k个顶点。试着把你的500k三角形(1500k顶点?)分成小块,看看你得到了什么 顺便说

我正在渲染由大约500k个三角形组成的相当重的对象。我使用opengl显示列表,在render方法中只调用glCallList。我认为一旦图形原语被编译到显示列表中,cpu的工作就完成了,它只是告诉gpu画图。但现在一个cpu核心的负载高达100%

你能给我一些线索为什么会这样吗


更新:我已经检查了运行glCallList需要多长时间,它很快,运行它大约需要30毫秒

很可能您达到了列表长度的限制,即每个列表64k个顶点。试着把你的500k三角形(1500k顶点?)分成小块,看看你得到了什么


顺便说一句,你用的是什么图形芯片?如果顶点是在CPU上处理的,这也可能是一个问题。显示列表神奇地将所有内容卸载到GPU,这有点像神话。如果真是这样,纹理对象和顶点缓冲区就不需要添加到OpenGL中。所有显示列表实际上都是一种方便的方式,可以重放一系列OpenGL调用,并有望节省一些函数调用/数据转换开销(请参阅)。据我所知,我使用的所有PC硬件实现似乎都没有做过比这更多的事情;也许在SGI工作站时代有所不同,但现在缓冲区对象是一种发展方向。(而现代的OpenGL书籍,如glBegin/glEnd等,只有在深入了解新内容之前才会最简短地提及)

我所看到的显示列表带来巨大差异的一个地方是GLX/X11案例,其中您的应用程序正在远程运行到您的显示器(X11“服务器”);在这种情况下,使用显示列表确实只会将所有显示列表状态推送到显示端一次,而非显示列表即时模式应用程序需要使用更多带宽在每一帧再次发送一组内容


但是,抛开显示列表不谈,您应该注意vsync和繁忙等待(或其幻觉)的一些问题。。。请参见

您使用的是简单的游戏循环还是vsync?通常,没有
睡眠的游戏循环需要100%的CPU。30毫秒是巨大的。每秒30帧意味着每帧33毫秒,所以你只剩下3毫秒了。。。避免显示列表,顺便说一句。@Scan,我使用FPSAnimator@Calvin1602显示列表有什么问题?我检查了哪些函数消耗cpu,它们来自atioglx2.dll。不幸的是,我不能检查现在是否达到了极限,一段时间后。我使用的是ATI Mobility Radeon HD 2600图形card@misha您确定没有获得SW渲染吗?如果没有,那么您打破了限制。我没有设置任何选项来进行软件渲染。该限制64k是针对一个显示列表还是针对所有显示列表,例如,只有一个显示列表不能超过它,或者所有显示列表的总和不能超过它?@misha该限制针对一个列表。我的意思是,如果你使用的是你的硬件不支持的东西,你会得到软件渲染。