WebGL切换着色器和纹理的性能代价

7

I. 如何切换着色器效果更好? 1.使用一个大的着色器程序,并在着色器程序中使用uniform和if / else子句来使用不同的效果。 2.在调用之间切换程序。

II. 使用一个大纹理还是多个小纹理更好?上传纹理会花费很多吗?绑定纹理呢?

1个回答

14

嗯,最好编写一些性能测试并尝试,但总的来说:

  • 小shader比大shader快。
  • 1个纹理比多个纹理更快。
  • 上传纹理很慢。
  • 绑定纹理很快。
  • 切换程序很慢,但通常比将两个小程序组合成一个大程序要快得多。

特别是片段着色器每帧执行数百万次。1920x1080显示屏有200万个像素,所以即使没有超过绘制次数,你的着色器每帧也会被执行200万次。对于任何每帧执行200万次或者如果你的目标是60帧每秒则需要每秒执行120亿次的东西,越小越好。

至于纹理,mips比没有mips快,因为GPU有一个用于纹理的缓存,如果它下一个需要的像素与之前读取的接近,则它们可能已经在缓存中了。如果它们彼此很远,那么它们就不在缓存中。这也意味着从纹理随机读取特别慢。但大多数应用程序在纹理上读取相当线性。

切换程序足够慢,以至于按照使用程序的模型对它们进行排序,这样你首先绘制所有使用程序A的模型,然后再绘制所有使用程序B的模型,通常比按随机顺序绘制它们要快。但还有其他影响性能的因素。例如,如果一个大模型遮挡了一个小模型,那么最好先绘制大模型,因为小模型将会失败深度测试(z-buffer),并且不会有其片段着色器执行任何像素。所以这是一个权衡。你只能真正测试你特定的应用程序。

此外,正确测试非常重要。 http://updates.html5rocks.com/2012/07/How-to-measure-browser-graphics-performance


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接