5月18日,Qualcomm在北京举行Qualcomm骁龙游戏与图形开发者研讨会。Qualcomm创新工程中心高级工程总监Zack Zhou、Qualcomm工程师兼经理文艳山、Qualcomm® CDMA Technologies (QCT) 芯片部高级内容组高级工程师李娟、Qualcomm资深工程师张涛,在现场为开发者们分享了Qualcomm Adreno GPU框架特性、移动游戏性能与功耗优化技巧,以及3D效果渲染技巧等话题。
Qualcomm创新工程中心高级工程总监Zack Zhou今天嘉宾们主要分享了基于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等。
Qualcomm工程师兼经理文艳山文艳山在上午的演讲中,分享了3D图形在Adreno中从顶点处理、顶点装配、像素处理,到测试、混合的过程。同时,他还进一步介绍了Tiled渲染的特点与原理。
有限的帧缓冲区带宽和更低的功耗要求,使得Tiled渲染成为更为有效的方式。在GPU内部有一个独立的快速缓存叫GMEM。每个图像都会被分割为一个个小的bin(Qualcomm内部将这些被分割成一个个方块的图像称为bin)。bin的大小由GMEM的大小除以渲染目标的格式(包括深度缓存的格式)和大小来决定。软件会为每个bin创建一个三角形“可见性数据流”。渲染过程会利用可见性数据流来绘制可见的像素点。每个bin的所有像素都被画到GMEM中,GPU会降GMEM中混合好的像素,以一个整体的形式写回到系统内存的帧缓冲区中,这叫做一次“Resolve”。
Qualcomm芯片部高级内容组高级工程师李娟李娟分享了Adreno SDK、Adreno SDK Texture Tools、Visual Studio、骁龙LLVM编译器等了相具体功能特性。Qualcomm为游戏开发的编程、模拟、编译、部署、分析等每一个环节都提供应的开发与优化工具。以Adreno SDK Texture Tools为例,它提供了以下特性:
并排观察原始图像和被压缩或解压缩后的图像比较原始图像和被压缩或解压缩后图像的不同点从中挑选16种压缩类型,包括ETC,ASTC保存图片成KTX或DDS格式许多压缩和非压缩纹理格式之间转换的实用工具跨平台库和API支持减少内存带宽需求尝试不同的压缩和位深找到最佳尺寸和视觉效果Qualcomm资深工程师张涛张涛分享了如何绘制渲染皮肤、衣服布料、毛皮等材质,以及景深、玻璃扭曲等光影特效。
以皮肤为例,皮肤渲染是实时计算机图形学的难题之一。一方面这是因为皮肤光照的复杂性;另一方面,观察者对皮肤太熟悉了,一旦结果看起来“不像”他们就很难接受。关于皮肤的光照模型有几个,比如Hanrahan和Krueger在1993年的Siggraph上首次将皮肤进行分层模拟计算光照反射。他们的方法看起来非常逼真,但是每个光照计算需要100个指令,这对于实时的要求来说太昂贵了。
在这个例子中,我们展示一个经过优化过的皮肤渲染算法,它可以运行在移动设备上。这个技术通过在阴影区域的漫反射中加入暖色调来逼近次表面散射。我们在漫反射计算中加入Minnaert光照项,这是非常关键的一步,它使得皮肤看起来柔嫩,最后我们通过加入镜面高光使皮肤看起来富有光泽。
我们稍后将对部分嘉宾的演讲进行详细整理,敬请关注。
如果您有任何开发疑问,欢迎进入Qualcomm开发者社区提问,Qualcomm工程师将定期为大家解答。