类似于Java3D的jMonkey优化技术

35

编辑:为了实现实时绘图,开始使用lwjgl作为jmonkeyengine和jocl的基础,以在opengl和opencl之间实现“互操作性”,现在可以实时计算和绘制100k个粒子。也许jmonkey engine的mantle版本可以解决这个drawcall开销问题。

几天来,我一直在学习在Eclipse(java 64位)中使用jMonkey engine(ver:3.0),并尝试如何通过使用GeometryBatchFactory.optimize(rootNode);命令来优化场景。

未经过优化(具有更改球位置的能力):

enter image description here

Okay,只有1 fps 来自于pci-express带宽和jvm开销。
优化后(无法更改球的位置能力):

enter image description here

现在即使三角形数量增加,帧率仍为29fps。
Java3D有一个setCapability()方法,可以使场景对象能够以优化的形式进行读写。jMonkey引擎3.0必须具备这个功能,但我找不到任何相关信息(已搜索教程和示例,但失败了)。
问题:如何在jMonkey 3.0中设置场景中优化节点的读/写位置/旋转/缩放能力?如果您无法回答第一个问题,请告诉我为什么使用优化命令会增加三角形数量?我是否需要创建一个新的方法来访问显卡并自己更改变量(可能是jogl?)?
场景信息:16k个粒子(16x16分辨率的球体)+1个点光源(及其4096分辨率的阴影)。
我确信我们可以轻松地通过PCI-Express在一毫秒内发送数千个浮点数。
额外信息:我正在使用Aparapi-kernels来更新粒子位置,这需要10毫秒(16k * 16k相互作用来计算力)。 (在优化模式下没有改变任何内容:( ) Aparapi能否访问这些优化数据?
针对batchNode.batch();优化的情况,这里再次提供了1 fps,对象数量减少了。

enter image description here

对象数量现在只有几百个,但fps仍然为1!

仅将球体位置发送到gpu并让其计算顶点位置可能比在cpu上计算顶点加上发送大量数据到gpu更好。

没有人来帮忙吗?已经尝试过batchNode,但效果不够好。

我不想改变3d api,因为jMonkey的人已经重新发明了轮子,而且我对当前的情况很满意。只是试图挤出更多的性能(取消阴影可以提高100%的速度,但质量也很重要!)。

这个Java程序将成为一个陨石撞击场景模拟器(将有选择陨石大小、质量、速度、角度),使用LOD的Marching-cubes算法(将有数百万粒子)。

Marching-cubes算法将大大减少三角形数量。如果您无法回答该问题,则接受任何用于Java的Marching-cubes(或任何O(n)凸包)算法!数据:x、y、z数组作为源,三角形条带数组作为目标(等值面网格点)

谢谢。

这里有一些流的样本(分辨率要低得多):

1)立方体形状的岩石群通过引力坍塌: enter image description here

2) 排斥力开始显现: enter image description here

3) 排斥力和引力使群体形成更加平滑的形状: enter image description here

4) 群体形成一个球体(如预期): enter image description here

5) 随后,一个大的恒星体靠近: enter image description here

6) 即将接触: enter image description here

7) 碰撞瞬间: enter image description here

通过Barnes-Hutt算法和截断势,粒子数量可以增加10倍(也许100倍)。

与Marching-Cubes算法不同,包裹nbody的幽灵布可以提供低分辨率外壳(比BH更容易但需要更多计算)。

幽灵布料会受到nbody(重力+排斥)的影响,但nbody不会受到包裹它的布料的影响。Nbody不会被渲染,但布料网格将以较低的三角形数量呈现。

enter image description here enter image description here

如果MC或更高版本可用,则该程序将为 ~200x 更多的粒子呈现包装布。

1
你应该在jMonkeyEngine的论坛上提出相关问题(http://jmonkeyengine.org/forums)。那里有更高的机会得到答案。这是一个非常活跃的社区。 - Zoltán
2个回答

4
在JMonkeyEngine的wiki中有一套非常完整的文档,详细介绍了如何利用你所提到的变换,可以在这里找到:高级空间概念
此外,还有关于网格及其渲染的大量信息,可以在这里查看:多边形网格

好的,谢谢提供源代码。你知道如何让OpenCL与OpenGL缓冲区协同工作吗? - huseyin tugrul buyukisik

4
非常抱歉....
您可以批量处理场景中(或子节点中)所有保持静态的几何体。
批处理意味着具有相同材料的所有几何体都合并成一个网格。仅当您总共使用较少(大约不超过32个)材质时,此优化才会产生影响。代价是批处理需要在游戏初始化时额外花费时间。
因此三角形的变化是因为它们已经全部组装成一个网格....唯一的建议是尝试获取网格并修改其上的点,但在那一点上我认为这没有意义。
也许尝试一种不同的优化方法。
祝好运,我有一段时间没有使用JMonkey了,但很高兴看到其他人使用它并且它的持续增长!
编辑:
顺便说一句,减少计算量的一种方法可能是使用半球形的立方体,对地球的影响可能不会影响另一侧(除非该球体不是地球而是作为球体采样的小样本)...
也许尝试使用二维形状作为撞击表面,尽管我知道这不会是您最好的选择,但它可能会让您了解形状数量如何影响以及有多大的影响。如果确实如此,那么一个途径可能是考虑如何去除一些粒子,如果没有,您就不必担心。我几乎肯定会。
最后:
也许不要实时渲染?花一分钟将帧绘制到缓冲区中,然后播放,到您播放时,您将再获得40个左右的帧等等...也许大约30秒钟就足够了。

我想使这个程序能在每一种硬件上运行,因此我正在尝试进行实时优化。 - huseyin tugrul buyukisik
我想说的是,你可能想要使用机器的显卡(使其可在任何硬件上运行),但只需缓冲帧即可... 至少你不能为此使用GeometryBatchFactory.optimize(rootNode); 或者我不会这样做,因为它不是预期的功能。 - msj121
如果你想要实时性,那么请考虑其他优化方式,确保你的剔除和所有常规类型的优化都做好了... - msj121

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接