5月18日,Qualcomm在北京举行Qualcomm骁龙游戏与图形开发者研讨会。Qualcomm创新工程中心高级工程总监Zack Zhou、Qualcomm工程师兼经理文艳山、Qualcomm® CDMA Technologies (QCT) 芯片部高级内容组高级工程师李娟、Qualcomm资深工程师张涛,在现场为开发者们分享了Qualcomm Adreno GPU框架特性、移动游戏性能与功耗优化技巧,以及3D效果渲染技巧等话题。
今天嘉宾们主要分享了基于Adreno 4系列的图形渲染、性能优化等话题。Zack首先分享了一个数字:1万。根据统计,2014年,全国有大约1万多款手机游戏上市,出现这种井喷现象主要归因为两点,一方面是移动游戏市场日趋成熟,而且手机终端销量的剧增也进一步扩大了市场;另一方面,手机GPU的性能得到了提升,可以实现更多功能,这让更多游戏开发商能更容易地将现有游戏移植到移动端上。
Adreno 4系列也分高中低端,有405、420、430。虽然他们的性能效果不一样,但优化方式和整体架构非常相似。Zack在上午的分享中主要谈到了两点:Tiled渲染架构和动态Flex Render技术。
Tiled渲染其实就是指,在渲染游戏画面时,将画面分割为一个个小块,逐一进行渲染,而不是像传统地对画面整体做渲染。这样做的好处是,它可以最大限度地减少不必要的主机内存数据流量,可以降低功耗。当游戏的Draw Call过多时,肯定会让功耗增大,而这时芯片的温控机制会开始起作用,限制其性能的发挥,这就会出现我们常看到的卡顿、Crash等现象。Tiled渲染可以避免这种情况。同时,Adreno可以根据画面的复杂度,在Tiled渲染和直接渲染之间动态切换,这就是Flex Render技术。
在下午的分享中,Zack给开发者们分享了一些性能优化和功耗优化的建议。首先就是减少工作量。对于中低端手机来说,1280×720是比较合理的图像选择,这个分辨率也同样适用于高端机型。在处理反射、折射等特效的时候,可以使用1/2分辨率甚至更小的buffer,它仍然可以产生极好的效果。
第二点就是减少Draw Call,因为每个Draw Call都会增加CPU的工作量,每一帧有50个Draw Call并不会带来影响,但是每一帧有500个Draw Call时则会大幅影响游戏性能。同时,当多个物体使用同样的Shader和图形状态时,可以放在同一批进行处理,这样可以减少Draw Call的数量。第三点就是减少数据带宽的使用,比如使用纹理压缩、使用mipmap等。
文艳山在上午的演讲中,分享了3D图形在Adreno中从顶点处理、顶点装配、像素处理,到测试、混合的过程。同时,他还进一步介绍了Tiled渲染的特点与原理。
有限的帧缓冲区带宽和更低的功耗要求,使得Tiled渲染成为更为有效的方式。在GPU内部有一个独立的快速缓存叫GMEM。每个图像都会被分割为一个个小的bin(Qualcomm内部将这些被分割成一个个方块的图像称为bin)。bin的大小由GMEM的大小除以渲染目标的格式(包括深度缓存的格式)和大小来决定。软件会为每个bin创建一个三角形“可见性数据流”。渲染过程会利用可见性数据流来绘制可见的像素点。每个bin的所有像素都被画到GMEM中,GPU会降GMEM中混合好的像素,以一个整体的形式写回到系统内存的帧缓冲区中,这叫做一次“Resolve”。
李娟分享了Adreno SDK、Adreno SDK Texture Tools、Visual Studio、骁龙LLVM编译器等了相具体功能特性。Qualcomm为游戏开发的编程、模拟、编译、部署、分析等每一个环节都提供应的开发与优化工具。以Adreno SDK Texture Tools为例,它提供了以下特性:
并排观察原始图像和被压缩或解压缩后的图像
比较原始图像和被压缩或解压缩后图像的不同点
从中挑选16种压缩类型,包括ETC,ASTC
保存图片成KTX或DDS格式
许多压缩和非压缩纹理格式之间转换的实用工具
跨平台库和API支持
减少内存带宽需求
尝试不同的压缩和位深
找到最佳尺寸和视觉效果
张涛分享了如何绘制渲染皮肤、衣服布料、毛皮等材质,以及景深、玻璃扭曲等光影特效。
以皮肤为例,皮肤渲染是实时计算机图形学的难题之一。一方面这是因为皮肤光照的复杂性;另一方面,观察者对皮肤太熟悉了,一旦结果看起来“不像”他们就很难接受。关于皮肤的光照模型有几个,比如Hanrahan和Krueger在1993年的Siggraph上首次将皮肤进行分层模拟计算光照反射。他们的方法看起来非常逼真,但是每个光照计算需要100个指令,这对于实时的要求来说太昂贵了。
在这个例子中,我们展示一个经过优化过的皮肤渲染算法,它可以运行在移动设备上。这个技术通过在阴影区域的漫反射中加入暖色调来逼近次表面散射。我们在漫反射计算中加入Minnaert光照项,这是非常关键的一步,它使得皮肤看起来柔嫩,最后我们通过加入镜面高光使皮肤看起来富有光泽。