欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  互联网

为什么你玩《王者荣耀》特别卡?浅谈手游的图形API

程序员文章站 2022-04-01 13:17:59
最近,不少玩家都发现《王者荣耀》更新到某个版本后,似乎变得特别卡。而有心的朋友进一步观察,发现在是由于《王者荣耀》的“优化”引起的。 《王者荣耀》针对不同机型...

最近,不少玩家都发现《王者荣耀》更新到某个版本后,似乎变得特别卡。而有心的朋友进一步观察,发现在是由于《王者荣耀》的“优化”引起的。

《王者荣耀》针对不同机型,会使用不同的图形api渲染图像,而这些api的效率并不相同。就算是同样配置的不同机器,《王者荣耀》使用的api不一样,流畅程度也大不一样。

为什么你玩《王者荣耀》特别卡?浅谈手游的图形API

此外,《王者荣耀》进行更新后,所使用的游戏api可能会发生变化,这会导致游戏突然比上一个版本变得卡顿了很多,或者流畅了不少。

为什么使用不同的图形api,会有不同的“优化”效果?今天我们就以《王者荣耀》为出发点,谈谈手游中所使用的api吧。

《王者荣耀》都会使用什么图形api?

很多朋友或者并不明白游戏api的意思。简单来说,游戏想要显示图像,就需要使用相关的图形api和系统对接,而使用不同的api,会大大影响游戏的运行效率、显示效果,流畅度和特效都会有所不同。

具体到《王者荣耀》,虽然大家下载的或者都是一样的安装包,但它却会根据不同的机型,选择不同的api运作,因此流畅度也各不相同。《王者荣耀》都使用什么api和怎样的优化方略?我们从游戏登入界面就可以观察到。

为什么你玩《王者荣耀》特别卡?浅谈手游的图形API

仔细观察《王者荣耀》登入界面的左上角,可以发现有“o2,t”、“o2,f”等字样,视设备不同,还会出现“o3,t”、“o3,f”、“v,t”、“m,t”,这些字样其实就标明此时的《王者荣耀》所使用什么图形api来运作,以及是否使用多线程优化,字样的含义具体如下:

o2:使用opengl es 2.0 api

o3:使用opengl es 3.x api

m:使用metal api(ios平台特有)

v:使用vulkan api(安卓平台特有)

t:使用多线程(多线程true)

f:使用单线程(多线程false)

如此一来,我们就很容易明白《王者荣耀》登录界面出现的字样意味着什么。例如出现了“o2,f”,就意味着游戏此时使用的是老旧的opengl es 2.0接口,并只调用单线程,没有对多核心多线程进行优化。

我们也可以看到,《王者荣耀》所使用的图形api以及优化方略是多种多样的,几乎囊括了手游大部分会出现的情况。

这些图形api在效率上有优劣之分,使用不同的api会极大程度影响流畅度,这也是为何《王者荣耀》有人觉得卡顿,有人觉得流畅的一大原因。

手游使用的图形api孰优孰劣?

为什么你玩《王者荣耀》会觉得卡顿?最有可能的情况就是,《王者荣耀》既使用了老旧的图形api,又没有进行多线程优化,例如上文提到的“o2,f”。

不同的图形api的确会对运行效率造成影响,我们这就来说说手机中常见的几个图形api。

opengl es 2.0。这是一个相当古老的图形api。opengl es由opengl演化而来,精简了opengl的大量内容,以适配移动设备,几乎所有的手机都会支持opengl es这个图形接口。

opengl es 2.0这个版本在2007年已经发布,安卓2.0(ndk)/安卓2.2(java)、ios5以后的版本,以及黑莓os、webos等平台都支持opengl es 2.0,普及率非常高。

为什么你玩《王者荣耀》特别卡?浅谈手游的图形API

opengl es 2.0和现在最新的图形api相比,显然是不够先进高效的,在一些使用情况下还会颇显麻烦。

例如,针对不同的硬件,它需要游戏提供不同的纹理包进行适配,如果你是一名安卓游戏的老玩家,应该还会记得以前玩安卓手游需要为powervr、mali、adreno、tegra等不同的gpu找不同的纹理包,这是opengl es 2.0带来的局限。

