5评论

手机端影子的实现

/yx日音/hanx 2018-10-27 2k浏览

想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学院游戏开发行业精英群711501594

最早做了一个平面影子,现在网上的文章也很多,实现基本大同小异。本来我自己打算加入gpu instancing的特性,进一步提高影子的渲染,但我实际测试却发现,负优化。

经过别人的指导,发现是如果setpass calls没变化,那么dc其实影响不大,尤其在现在的手机上,dc不是主要的,setpass calls才是重点。

仔细找了文章:

The main reason to make fewer draw calls is that graphics hardware can transform and render triangles much faster than you can submit them. If you submit few triangles with each call, you will be completely bound by the CPU and the GPU will be mostly idle. The CPU won't be able to feed the GPU fast enough.

如果你每次只上传少量的三角形,那么gpu会经常空闲,而cpu则会不断工作收集数据传递给gpu。

But the main cost of draw calls only apply if each call submits too little data, since this will cause you to be CPU-bound, and stop you from utilizing the hardware fully.

我们可以了解到,只有当gpu空闲而cpu紧张时,减少dc才会特别明显。

再看知乎大神的说法:

说了这么多废话,总结一下就是:CPU发送给GPU的内容,可以粗浅的分为数据、状态和命令。那么这些内容都是什么时候被传输到GPU上的呢? 再说一句废话:只要数据在修改完毕后、使用之前传输到GPU上就可以了。那如果都开始渲染了,这些内容还没有传送完毕要怎么办呢?那渲染就只能等它们都传输好再开始工作。

 

为了避免渲染程序等待数据传输,为了减少宝贵的总线带宽,CPU和GPU之间的通讯需要经过一定的优化。对于数据(Constant Buffer,VB/IB,Texture)来说,因为数量多,传输时间也比较长,因此可以在Unmap一结束就将数据提交给GPU;而对于状态和命令而言,数量比较小,可能会遭遇频繁的更改,同时还需要维护彼此间的一致性,因此这部分内容可以延期到非提交不可的时候再传送到GPU上。
完整地址可以查看:https://www.zhihu.com/question/27933010

于是我发现按照这种做法,只有在压力都在cpu的时候这种做法才有意义。

只能说在cpu密集型的时候这么做才会稍有提升。虽然看上去batches很低,但其实因为dc都在cpu上,而setpass calls其实并不会有太大问题。

最后是插件地址:

https://www.assetstore.unity3d.com/en/?stay#!/content/131658