编辑:为了实时绘图,在opengl和opencl之间的“互操作性”中开始使用ljjgl(jmonkeyengine和jocl的基础),现在可以实时计算和绘制100k粒子。也许mamon版本的jmonkey引擎可以解决这个drawcall开销问题。
有几天,我一直在学习Eclipse(java 64位)中的jMonkey引擎(版本:3.0),并尝试使用GeometryBatchFactory.optimize(rootNode);
命令优化场景。
没有优化(具有更改球体位置的能力):
好的,只有1-fps来自pci-express带宽+ jvm开销。
通过优化(无法更改球体位置):
现在即使三角形数量增加也是29 fps。
Java3D有一个setCapability()
方法,即使是以优化的形式也可以读取/写入场景对象。 jMonkey引擎3.0必须能够满足这个主题,但我找不到它的任何痕迹(搜索过的教程和示例,失败了)。
问题:如何在jMonkey 3.0中设置场景的read/write position/rotation/scale
个节点的optimized
功能?如果你不能回答第一个问题,你能告诉我为什么在使用优化命令时三角数会增加吗?我是否必须创建一种新方法来访问图形卡并自行更改变量(可能是jogl?)?
场景信息:16k粒子(16x16 res的球体)+ 1点光源(及其4096分辨率的阴影)。
我确信我们可以通过pci-express轻松地在几毫秒内发送数千个浮点数。
对于batchNode.batch();
优化的情况,这里再次使用减去对象数的1 fps:
对象编号现在只有几百个,但fps仍然是1!
将球体位置发送到gpu并让它计算顶点位置可能比计算cpu上的顶点以及向gpu发送大量数据更好。
这里没有人帮忙吗?已经尝试过batchNode但没有帮助。
我不想改变3d api,因为jMonkey人已经重新发明了轮子,我很满意当前的情况。只是试图挤出更多的性能(取消阴影给出100%的速度,但质量也很重要!)。
这个java程序将成为一个小行星撞击场景模拟器(可选择小行星大小,质量,速度,角度),带有LOD的行进立方体算法(将有数百万个粒子)。
Marching-cubes算法会大大减少三角形数字。如果你无法回答这个问题,那么任何行进立方体(或任何O(n)凸包)算法都将被接受!数据:作为源的x,y,z数组和作为目标的三角形条带阵列(等面网格点)
感谢。
以下是有关流的一些示例(分辨率低得多):
1)通过引力折叠立方体形状的岩石组:
2)排斥力开始显现:
3)排斥力+引力使得组形成更平滑的形状:
4)组形成一个球体(如预期的那样):
5)然后,一个大的恒星身体接近:
6)即将触摸:
7)影响的时刻:
借助Barnes-Hutt算法和截断电位,粒子数将增加10倍(可能超过100倍)。
而不是Marching-Cubes算法,包裹nbody的鬼布可以提供低分辨率的船体(比BH更容易但需要更多的计算)
幽灵布会受到nbody(重力+排除)的影响,但是不会受到包裹它的布的影响。 Nbody不会被渲染,但布料网格将以较低的三重计数呈现。
如果MC或以上版本有效,这将让程序渲染一个包裹布,大约200倍的粒子。
答案 0 :(得分:4)
很抱歉....
您可以批量保持静态
的场景(或子节点)中的所有几何体。批处理意味着具有相同材质的所有几何体都组合成一个网格。如果仅使用少量(大约32个)材料,则此优化仅起作用。回报是在游戏初始化时批量处理需要额外的时间
因此,三角形的变化是因为它们全部被组装成一个网格....如果有必要,唯一的建议是尝试获取网格并改变它上面的点,但那时我不认为这是有道理的。
也许尝试不同的优化方法。
祝你好运,暂时没有使用过JMonkey,但很高兴见到别人这样做并继续增长!
修改的
顺便说一句,最小化数学的一种方法可能是使用半个球体的立方体,对地球的影响可能不会影响另一面(除非球体不是地球但已经是一小部分样本地球作为一个球体)...也许尝试使用2d形状作为撞击表面,虽然我知道这不是您的最佳选择,但它可能会让您了解形状的数量如何影响以及如何变大。如果确实如此,那么可能会考虑如何去除一些颗粒,如果不是这样,你不必担心。我几乎肯定会的。
最后:
也许不实时渲染?花一点时间将画面画到一个缓冲区然后播放,到你播放的时候你将有另外40个左右的画面......等等,你可能需要大约30秒。
答案 1 :(得分:4)
JMonkeyEngine wiki中有一套非常可靠的文档,它们详细介绍了如何利用您所指的转换,可在此处找到:Advanced Spatial Concepts。
此外,还有很多关于网格及其渲染的信息,您可以在此处查看:Polygon Meshes。