如果你的游戲需要在配置非常低的平臺上進行流暢運行,你可以考慮犧牲一定的效果精度將部分片元著色器的內(nèi)容放到頂點著色器計算。比如你可以將鏡面反射的計算放到頂點著色器階段進行計算,在在片元階段對其進行插值。雖然會損失一定的精度,不過能帶來明顯的效果提升。
不是所有的光照都需要進行完整的光照計算。比如一些氛圍燈。你可以在主Pass的頂點階段使用
o.vertexLights = ShadeVertexLights (v.vertex, v.normal);
這一行代碼來完成對VertexLight的支持
你需要觀察你繪制一個物體的所需的pass數(shù)量已經(jīng)你的場景網(wǎng)格是否正確的進行了批處理batching。
還有一些外部工具可以用來檢查你的渲染流程。iOS上的Xcode就自帶了非常方便的frame profiler。可以極大程度的準確的讓你了解你的應用的渲染耗時。
PC上有Intel GPA可以幫助我們進行檢查。
需要主要的是,針對Android手機的性能檢查,需要根據(jù)針對平臺的硬件使用不同的檢測器。
比如Android上GPU就分為了ARM Mali之類的。
1. 盡量使用常數(shù)運算減少超越運算。
2. 先計算浮點型的乘法,再進行向量型的乘法。
3. 盡量不要使用discard這個指令,特別是手游上,這會打斷手機上的tile based render。
4. 將不重要的計算內(nèi)容放到頂點著色器上。
5. 如果不是一整個float3或者float4都參與計算,請多多使用特定的分量來計算
6. 避免在shader中根據(jù)外部數(shù)值導致的分支計算(少用if-else)
7. 根據(jù)你的render model(OpenGL 2, OpenGL 3, OpenGL ES, etc.),檢查你在著色器的指令。比如ddx,ddy, discard, floor之類的指令