Batch、Plant、Geometry & VS
算是这一阶段的总结吧
通常场景中会出现需要绘制多个相同模型的情况,普通处理方法是每个模型1个Vertex Buffer,使用1个DrawPrimitive(或是OpenGL中的DrawElements),这样过多的DP调用会限制FPS,于是就有了xxx Instancing的方法,如此引发出一系列的思考。
Batch
以当前ShaderConst个数为单位,分配一个VB,空间大小 = 单个Instance的大小 x Number。其中Number的大小视每个Instance的信息量为参考。然后在Draw之前,每个Instance在Attach时将个人信息提交上来,最后在Draw的时候,DP的调用次数可以减少到 Instance个数 / Number (+1)。
Plant
延伸出的一个典型:场景中会有大量的花、草,它们会“随风摇摆”。于是乎,它们是最适合使用Instancing的技术,至于摇摆,使用shader模拟会比使用Dynamic Buffer帧动画效率来得高很多。
Geometry
需要注意的问题,在准备Batch所需要的VB时,因为要写入index的信息,而且Index Buffer也要调整,所以要注意重组后的数据正确。
VS
因为要检查ShaderConst的数量支持,所以想当然得直接取Caps.MaxVertexShaderConst,而Instancing需要写shader,测试了一下,发现VS1.0(1.1)有96个,VS2.0有256个,于是提供2个版本,然后程序根据配置自动选择。
没那么简单,在GF3以下或GF4MX使用模拟VS的情况下,如果是SOFTWARE_VERTEXPROCESSING,其个数是8192,VS版本是3.0 …… 好吧,那就判断是HW还是SW。
暂时OK,过了一会儿,测试人员叫道:怎么什么东西都没有了?!?!!一看,的确没有,想一想,哇靠,他的显卡是ATI 9000,查一下Caps,晕倒,ShaderConst竟然是192,VS1.1,吐血ing~ 只好再加一个版本……
感悟:一个新技术,在由DEMO转为实用,需要考虑更多的东西,也由于PC平台的原故,相对Console需要注意更多的Exception出现。程序员、尤其是游戏程序员,好命苦……也很幸福~ ^_^