jMonkey优化类似于Java3D的

时间:2012-11-12 21:55:58

标签: java opengl java-3d jmonkeyengine aparapi

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

有几天,我一直在学习Eclipse(java 64位)中的jMonkey引擎(版本:3.0),并尝试使用GeometryBatchFactory.optimize(rootNode);命令优化场景。

没有优化(具有更改球体位置的能力):

enter image description here

好的,只有1-fps来自pci-express带宽+ jvm开销。

通过优化(无法更改球体位置):

enter image description here

现在即使三角形数量增加也是29 fps。

Java3D有一个setCapability()方法,即使是以优化的形式也可以读取/写入场景对象。 jMonkey引擎3.0必须能够满足这个主题,但我找不到它的任何痕迹(搜索过的教程和示例,失败了)。

问题:如何在jMonkey 3.0中设置场景的read/write position/rotation/scale个节点的optimized功能?如果你不能回答第一个问题,你能告诉我为什么在使用优化命令时三角数会增加吗?我是否必须创建一种新方法来访问图形卡并自行更改变量(可能是jogl?)?

场景信息:16k粒子(16x16 res的球体)+ 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算法会大大减少三角形数字。如果你无法回答这个问题,那么任何行进立方体(或任何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不会被渲染,但布料网格将以较低的三重计数呈现。

enter image description here enter image description here

如果MC或以上版本有效,这将让程序渲染一个包裹布,大约200倍的粒子。

2 个答案:

答案 0 :(得分:4)

很抱歉....

您可以批量保持静态

的场景(或子节点)中的所有几何体。

批处理意味着具有相同材质的所有几何体都组合成一个网格。如果仅使用少量(大约32个)材料,则此优化仅起作用。回报是在游戏初始化时批量处理需要额外的时间

因此,三角形的变化是因为它们全部被组装成一个网格....如果有必要,唯一的建议是尝试获取网格并改变它上面的点,但那时我不认为这是有道理的。

也许尝试不同的优化方法。

祝你好运,暂时没有使用过JMonkey,但很高兴见到别人这样做并继续增长!

修改

顺便说一句,最小化数学的一种方法可能是使用半个球体的立方体,对地球的影响可能不会影响另一面(除非球体不是地球但已经是一小部分样本地球作为一个球体)...

也许尝试使用2d形状作为撞击表面,虽然我知道这不是您的最佳选择,但它可能会让您了解形状的数量如何影响以及如何变大。如果确实如此,那么可能会考虑如何去除一些颗粒,如果不是这样,你不必担心。我几乎肯定会的。

最后:

也许不实时渲染?花一点时间将画面画到一个缓冲区然后播放,到你播放的时候你将有另外40个左右的画面......等等,你可能需要大约30秒。

答案 1 :(得分:4)

JMonkeyEngine wiki中有一套非常可靠的文档,它们详细介绍了如何利用您所指的转换,可在此处找到:Advanced Spatial Concepts

此外,还有很多关于网格及其渲染的信息,您可以在此处查看:Polygon Meshes