由activision&blizzard旗下的,坐落在加拿大的radical entertainment带来:http://www.gamasutra.com/view/feature/169769/fire_blood_explosions_prototype_.php?print=1
radical entertainment虽然带来的暴力畅快的游戏,但是还是于12年被关闭,不免有点蛋蛋的忧伤。
prototype系列一直血腥无比,里面特效系统功不可没,
特效制作
cache friendly
内存优化
频繁allocate造成严重的memory fragment,解决方式就是使用memory pool,pool满了之后,再进行dynamic的heap allocate.
另外一个很棒的方法是把particle分类:
vertex buffer memory
这个也是每个particle系统必会提到的,这个文章里面的情况有些特殊,只能在console上面这种有内存绝对控制权的平台上面使用,对于pc不太行。
prototype2是使用一个frame allocator(每帧清掉,线性递增)来处理,这个也是有些年头的技术了,大家很熟悉了
与美术一同处理性能
虽然美术也是有这样的性能意识,但是在压力之下(项目总是很容易出现这个情况,或者说这就是应该出现的情况),美术很难再保持对性能的关注。
这点在prototype1的开发过程,让radical entertainment没少吃苦头。
那么程序这边就需要来良好的帮助美术,找到有问题的点,进行处理。把所有特效都处理的高效,听起来很美,但是现实中不具备实现的条件。
第一个是可视化的给出特效的百分比,这个非常的棒,尤其是pc平台的开发,因为平台机器性能的问题,可能有一些强力机器上面跑得非常快,一个东西1点几毫秒,你很难说它是快是慢。
但是放成比率,那么准确度就大幅度上升了。
这样美术可以较为容易的看到消耗,另外还有一些文字化的统计信息,也非常的好:
prototype2还是用occlusion query来标识overdraw,也是particle消耗的重要方面。
这样美术可以比较直观的看到相关的所有,这也让对性能的控制更加的容易了。
LOD等性能的控制
如第一部分提到的,有脚本来控制一些attribute,这样就在lod的时候,可以做到一个smooth的改变。
同时也会根据上一帧的性能情况进行dynamic lod的改变,更少的,更低lod的particle生成等等。
渲染
Add-Alpha Shader Code
// Add-alpha pixel shader. To be used in conjunction
// with the blend factors {One, InverseSourceAlpha}
float4 addalphaPS(
float4 vertexColour : COLOR0,
float2 uvFrame0 : TEXCOORD0,
float2 uvFrame1 : TEXCOORD1,
float subFrameStep : TEXCOORD2 ) : COLOR
{
// Fetch both texture frames and interpolate
float4 frame0 = tex2D( FXAtlasSampler, uvFrame0 );
float4 frame1 = tex2D( FXAtlasSampler, uvFrame1 );
float4 tex = lerp(frame0, frame1, subFrameStep);
// Pre-multiply the texture alpha. For alpha-blended particles,
// this achieves the same effect as a SourceAlpha blend factor
float3 preMultipliedColour = tex.rgb * tex.a;
float3 colourOut = vertexColour.rgb * preMultipliedColour;
// The vertex alpha controls whether the particle is alpha
// blended or additive; 0 = additive, 1 = alpha blended,
// or an intermediate value for a mix of both
float alphaOut = vertexColour.a * tex.a;
return float4( colourOut, alphaOut );
}