2017-11-11游戏 发现大家都没怎么从技术的角度去解释这件事情, 那么我就从技术的角度来分析一下这个问题,让小米和王者荣耀该背锅的背锅,该甩锅的甩锅. 作为一个技术男, 我们需要弄懂下面三个问题,给吃瓜群众一个交代 第三方应用/游戏有没有能力做这件事? Rom 厂商是如何做到的? 为什么要这么做? 有什么需要改进的? 为啥修改机型后就不锁了? 结论先行,不喜欢看分析的吃瓜群众可以直接看结论然后开喷: 第三方应用/游戏在没有 Root 的情况下,是没法做这件事的,除非游戏厂商和 Rom 厂商有合作. 关核行为是小米做的而不是王者荣耀做的. 为什么要这么做 : 为了温控,为了能多玩几把,为了不烫手,一切为了用户,只是做了均衡和妥协,没法让所有人满意而已. 有什么需要改进的 : 不要只锁核,不锁频,不限核. 关键 Log 还是不要输出的好 修改机型后不锁了是因为 MIUI 判断不了你修改的机型, 所以对应的功能没有开启. 下面是分析: 1. 第三方应用/游戏有没有能力做这件事? 在一般情况下,像 cpu hotplug (动态开关 cpu 核心)这种事情,一般的第三方应用和游戏是没法去做这个的,因为涉及到要修改的代码或者节点,第三方应用一般都是没有权限的. 另外第三方应用/游戏一般也不会针对某个机型或者某个 Rom 去做针对性的优化(当然 Oppo 和 Vivo 是个例外,毕竟花了不少钱),一来是成本太高,二来 Android 目前碎片化这么严重,忙不过来也没有必要. 高通那边有一次培训说是提供了一个 sdk ,让应用可以在高通的机型上,设置自己的 cpu affinity,这应该是应用能获得的最高的权限了吧(不过有条件,最终还是取决于底层的判断). 2. Rom 厂商是如何做到的? Rom 厂商可以针对游戏或者应用进行定制化,前提是你的应用有一定的体量,比如王者荣耀和微信,用户基数大的足以让所有的国产 Rom 厂商对其制定特定的策略,让你在使用的时候更爽一些(当然如果没定制好,就有可能出现体验衰退) 前面结论说 Rom 厂商可以针对应用和游戏定制策略,其中 cpu 的策略有如下几种方法: 1.cpuset : 通过定制 cpuset ,可以限制某个进程或者某个线程,只运行在 cpu 的某个核心上.不过小米这个我看了下,并没有进行定制,王者荣耀启动后,静静地躺在默认的 top-app 里面. ╰─$ adb shell ps | grep sgame u0_a152 16411 808 1597432 241496 0 0000000000 S com.tencent.tmgp.sgame ╰─$ adb shell cat /dev/cpuset/top-app/tasks | grep 16411 16411 而 top-app 的配置是默认的 0-7 ╰─$ adb shell cat / dev / cpuset / top - app / cpus 0 - 7 也就是说没有通过 cpuset 去限制王者荣耀跑在哪个核心上. 2.cpu affinity : 通过设置 affinity ,也可以让某个进程跑在某个核心上,具体大家可以自己去 google 一下. 由于我手上的小米6没有 root, 看不了对应进程的 affinity 配置,所以这个暂时可以放一下,过两天我账号 root 之后就知道答案了. ╰─$ adb shell taskset -a -p 16411 taskset: failed to get 16411's affinity: Permission denied 3.cpu hotplug : 其实就是动态开关核,这个第三方应用是做不了的,所以做的话只可能是 Rom 厂商做的. 4.cpu affinity + cpu hotplug : 可以理解成开关核 + cpu 绑定 通过上面四个方法,手机厂商可以对特定的应用做特定的 cpu 策略,比如王者荣耀.从目前的现象来看(应用启动后,将 cpu6和 cpu7 这两个大核关闭,只开两个大核来跑王者荣耀),小米很大可能是用了第四种方法.不过从 Systrace 来看,似乎是没用cpu affinity 将王者荣耀绑定在两个大核上,所以王者荣耀跑起来的时候,其两个比较重要的 unity 线程,既有可能跑在小核上,又有可能跑在大核上. 口说无凭,我们来从 trace 和 log 两个方面来说明: 1. Systrace 从上面的 trace 来看, UnityMain 跑在小核上面(这是因为没有玩,负载比较低) 上面的 trace 是玩的时候, UnityMain 的状态,可以看到大部分都跑在大核上,但是有时候小核也会跑一部分,这会有什么问题呢? 小核最高主频低,像上面图中,小核的频率在300MHz, 那么这一帧很有可能执行很久,导致掉帧. 2. Log 在开发的过程中,为了 debug, 我们会在代码里加入很多的 log, 帮助我们分析问题,这里我们也可以从 log 来入手 首先我们以王者荣耀为关键字搜索 log 1. 王者荣耀启动 11-05 10:52:03.422 1839 7960 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.tencent.tmgp.sgame/.SGameActivity bnds=[324,395][506,577] (has extras)} from uid 10021 on display 0 2. 进入游戏模式 11-05 10:52:03.505 2429 2492 I octvm_power: power mode [game] start 1509850323 11-05 10:52:03.505 2429 2492 I octvm_power: Action: set_thermal_config(game) for [foreground_change] 11-05 10:52:03.506 2429 2492 I octvm_drv: cur_global_config:[0], target mode:[game] 3. 一大堆参数设定 11-05 10:52:03.508 799 987 I ThermalEngine: #algo_type monitor 11-05 10:52:03.508 799 988 I ThermalEngine: handle_thresh_sig: SS Id SGAME-SS-CLUSTER1-SP1, Read xo_therm 30000mC 11-05 10:52:03.508 799 987 I ThermalEngine: sampling 1000 11-05 10:52:03.508 799 987 I ThermalEngine: sensor tsens_tz_sensor16 11-05 10:52:03.508 799 987 I ThermalEngine: thresholds 5000 11-05 10:52:03.508 799 987 I ThermalEngine: thresholds_clr 10000 11-05 10:52:03.508 799 987 I ThermalEngine: actions vdd_restriction 11-05 10:52:03.508 799 987 I ThermalEngine: action_info 1 11-05 10:52:03.508 799 987 I ThermalEngine: descending 11-05 10:52:03.508 799 987 I ThermalEngine: [VDD_RSTR_MONITOR-TSENS15] 4. 关闭 cpu6 和 cpu7 ╰─$ adb logcat | grep "ACTION: Hotplugged OFF" 11-05 12:05:23.499 799 987 I ThermalEngine: ACTION: Hotplugged OFF CPU[7] 11-05 12:05:23.513 799 987 I ThermalEngine: ACTION: Hotplugged OFF CPU[6] 从上面的 log 就很容易知道了, 简单分析就是:小米针对王者荣耀做了个模式,一旦进入这个模式,就load 事先配置好的一堆文件,比如温控,各种阈值, cpu 的核数等 . 在这个例子里面, 王者荣耀的核数配置的是0-5,所以他起来之后,需要把 cpu6 和 cpu7 这两个 cpu 关掉,以防止他们瞎逼跑. 3. 手机厂商为啥要这么做? 为了温控 : 大家都知道王者荣耀开了高帧率,玩起来既费电,又烫手,触发温控后限频限核和难受,所以需要在这之间找个平衡,既能流畅地玩,又能多玩几局,又不触发温控.所以在够用的情况下,只开两个大核要比四个大核全开性价比更高.也更难触发温控,这就是小米6玩王者荣耀机身温度比较低的一个原因. 为了省电: 两个大核比四个大核省电,这个就不用多说了. 要上高地了你手机没电了, 估计要骂娘了 够用就好 : 王者荣耀是吃 cpu 的一个游戏,而且两个关键的就 UnityMain 线程, 一般情况下两个大核就完全够用了, 再开两个大核,带来的收益不是很高.但是带来的耗电那就不好说了.(当然吃瓜群众会有很大极限环境,后台挂着 qq 微信 迅雷 网易云音乐,前台再玩王者荣耀,这个就考虑不到了,两个大核绝逼吃力) 手机厂商和游戏厂商都不会和用户作对,这一点大家可以放心,所有的初衷都是让用户玩起来更爽一些而已,只不过在目前的硬件限制之下(cpu 能力/ 手机结构 / 电池大小 / 温控 )做一个均衡而已. 想想鲁迅那句名言. 4. 有什么需要改进的? 这个真的不好说, 因为需要考虑的东西太多,用户环境的复杂是没法预料的,你不可能一套策略让所有人满意,所以只能做到让大部分人满意. 下面从技术的角度来说一下 不要只锁核,不锁频,不限核 : 最好进游戏之后限制一下两个大核的最低频率 + 限制王者荣耀不要跑到小核上. 高低帧率区分对待, 有的用户使用高帧率,有的用户习惯低帧率,在这两种场景下可以使用不同的策略 关键 Log 还是不要输出的好 最终的发展应该是每一个用户都有一套策略,而且是实时更新的, 这个只能寄托于后续 AI 技术的发展和在手机 OS 上的应用了. 5. 为什么修改机型后就不锁核了? 关于这个问题,其实也不用等测试结果出来(账号登录要等72个小时后才可以 root ),太久了. 为了说明这个,我们先达成下面两个共识 : Framework 和 Feature 代码维护 : 一般情况下, 像 miui / flyme 等国产 Rom ,都会在 Framework 层做很多的修改, 而一般 Framework 层的代码, 一般只有一套,套用在所有的 小米机型上 Kernel 代码维护 : Kernel 代码一般不会公库,一般是一个机型一套代码(当然有可能同芯片的机型会共库) 一般情况下, 像游戏模式这种大的功能, 是需要 Framework 和 Kernel 同时配合的 , 工作量是很大的. 而且这种大功能, 一般还需要 Kernel 的支持, 有些老机型的 Kernel 版本过老, 是没办法做这个 Feature 的. 结论一 : miui9 适配了这么多机型, 针对王者荣耀优化的这个功能, 只可能在部分机型上才有.老机型虽然上了 miui9 , 但是很多功能都是阉割版本的, 不是 miui 团队不想做, 实在是有限制. 另外,我们说 Framework 层的代码一般是共库的, 一套代码适配 20 几款机型, 那么内部是怎么区分机型的呢 ? 在这个例子里面就是 : 针对王者荣耀的这个游戏模式, 到底哪款机型支持哪款机型不支持呢? 答案就在那几个机型信息. Framework 这边会会获取那几个机型信息, 来区分是否支持某个 Feature ,比如下面那几个: ╰─$ adb shell getprop | grep product [ro.product.board]: [msm8998] [ro.product.brand]: [Xiaomi] [ro.product.device]: [sagit] [ro.product.manufacturer]: [Xiaomi] [ro.product.model]: [MI 6] [ro.product.name]: [sagit] 关于上面几个大家是不是很眼熟? 没错,很多教程教你修改的一般就是这几个值,改为之后如下: ro.product.manufacturer=OPPO ro.product.model=OPPO R11 ro.product.brand=OPPO ro.product.name=R11 ro.product.device=R11 问题是: 你改完这几个, 王者荣耀认为你是 R11 , MIUI 却懵逼了 , 这型号我不认, 没有对应的策略 , Pass !! Pass !! 结论二 : miui9 根据机型来开启或者关闭某些功能 ,或者根据机型来判断是否支持某些功能. 所以你修改相关的机型信息后, MIUI 拿到这个机型信息, 不知道这个是什么机型, 所以对应的功能就关闭了. 6. Oppo 和王者荣耀 大家不要再黑 oppo 和 vivo 了,在用户体验这里他们还是做了非常多的工作的,比如王者荣耀. oppo 和王者荣耀的优化如下: 从 Unity 引擎里面,把一部分任务抽离出来,分到其他线程去执行,减少 UnityMain 线程的负载,也就是我们所说的多线程版本. 独家 SDK (可能不是很准,但如果我和王者荣耀要 sdk, 会想知道下面几点) 告诉你啥时候游戏开了 告诉你负载增加了(4-5人团或者10人团) 告诉你啥时候游戏结束了 网络方面的优化 其他手机厂商为啥不做咧 ? 没钱呗... 你猜 oppo 和王者荣耀合作花了多少钱? 不过后续这个多线程版本会对所有人开放, oppo 的独占期,也是测试期啊, 风险与机遇并存. 7. 时效性 大家这这这种技术问题,时效性很重要, 为了防止后续 miui 或者王者荣耀进行修改策略之后某些不明真相的吃瓜群众来怒怼,所以这里记录一下版本号和修改日期: miui 版本号: MIUI.9.7.11.2 开发版 王者荣耀版本 app : v1.31.4.13 res : 1.31.4.14 手机 : 小米6 本问题最后修改时间 : 2017-11-5
发现大家都没怎么从技术的角度去解释这件事情, 那么我就从技术的角度来分析一下这个问题,让小米和王者荣耀该背锅的背锅,该甩锅的甩锅. 作为一个技术男, 我们需要弄懂下面三个问题,给吃瓜群众一个交代 第三方应用/游戏有没有能力做这件事? Rom 厂商是如何做到的? 为什么要这么做? 有什么需要改进的? 为啥修改机型后就不锁了? 结论先行,不喜欢看分析的吃瓜群众可以直接看结论然后开喷: 第三方应用/游戏在没有 Root 的情况下,是没法做这件事的,除非游戏厂商和 Rom 厂商有合作. 关核行为是小米做的而不是王者荣耀做的. 为什么要这么做 : 为了温控,为了能多玩几把,为了不烫手,一切为了用户,只是做了均衡和妥协,没法让所有人满意而已. 有什么需要改进的 : 不要只锁核,不锁频,不限核. 关键 Log 还是不要输出的好 修改机型后不锁了是因为 MIUI 判断不了你修改的机型, 所以对应的功能没有开启. 下面是分析: 1. 第三方应用/游戏有没有能力做这件事? 在一般情况下,像 cpu hotplug (动态开关 cpu 核心)这种事情,一般的第三方应用和游戏是没法去做这个的,因为涉及到要修改的代码或者节点,第三方应用一般都是没有权限的. 另外第三方应用/游戏一般也不会针对某个机型或者某个 Rom 去做针对性的优化(当然 Oppo 和 Vivo 是个例外,毕竟花了不少钱),一来是成本太高,二来 Android 目前碎片化这么严重,忙不过来也没有必要. 高通那边有一次培训说是提供了一个 sdk ,让应用可以在高通的机型上,设置自己的 cpu affinity,这应该是应用能获得的最高的权限了吧(不过有条件,最终还是取决于底层的判断). 2. Rom 厂商是如何做到的? Rom 厂商可以针对游戏或者应用进行定制化,前提是你的应用有一定的体量,比如王者荣耀和微信,用户基数大的足以让所有的国产 Rom 厂商对其制定特定的策略,让你在使用的时候更爽一些(当然如果没定制好,就有可能出现体验衰退) 前面结论说 Rom 厂商可以针对应用和游戏定制策略,其中 cpu 的策略有如下几种方法: 1.cpuset : 通过定制 cpuset ,可以限制某个进程或者某个线程,只运行在 cpu 的某个核心上.不过小米这个我看了下,并没有进行定制,王者荣耀启动后,静静地躺在默认的 top-app 里面. ╰─$ adb shell ps | grep sgame u0_a152 16411 808 1597432 241496 0 0000000000 S com.tencent.tmgp.sgame ╰─$ adb shell cat /dev/cpuset/top-app/tasks | grep 16411 16411 而 top-app 的配置是默认的 0-7 ╰─$ adb shell cat / dev / cpuset / top - app / cpus 0 - 7 也就是说没有通过 cpuset 去限制王者荣耀跑在哪个核心上. 2.cpu affinity : 通过设置 affinity ,也可以让某个进程跑在某个核心上,具体大家可以自己去 google 一下. 由于我手上的小米6没有 root, 看不了对应进程的 affinity 配置,所以这个暂时可以放一下,过两天我账号 root 之后就知道答案了. ╰─$ adb shell taskset -a -p 16411 taskset: failed to get 16411's affinity: Permission denied 3.cpu hotplug : 其实就是动态开关核,这个第三方应用是做不了的,所以做的话只可能是 Rom 厂商做的. 4.cpu affinity + cpu hotplug : 可以理解成开关核 + cpu 绑定 通过上面四个方法,手机厂商可以对特定的应用做特定的 cpu 策略,比如王者荣耀.从目前的现象来看(应用启动后,将 cpu6和 cpu7 这两个大核关闭,只开两个大核来跑王者荣耀),小米很大可能是用了第四种方法.不过从 Systrace 来看,似乎是没用cpu affinity 将王者荣耀绑定在两个大核上,所以王者荣耀跑起来的时候,其两个比较重要的 unity 线程,既有可能跑在小核上,又有可能跑在大核上. 口说无凭,我们来从 trace 和 log 两个方面来说明: 1. Systrace 从上面的 trace 来看, UnityMain 跑在小核上面(这是因为没有玩,负载比较低) 上面的 trace 是玩的时候, UnityMain 的状态,可以看到大部分都跑在大核上,但是有时候小核也会跑一部分,这会有什么问题呢? 小核最高主频低,像上面图中,小核的频率在300MHz, 那么这一帧很有可能执行很久,导致掉帧. 2. Log 在开发的过程中,为了 debug, 我们会在代码里加入很多的 log, 帮助我们分析问题,这里我们也可以从 log 来入手 首先我们以王者荣耀为关键字搜索 log 1. 王者荣耀启动 11-05 10:52:03.422 1839 7960 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.tencent.tmgp.sgame/.SGameActivity bnds=[324,395][506,577] (has extras)} from uid 10021 on display 0 2. 进入游戏模式 11-05 10:52:03.505 2429 2492 I octvm_power: power mode [game] start 1509850323 11-05 10:52:03.505 2429 2492 I octvm_power: Action: set_thermal_config(game) for [foreground_change] 11-05 10:52:03.506 2429 2492 I octvm_drv: cur_global_config:[0], target mode:[game] 3. 一大堆参数设定 11-05 10:52:03.508 799 987 I ThermalEngine: #algo_type monitor 11-05 10:52:03.508 799 988 I ThermalEngine: handle_thresh_sig: SS Id SGAME-SS-CLUSTER1-SP1, Read xo_therm 30000mC 11-05 10:52:03.508 799 987 I ThermalEngine: sampling 1000 11-05 10:52:03.508 799 987 I ThermalEngine: sensor tsens_tz_sensor16 11-05 10:52:03.508 799 987 I ThermalEngine: thresholds 5000 11-05 10:52:03.508 799 987 I ThermalEngine: thresholds_clr 10000 11-05 10:52:03.508 799 987 I ThermalEngine: actions vdd_restriction 11-05 10:52:03.508 799 987 I ThermalEngine: action_info 1 11-05 10:52:03.508 799 987 I ThermalEngine: descending 11-05 10:52:03.508 799 987 I ThermalEngine: [VDD_RSTR_MONITOR-TSENS15] 4. 关闭 cpu6 和 cpu7 ╰─$ adb logcat | grep "ACTION: Hotplugged OFF" 11-05 12:05:23.499 799 987 I ThermalEngine: ACTION: Hotplugged OFF CPU[7] 11-05 12:05:23.513 799 987 I ThermalEngine: ACTION: Hotplugged OFF CPU[6] 从上面的 log 就很容易知道了, 简单分析就是:小米针对王者荣耀做了个模式,一旦进入这个模式,就load 事先配置好的一堆文件,比如温控,各种阈值, cpu 的核数等 . 在这个例子里面, 王者荣耀的核数配置的是0-5,所以他起来之后,需要把 cpu6 和 cpu7 这两个 cpu 关掉,以防止他们瞎逼跑. 3. 手机厂商为啥要这么做? 为了温控 : 大家都知道王者荣耀开了高帧率,玩起来既费电,又烫手,触发温控后限频限核和难受,所以需要在这之间找个平衡,既能流畅地玩,又能多玩几局,又不触发温控.所以在够用的情况下,只开两个大核要比四个大核全开性价比更高.也更难触发温控,这就是小米6玩王者荣耀机身温度比较低的一个原因. 为了省电: 两个大核比四个大核省电,这个就不用多说了. 要上高地了你手机没电了, 估计要骂娘了 够用就好 : 王者荣耀是吃 cpu 的一个游戏,而且两个关键的就 UnityMain 线程, 一般情况下两个大核就完全够用了, 再开两个大核,带来的收益不是很高.但是带来的耗电那就不好说了.(当然吃瓜群众会有很大极限环境,后台挂着 qq 微信 迅雷 网易云音乐,前台再玩王者荣耀,这个就考虑不到了,两个大核绝逼吃力) 手机厂商和游戏厂商都不会和用户作对,这一点大家可以放心,所有的初衷都是让用户玩起来更爽一些而已,只不过在目前的硬件限制之下(cpu 能力/ 手机结构 / 电池大小 / 温控 )做一个均衡而已. 想想鲁迅那句名言. 4. 有什么需要改进的? 这个真的不好说, 因为需要考虑的东西太多,用户环境的复杂是没法预料的,你不可能一套策略让所有人满意,所以只能做到让大部分人满意. 下面从技术的角度来说一下 不要只锁核,不锁频,不限核 : 最好进游戏之后限制一下两个大核的最低频率 + 限制王者荣耀不要跑到小核上. 高低帧率区分对待, 有的用户使用高帧率,有的用户习惯低帧率,在这两种场景下可以使用不同的策略 关键 Log 还是不要输出的好 最终的发展应该是每一个用户都有一套策略,而且是实时更新的, 这个只能寄托于后续 AI 技术的发展和在手机 OS 上的应用了. 5. 为什么修改机型后就不锁核了? 关于这个问题,其实也不用等测试结果出来(账号登录要等72个小时后才可以 root ),太久了. 为了说明这个,我们先达成下面两个共识 : Framework 和 Feature 代码维护 : 一般情况下, 像 miui / flyme 等国产 Rom ,都会在 Framework 层做很多的修改, 而一般 Framework 层的代码, 一般只有一套,套用在所有的 小米机型上 Kernel 代码维护 : Kernel 代码一般不会公库,一般是一个机型一套代码(当然有可能同芯片的机型会共库) 一般情况下, 像游戏模式这种大的功能, 是需要 Framework 和 Kernel 同时配合的 , 工作量是很大的. 而且这种大功能, 一般还需要 Kernel 的支持, 有些老机型的 Kernel 版本过老, 是没办法做这个 Feature 的. 结论一 : miui9 适配了这么多机型, 针对王者荣耀优化的这个功能, 只可能在部分机型上才有.老机型虽然上了 miui9 , 但是很多功能都是阉割版本的, 不是 miui 团队不想做, 实在是有限制. 另外,我们说 Framework 层的代码一般是共库的, 一套代码适配 20 几款机型, 那么内部是怎么区分机型的呢 ? 在这个例子里面就是 : 针对王者荣耀的这个游戏模式, 到底哪款机型支持哪款机型不支持呢? 答案就在那几个机型信息. Framework 这边会会获取那几个机型信息, 来区分是否支持某个 Feature ,比如下面那几个: ╰─$ adb shell getprop | grep product [ro.product.board]: [msm8998] [ro.product.brand]: [Xiaomi] [ro.product.device]: [sagit] [ro.product.manufacturer]: [Xiaomi] [ro.product.model]: [MI 6] [ro.product.name]: [sagit] 关于上面几个大家是不是很眼熟? 没错,很多教程教你修改的一般就是这几个值,改为之后如下: ro.product.manufacturer=OPPO ro.product.model=OPPO R11 ro.product.brand=OPPO ro.product.name=R11 ro.product.device=R11 问题是: 你改完这几个, 王者荣耀认为你是 R11 , MIUI 却懵逼了 , 这型号我不认, 没有对应的策略 , Pass !! Pass !! 结论二 : miui9 根据机型来开启或者关闭某些功能 ,或者根据机型来判断是否支持某些功能. 所以你修改相关的机型信息后, MIUI 拿到这个机型信息, 不知道这个是什么机型, 所以对应的功能就关闭了. 6. Oppo 和王者荣耀 大家不要再黑 oppo 和 vivo 了,在用户体验这里他们还是做了非常多的工作的,比如王者荣耀. oppo 和王者荣耀的优化如下: 从 Unity 引擎里面,把一部分任务抽离出来,分到其他线程去执行,减少 UnityMain 线程的负载,也就是我们所说的多线程版本. 独家 SDK (可能不是很准,但如果我和王者荣耀要 sdk, 会想知道下面几点) 告诉你啥时候游戏开了 告诉你负载增加了(4-5人团或者10人团) 告诉你啥时候游戏结束了 网络方面的优化 其他手机厂商为啥不做咧 ? 没钱呗... 你猜 oppo 和王者荣耀合作花了多少钱? 不过后续这个多线程版本会对所有人开放, oppo 的独占期,也是测试期啊, 风险与机遇并存. 7. 时效性 大家这这这种技术问题,时效性很重要, 为了防止后续 miui 或者王者荣耀进行修改策略之后某些不明真相的吃瓜群众来怒怼,所以这里记录一下版本号和修改日期: miui 版本号: MIUI.9.7.11.2 开发版 王者荣耀版本 app : v1.31.4.13 res : 1.31.4.14 手机 : 小米6 本问题最后修改时间 : 2017-11-5