[转载]Particle Flow在海量粒子渲染上的测试&结论

标签:
转载 |
分类: 三维动画 |
一、Instancer数量的测试及结论
1、Render Operator在Single Mesh渲染模式下最多支持500w面(粒子系统生成的模型,通称Instancer)的渲染,超过500w渲染之后就停止渲染新的粒子(Instancer)。下图为证(200w粒子按直线从上往下发射,粒子的形态是Cube 3D,每个Cube 12个面)。渲染均采用default scanline renderer。
上图截取自3DS Max2011 Help
2、渲染的粒子模型总数超过500w面的情况下请使用MultipleMeshes渲染模式,这个模式有两个参数分别是Mesh Count和Particles p/Mesh。第一点中提到的Single Mesh渲染模式意思是把单个粒子系统中每个粒子所替代的几何体的总和当作一个Mesh来渲染,一个Mesh最多是500w面。Multiple Meshes中可以把所有粒子分成若干部分,每个部分视为一个Mesh来渲染,因此可以渲染n个Mesh也就是500w*n,Mesh Count意思是particle flow粒子系统渲染的单个Mesh的最大数量(当然最大数量不能超过500w),Particle p/ Mesh意思是每个Mesh中所包含的粒子数量。
测试一:举个例子
200w个粒子,每个粒子所替代的模型为12个面的cube(box),那应渲染的模型总面数为200w*12= 2400w,单个mesh最大500w面,拿500w÷12 = 41.67w(粒子),取整40w粒子,也就是一个mesh中最多包含约40w粒子(cube模型),那么我们可以设定Particle p/Mesh为40w,那200w÷40w =5(个mesh),那么在这个情况下我们设定的参数就是如下图:
400000(个粒子)*12(面)*5(个mesh)=2400w(面)
按照这个参数测试渲染,结果如下:
因为场景中还有几个简单的模型,因此模型总数比2400w稍多几十个面,因此我们所假定的计算方式是正确的。
一个mesh中可以包含40w粒子,那少于40w也是可以的,因此我测试了下不同的数值搭配及其所消耗的时间及内存(同一max文件在多次渲染过后3ds max运行稳定的情况下做的测试)
Mesh Count
Particles p/Mesh
Render time
Faces
Peak Memory used
Test_1
5
400000
29s
24000016
3008.3M
Test_2
50
40000
25s
24000016
2936.0M(smallest)
Test_3
500
4000
24s(fastest)
24000016
2936.4M
Test_4
5000
400
28s
24000016
2940.6M
Test_5
5000
400000
30s(slowest)
24000016
3051.1M(largest)
测试结果显示Test_3的综合结果比较理想,最终结论等接下来的另一个测试后一并给出。
那么通过Multiple Meshes渲染模式,通过合理的参数配置就可以以渲染超过500w面的粒子Instancer了。
Mesh Count最大值为10000,Particlesp/Mesh最大值为999999,理论上Multiple Meshes渲染模式下所能渲染的最大多边形面数为10000*500w = 5千亿,达到这么多面数大致需要71677G的内存。
测试二:更加实际的情况
粒子替代面数为192的石块模型,500w÷192 = 2.6w,也就是说每个mesh中最多可包含2.6w(替代了192个面的石块的)粒子,粒子总数20w,总面数20w*192 =3840w,20w÷2.6w =7.692(个mesh),保守组合为Mesh Count = 8,Particles p/Mesh = 26000。测试渲染如下图:
注:粒子形态不是测试重点
不同组合测试:
Mesh Count
Particles p/Mesh
Render time
Faces
Peak Memory used
Test_1
8
26000
50s
38400196
5504.8M
Test_2
80
2600
48s(fastest)
38400196
5422.7M
Test_3
800
260
49s
38400196
5402.4M(smallest)
Test_4
8000
26
56s(slowest)
38400196
5416.5M
Test_5
8000
26000
52s
38400196
5547.2(largest)
综合测试二与测试一的结果,得出结论如下:
在综合考虑渲染时间成本和内存占用高峰值的情况下,Mesh Count和Particles p/Mesh,两个参数均越小越好,两者之和也是越小越好。例如:800和260的组合所得的结果就优于8和26000的组合。
关于max2011 Help中的解释谬误:
经过前面的测试可以得出结论应该是more,正确的翻译是(从IF the result…开始翻):如果(该粒子系统中)粒子总数除以Particles p/Mesh的值大于所指定的Mesh Count的值,有些mesh可能只会包含部分的多边形面或者不包含任何多边形面(也就是粒子感觉“渲少了”)。
二、Particle Flow最多只能渲染500W粒子?
其实指的是每个pf
翻译过来是:在单个粒子系统中,你有办法使用超过1000w的粒子数量,方法就是使用多个pf source,然后连接他们到同一个粒子出生事件。注意:无论如何Particle Flow每事件所能传送给渲染器的最大粒子数量为500w。
经过实际测试Upper Limit最大可以设置到1000000000(10亿),见下图。已经超过help上写的10000000(1千万),估计是因为max help版本有点太老了,又没有及时更新。
建立一个最简单的pf粒子系统,用krakatoa实际渲染测试,2000w粒子的渲染结果如下图:
甭管渲的好不好看,500w和1000w的所谓限制,都突破了,看来真可能是max更新了,但是help没有更新。
2000w往上还能多高?见下图
6000w粒子测试,已经达到了8G Win7_64的极限(没做prt粒子缓存,做了之后读取会更节约内存)。此时大部分的时间并不是在花在渲染上,而是花在更新6000w的粒子系统上,而且pflow是单线程的,因此速度比较慢。
题外话:Krakatoa的威力被内存给限制住了,如果内存达到128G的话理论上能渲染的粒子数量能上到9亿(不做prt缓存的情况下,做了能渲染更多粒子),这才开始接近particle flow的Upper Limit(10亿)。
结论:测试表明Particle Flow粒子系统最多只能渲染500W粒子的说法是不成立的。