在效率方面,opengl es 2.0以现在的目光来看也不甚理想,因此如果你运行《王者荣耀》发现用的是“o2”,而且没有对多线程优化,极有可能会出现掉帧卡顿。

为什么你玩《王者荣耀》特别卡?浅谈手游的图形API

opengl es 3.x。从名字就可以看出这是opengl es的更新版本。安卓4.3、ios7以后的版本支持opengl es 3.0,安卓5.0之后的版本支持opengl es 3.1,安卓6.0以后的版本支持opengl es 3.2。而苹果在ios8开始主打matel图形api,不再以opengl es为重点。

为什么你玩《王者荣耀》特别卡?浅谈手游的图形API

和opengl es 2.0相比,opengl es 3.x的改动是巨大的,例如在3.0版本中使用了统一的etc2/eac纹理格式,不再需要为不同的硬件区分纹理包。

而且使用了新版的着色语言,增强了纹理功能;而3.1版本中支持通用计算着色器、3.2版本中支持新的astc纹理格式等改进,也都大大拓展了opengl es的应用范畴,提升了效率。

为什么你玩《王者荣耀》特别卡?浅谈手游的图形API

不仅如此,opengl es 3.x还都向前兼容,在支持opengl es 3.x的设备上,游戏依然可以使用opengl es 2.0的接口。也因为如此,目前仍有不少游戏使用opengl es 2.0,这主要是出于兼容性方面的考虑。

metal。这个api相信果粉们都相当熟悉了。在ios8之后,苹果大力推广metal api,现在metal已经成为了ios和macos的御用图形api。

和臃肿的opengl es相比,metal的突出优点就是特别薄,更加底层,能够更直接地调用硬件,这令游戏的运行效率暴涨。

为什么你玩《王者荣耀》特别卡?浅谈手游的图形API

换用metal后,游戏的运行效率可以暴涨到何种程度?在macos上《魔兽世界》和《星际争霸2》从opengl换用到了metal,性能竟然提高了50%之多。

目前,ios上的一流游戏大作基本都使用了metal,这一方面能够使用更华丽的特效,另一方面也能够保证游戏的流畅度——如果你在《王者荣耀》中看到“m,t”的显示,那么就完全无需担心会卡顿掉帧了。

为什么你玩《王者荣耀》特别卡?浅谈手游的图形API

vulkan。这个api主要由安卓系统使用,可以大致看作是安卓版的metal。在安卓7.0以后,google引入了vulkan api提升安卓的图形性能。vulkan的优点和metal类似,远比opengl es高效,能够访问opengl es所不及的gpu特性,如果游戏使用了vulkan,无疑会流畅不少。

为什么你玩《王者荣耀》特别卡?浅谈手游的图形API

而和metal相比,vulkan对多平台的支持有更好。它除了支持安卓,也支持ios、windows、linux乃至任天堂switch等平台。

而对于安卓平台来说,由于vulkan对多线程支持极佳,因此意义尤为重大——很多安卓设备都是用了8核心乃至10核心的处理器,游戏如果使用vulkan,无疑能够更充分得发挥硬件优势。

为什么你玩《王者荣耀》特别卡?浅谈手游的图形API

因此,如果你的安卓机玩《王者荣耀》显示的是“v,t”,那么就意味着玩起来会有丝滑般的团战体验。而一旦显示的是“o2,f”,受限于臃肿的opengl es 2.0,以及相较羸弱的cpu单核性能,游戏体验就很难令人满意了。

总结

可见,图形api和游戏的“优化”是息息相关的,使用先进的图形api,能够让游戏流畅度大幅提升。

其实很多玩家都发现,《王者荣耀》是根据机型,而不是具体的硬件和系统来判断究竟是用哪种图形api、哪种优化方略的,同一部机器,只需要伪装一下机型,就能让《王者荣耀》从“o2,f”变成“v,t”,性能瞬间暴涨。

为何《王者荣耀》要如此设定?我们不得而知。希望腾讯能够进一步开放《王者荣耀》对先进图形api的调用,为玩家带来更好的游戏体验吧。