加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2012-08-26 09:26:16)
标签:

转载

分类: 三维动画

一、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 事件中最多只能处理500w个粒子。这个说法来自3DS Max2011 Help,见下图:


翻译过来是:在单个粒子系统中,你有办法使用超过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粒子的说法是不成立的。

0

  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有