35

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

几天来,我一直在 Eclipse(java 64 位)中学习 jMonkey 引擎(ver: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 轻松地在一毫秒内发送数千个浮点数。

  • 附加信息:我正在使用 Aparapi-kernels 更新粒子位置,这需要 10 毫秒(16k * 16k 相互作用来计算力)。(在优化模式下不会改变任何东西:()aparapi 可以访问那些优化的数据吗?

对于batchNode.batch();优化的情况,这里又是 1 fps,对象数减少:

在此处输入图像描述

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

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

没人来帮忙吗?已经尝试过 batchNode 但没有提供足够的帮助。

我不想更改 3d api,因为 jMonkey 人已经重新发明了轮子,我对目前的情况感到满意。只是想提高一点性能(取消阴影可以提高 %100 的速度,但质量也很重要!)。

这个java程序将成为一个小行星撞击场景模拟器(可以选择小行星的大小、质量、速度、角度),带有LOD的行进立方体算法(将是数百万个粒子)。

Marching-cubes算法会大大减少三角形数。如果您不能给出任何答案,那么任何用于 java 的行进立方体(或任何 O(n) 凸包)算法都将被接受!数据:x、y、z 阵列作为源,三角带阵列作为目标(等表面网格点)

谢谢。

以下是有关流的一些示例(分辨率低得多):

1) 一个立方体形岩群在引力作用下的坍塌: 在此处输入图像描述

2)排斥力开始显现: 在此处输入图像描述

3)排斥力+万有引力使团形成更光滑的形状: 在此处输入图像描述

4)组形成一个球体(如预期的那样): 在此处输入图像描述

5)然后,一个巨大的星体接近: 在此处输入图像描述

6)即将触摸: 在此处输入图像描述

7) 撞击时刻: 在此处输入图像描述

在 Barnes-Hutt 算法和截断势的帮助下,粒子数将增加 10 倍(可能是 100 倍)。

而不是 Marching-Cubes 算法,包裹 nbody 的幽灵布可以提供低分辨率的船体(比 BH 更容易但需要更多计算)

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

在此处输入图像描述 在此处输入图像描述

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

4

2 回答 2

4

JMonkeyEngine wiki 中有一组非常可靠的文档,其中讨论了很多关于如何利用您所指的转换的内容,可以在此处找到:高级空间概念

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

于 2012-11-21T22:13:08.843 回答
4

非常抱歉....

您可以批处理场景(或子节点)中保持为 static的所有几何图形。

批处理意味着具有相同材质的所有几何图形组合成一个网格。仅当您总共只使用少量(大约最多 32 种)材质时,此优化才有效。回报是在游戏初始化时批处理需要额外的时间

因此,三角形的变化是因为它们已经全部组装成一个网格......如果有必要,唯一的建议是尝试获取网格并改变其上的点,但在这一点上,我认为它不会感觉。

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

祝你好运,有一段时间没有使用过 JMonkey,但很高兴看到其他人使用它并且它的持续增长!

编辑

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

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

最后:

也许不实时渲染?花一分钟时间将帧绘制到缓冲区然后播放,当你播放时,你将有另外 40 帧左右的帧等......也许你只需要大约 30 秒的时间。

于 2012-11-21T19:01:26.273 回答