编辑:为了实现实时绘图,开始使用lwjgl作为jmonkeyengine和jocl的基础,以在opengl和opencl之间实现“互操作性”,现在可以实时计算和绘制100k个粒子。也许jmonkey engine的mantle版本可以解决这个drawcall开销问题。
几天来,我一直在学习在Eclipse(java 64位)中使用jMonkey engine(ver:3.0),并尝试如何通过使用GeometryBatchFactory.optimize(rootNode);
命令来优化场景。
未经过优化(具有更改球位置的能力):
Okay,只有1 fps 来自于pci-express带宽和jvm开销。优化后(无法更改球的位置能力): 现在即使三角形数量增加,帧率仍为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,对象数量减少了。
对象数量现在只有几百个,但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)立方体形状的岩石群通过引力坍塌:
2) 排斥力开始显现:
3) 排斥力和引力使群体形成更加平滑的形状:
4) 群体形成一个球体(如预期):
5) 随后,一个大的恒星体靠近:
6) 即将接触:
7) 碰撞瞬间:
通过Barnes-Hutt算法和截断势,粒子数量可以增加10倍(也许100倍)。
与Marching-Cubes算法不同,包裹nbody的幽灵布可以提供低分辨率外壳(比BH更容易但需要更多计算)。
幽灵布料会受到nbody(重力+排斥)的影响,但nbody不会受到包裹它的布料的影响。Nbody不会被渲染,但布料网格将以较低的三角形数量呈现。
如果MC或更高版本可用,则该程序将为 ~200x 更多的粒子呈现包装布。