什么是OpenGL/DirectX
OpenGL/DirectX 是图像应用编程接口,用来渲染二维,三维图形。如果没有 OpenGL/DirectX 想要访问GPU是很麻烦的,可能要和各种寄存器,显存打交道。OpenGL/DirectX将上层应用程序与底层GPU之间架起一座“桥梁”。
当应用程序通过上面编程接口后,这些接口会依次向显卡驱动发送渲染命令。显卡驱动会将OpenGL/DirectX中的函数翻译成GPU能懂的语言,实现与GPU的通讯。显卡驱动同时也会将纹理等数据转换为GPU支持的格式。
HLSL,GLSL,CG的关系
HLSL,GLSL,CG是三种常见的着色器语言,用来编写着色器。这些语言会被编译为与机器无关的汇编语言(中间语言),中间语言再交给显卡翻译为真正的机器语言,即GPU可以理解的语言。
三者区别
HLSL基于DirectX,由微软控制,在版本相同时,不同平台编译的结果是一样的,但几乎只支持微软家产品,如: Windows,Xbox 360,PS3等。
GLSL基于OpenGL,优点在于跨平台性,只要显卡驱动支持即可正常工作,可以在Windows,Mac,Linux,移动平台工作。但是由于OpenGL不提供着色器编译器,而是由显卡驱动完成着色器编译,导致GLSL的编译结果取决于不用的显卡硬件厂商,进而导致编译结果不尽相同。
CG基于Nvidia,真正意义上的跨平台。根据不同的平台生成不同的中间语言。(Unity中首选,会编译成HLSL或GLSL)
DrawCall
DrawCall就是CPU调用图像编程接口让GPU进行渲染的命令。DrawCall造成性能问题的元凶是CPU。
为什么DrawCall多了会影响帧率?
CPU与GPU的并行工作应用了并行缓冲区.与生产者-消费者模型类似。CPU提交DrawCall到缓冲区,GPU从缓冲区取数据。
效率上,CPU要向GPU发送许多数据,以及检查工作,而GPU渲染能力很强,所以GPU从缓冲区取命令的速度远远大于CPU发送命令的速度。所以DrawCall过多会导致CPU过载。
如何减少DrawCall?
上面说DrawCall过多影响帧率是因为CPU处理数据,发送命令很耗时,所以可以通过合并一些DrawCall,进而减少DrawCall的总数量.
开发中减少DrawCall方法
- 避免使用过多材质。尽量在不同网格之间共用相同材质。
- 减少使用大量很小的网格。不可避免时考虑是否可以合并。