首页 > 传媒 > 关键词  > 友盟最新资讯  > 正文

借助友盟+ U-APM 实现GPU硬件层加速优化Android系统的游戏流畅度

推广 · 2021-11-08 15:03 · 稿源: 厂商投稿

作为一款VR实时操作游戏App,我们需要根据重力感应系统,实时监控手机的角度,并渲染出相应位置的VR图像,因此在不同 Android 设备之间,由于使用的芯片组和不同架构的GPU,游戏性能会因此受到影响。举例来说:游戏在 Galaxy S20+ 上可能以60fps 的速度渲染,但它在HUAWEI P50 Pro上的表现可能与前者大相径庭。 由于新版本的手机具有良好的配置,而游戏需要考虑基于底层硬件的运行情况。

如果玩家遇到帧速率下降或加载时间变慢,他们很快就会对游戏失去兴趣。如果游戏耗尽电池电量或设备过热,我们也会流失处于长途旅行中的游戏玩家。如果提前预渲染不必要的游戏素材,会大大增加游戏的启动时间,导致玩家失去耐心。如果帧率和手机不能适配,在运行时会由于手机自我保护机制造成闪退,带来极差的游戏体验。

基于此,我们需要对代码进行优化以适配市场上不同手机的不同帧率运行。

所遇到的挑战

首先我们使用Streamline 获取在 Android 设备上运行的游戏的配置文件,在运行测试场景时将 CPU 和 GPU性能计数器活动可视化,以准确了解设备处理 CPU 和 GPU 工作负载,从而去定位帧速率下降的主要问题。

以下的帧率分析图表显示了应用程序如何随时间运行。

在下面的图中,我们可以看到执行引擎周期与 FPS 下降之间的相关性。显然GPU 正忙于算术运算,并且着色器可能过于复杂。

为了测试在不同设备中的帧率情况,使用友盟+U-APM测试不同机型上的卡顿状况,发现在onSurfaceCreated函数中进行渲染时出现卡顿, 应证了前文的分析,可以确定GPU是在算数运算过程中发生了卡顿:

因为不同设备有不同的性能预期,所以需要为每个设备设置自己的性能预算。例如,已知设备中 GPU 的最高频率,并且提供目标帧速率,则可以计算每帧 GPU 成本的绝对限制。

数学公式: $ 每帧 GPU 成本 = GPU 最高频率 / 目标帧率 $

CPU 到 GPU 的调度存在一定的约束,由于调度上存在限制所以我们无法达到目标帧率。另外,由于 CPU-GPU 接口上的工作负载序列化,渲染过程是异步进行的。CPU 将新的渲染工作放入队列,稍后由 GPU 处理。

数据资源问题

CPU 控制渲染过程并且实时提供最新的数据,例如每一帧的变换和灯光位置。然而,GPU 处理是异步的。这意味着数据资源会被排队的命令引用,并在命令流中停留一段时间。而程序中的OpenGL ES 需要渲染以反映进行绘制调用时资源的状态,因此在引用它们的 GPU 工作负载完成之前无法修改资源。

调试过程

我们曾做出尝试,对引用资源进行代码上的编辑优化,然而当我们尝试修改这部分内容时,会触发该部分的新副本的创建。这将能够一定程度上实现我们的目标,但是会产生大量的 CPU 开销。

于是我们使用Streamline查明高 CPU 负载的实例。在图形驱动程序内部libGLES_Mali.so路径函数, 视图中看到极高的占用时间。

由于我们希望在不同手机上适配不同帧率运行,所以需要查明libGLES_Mali.so是否在不同机型的设备上都产生了极高的占用时间,此处采用了友盟+U-APM来检测用户在不同机型上的函数占用比例。

经友盟+ U-APM自定义异常测试,下列机型会产生高libGLES_Mali.so占用的问题,因此我们需要基于底层硬件的运行情况来解决流畅性问题,同时由于存在问题的机型不止一种,我们需要从内存层面着手,考虑如何调用较少的内存缓存区并及时释放内存。

解决方案及优化

基于前文的分析,我们首先尝试从缓冲区入手进行优化。单缓冲区方案• 使用glMapBufferRange和GL_MAP_UNSYNCHRONIZED.然后使用单个缓冲区内的子区域构建旋转。这避免了对多个缓冲区的需求,但是这一方案仍然存在一些问题,我们仍需要处理管理子区域依赖项,这一部分的代码给我们带来了额外的工作量。多缓冲区方案• 我们尝试在系统中创建多个缓冲区,并以循环方式使用缓冲区。通过计算我们得到了适合的缓冲区的数目,在之后的帧中,代码可以去重新使用这些循环缓冲区。由于我们使用了大量的循环缓冲区,那么大量的日志记录和数据库写入是非常有必要的。但是有几个因素会导致此处的性能不佳:1. 产生了额外的内存使用和GC压力2. Android 操作系统实际上是将日志消息写入日志而并非文件,这需要额外的时间。3. 如果只有一次调用,那么这里的性能消耗微乎其微。但是由于使用了循环缓冲区,所以这里需要用到多次调用。我们会在基于c#中的 Mono 分析器中启用内存分配跟踪函数用于定位问题:

$ adb shell setprop debug.mono.profile log:calls,alloc

我们可以看到该方法在每次调用时都花费时间:

Method call summary Total(ms) Self(ms) Calls Method name7825100 MyApp.MainActivity:Log (string,object[])7753100 Android.Util.Log:Debug (string,string,object[])63410100 Android.Util.Log:Debug (string,string)

在这里定位到我们的日志记录花费了大量时间,我们的下一步方向可能需要改进单个调用,或者寻求全新的解决方案。

log:alloc还让我们看到内存分配;日志调用直接导致了大量的不合理内存分配:

Allocation summary Bytes Count Average Type name4178483949 System.String428014429 System.Object[]

硬件加速

最后尝试引入硬件加速,获得了一个新的绘图模型来将应用程序渲染到屏幕上。它引入了 DisplayList 结构并且记录视图的绘图命令以加快渲染速度。

同时,可以将 View 渲染到屏幕外缓冲区并随心所欲地修改它而不用担心被引用的问题。此功能主要适用于动画,非常适合解决我们的帧率问题,可以更快地为复杂的视图设置动画。

如果没有图层,在更改动画属性后,动画视图将使其无效。对于复杂的视图,这种失效会传播到所有的子视图,它们反过来会重绘自己。

在使用由硬件支持的视图层后,GPU 会为视图创建纹理。因此我们可以在我们的屏幕上为复杂的视图设置动画,并且使动画更加流畅。

代码示例:

// Using the Object animator view.setLayerType(View.LAYER_TYPE_HARDWARE, null); ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, View.TRANSLATION_X,20f); objectAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { view.setLayerType(View.LAYER_TYPE_NONE, null); } }); objectAnimator.start(); // Using the Property animator view.animate().translationX(20f).withLayer().start();

另外还有几点在使用硬件层中仍需注意:

(1)在使用之后进行清理:

硬件层会占用GPU上的空间。在上面的 ObjectAnimator代码中,侦听器会在动画结束时移除图层。在 Property animator 示例中,withLayers() 方法会在开始时自动创建图层并在动画结束时将其删除。

(2)需要将硬件层更新可视化:

使用开发人员选项,可以启用“显示硬件层更新”。如果在应用硬件层后更改视图,它将使硬件层无效并将视图重新渲染到该屏幕外缓冲区。

硬件加速优化

但是由此带来了一个问题是,在不需要快速渲染的界面,比如滚动栏, 硬件层也会更快地渲染它们。当将 ViewPager 滚动到两侧时,它的页面在整个滚动阶段会以绿色突出显示。

因此当我滚动 ViewPager 时,我使用 DDMS 运行 TraceView,按名称对方法调用进行排序,搜索“android/view/View.setLayerType”,然后跟踪它的引用:

ViewPager#enableLayers(): private void enableLayers(boolean enable) { final int childCount = getChildCount(); for (int i =0; i < childCount; i++) { final int layerType = enable ? ViewCompat.LAYER_TYPE_HARDWARE : ViewCompat.LAYER_TYPE_NONE; ViewCompat.setLayerType(getChildAt(i), layerType, null); } }

该方法负责为 ViewPager 的孩子启用/禁用硬件层。它从 ViewPaper#setScrollState() 调用一次:

private void setScrollState(int newState) { if (mScrollState == newState) { return; } mScrollState = newState; if (mPageTransformer != null) { enableLayers(newState != SCROLL_STATE_IDLE); } if (mOnPageChangeListener != null) { mOnPageChangeListener.onPageScrollStateChanged(newState); } }

正如代码中所示,当滚动状态为 IDLE 时硬件被禁用,否则在 DRAGGING 或 SETTLING 时启用。PageTransformer 旨在“使用动画属性将自定义转换应用于页面视图”(Source)。

基于我们的需求,只在渲染动画的时候启用硬件层,所以我想覆盖ViewPager 方法,但由于它们是私有的,我们无法修改这个方法。

所以我采取了另外的解决方案:在 ViewPage#setScrollState() 上,在调用 enableLayers() 之后,我们还会调用 OnPageChangeListener#onPageScrollStateChanged()。所以我设置了一个监听器,当 ViewPager 的滚动状态不同于 IDLE 时,它将所有 ViewPager 的孩子的图层类型重置为 NONE:

@Override public void onPageScrollStateChanged(int scrollState) { // A small hack to remove the HW layer that the viewpager add to each page when scrolling. if (scrollState != ViewPager.SCROLL_STATE_IDLE) { final int childCount = <your_viewpager>.getChildCount(); for (int i =0; i < childCount; i++) <your_viewpager>.getChildAt(i).setLayerType(View.LAYER_TYPE_NONE, null); } }

这样,在 ViewPager#setScrollState() 为页面设置了一个硬件层之后——我将它们重新设置为 NONE,这将禁用硬件层,因此而导致的帧率区别主要显示在 Nexus上。

特别声明:以上内容(如有图片或视频亦包括在内)均为站长传媒平台用户上传并发布,文章为企业广告宣传内容,本平台仅提供信息存储服务,对本页面内容所引致的错误、不确或遗漏,概不负任何法律责任,相关信息仅供参考。站长之家将尽力确保所提供信息的准确性及可靠性,但不保证有关资料的准确性及可靠性,读者在使用前请进一步核实,并对任何自主决定的行为负责。任何单位或个人认为本页面内容可能涉嫌侵犯其知识产权或存在不实内容时,可及时向站长之家提出书面权利通知或不实情况说明,并提供身份证明、权属证明及详细侵权或不实情况证明(点击查看反馈联系地址)。本网站在收到上述法律文件后,将会依法依规核实信息,沟通删除相关内容或断开相关链接。

  • 相关推荐
  • 大家在看
  • 腾讯云服务器12.12限时秒杀-1核2G首年50元

    腾讯云服务器12.12多种机型限时抢购,1核2G服务器4.17元/月,2核4G服务器6.17元/月,专业技术7*24小时在线服务,腾讯云为企业和个人提供快捷,安全,稳定的云服务!

    广告
  • 刘作虎:一加10 Pro将用上LTPO 2.0 流畅度再创新高

    90Hz甚至120Hz高刷已经成为安卓及iPhone旗舰的标配,但它也会影响手机续航,所以支持LTPO自适应刷新率就是关键了,刘作虎刚刚在微博确认一加10 Pro将使用领先行业的LTPO 2.0,流畅度创新高。根据刘作虎所说,一加是首批搭载LTPO屏幕的国内手机品牌,早在2019年的时候就跟三星合作在一加7上使用了90Hz QHD OLED屏,刷新支持高刷。之后在一加9 Pro上,一加又跟三星联合定制了下一代屏幕材料LTPO,支持1Hz到120Hz自适应刷新。在即将发

  • 鲁大师12月新机流畅榜: MIUI13流畅度跑分首次亮相

    12 月安卓新发布手机流畅榜数据来自鲁大师APP 12. 01 日-12. 31 日数据,榜单只筛选在这期间新发布的机型。部分新机测试数据较少或为工程机数据,分数不稳定。榜单展示分数为鲁大师数据中心均分,已在鲁大师后台查证。部分机型未联网跑分无法验证,不予收录。 鲁大师流畅度跑分主要针对系统文件拷贝、桌面滑动、网页加载、开机自启动、APP使用、照片查看操作等进行评测,从而检验手机系统UI的适配程度、优化程度和流畅度。 小米12

  • 索尼现在正在向Xperia 1 III和Xperia 5 III推出稳定的Android 12

    索尼是最新一家将其最新旗舰更新为安卓12的公司。Xperia 1 III和Xperia 5 III现在获得了谷歌最新的操作系统,版本号为61.1。A.1.149。首先推出的是双SIM卡变体(型号XQ-BC72和XQ-BQ72),其他版本预计将很快推出此次更新为索尼Xperia的用户带来了大量新功能。该公司在其网站上发布了一个方便的指南,介绍了新A12体验(或者我们应该说是体验)的最佳元素。该操作系统提供长屏幕截图、单手操作和通知,告诉用户何时使用麦克风和相机?

  • 摄影师给一加9 Pro升级ColorOS 12:流畅度媲美iOS了 2K屏续航真牛

    今天,一位摄影师给自己的一加9 Pro升级到了ColorOS 12系统第三版,他表示流畅度提升很大,能够媲美iOS,而且续航很牛,2K 120屏能做到这个续航让人安心了”。据悉,一加9 Pro的流畅基于ColorOS 12操作系统上的防卡顿引擎技术,这是一项基于系统底层优化、提升系统流畅度的关键技术。它是一个由AI应用预启动、SuperTouch以及多核心融合算法组成的底层优化技术,从资源调度、资源挖掘、抗老化和异常优化四个方面着手,实现更加智能?

  • 谷歌终为Android手机加入“Fast Pair”:向苹果那样自动切换

    谷歌终于为安卓系统带来了不少用户期盼的功能,就是想苹果耳机自动切换和类似科技音频的功能了。谷歌计划在未来几个月内为Android手机上加入Fast Pair”蓝牙技术,这可以带来的体验是,一副AirPods耳机,在登录同样ID的iPhone,iPad或Mac志坚可以自动切换无需配对。谷歌还将开始在Android上支持类似空间音频的概念,根据用户的头部运动调整声音。它现在已经支持一些音乐服务。自动切换和空间音频只是Fast Pair技术中的两个体验,这

  • MIUI 13正式发布!流畅度、稳定性、安全性暴增:升起来

    今晚(12月28日)的小米12发布会上,MIUI 13率先登场。据MIUI负责人金凡介绍,MIUI 13基于快,更稳”的目标打造,着力做好基础优化,包括焦点计算、原子内存、液态存储等。流畅度和速度方面,头部三方应用如微信、QQ、微博、头条、抖音、淘宝等,全机型流畅度明显提升,相较于MIUI 12.5增强版,MIUI 13在旗舰机上累计掉帧时长下降15%、入门机更是下降52%。23个系统应用全机型流畅度也有明显提升,旗舰机累计掉帧时长下降23%、中端?

  • 一加宣布OnePlues 6和6T正式终止支持 无法获得后续Android更新

    OnePlus三年前推出了OnePlus 6和6T系列,它预装了Android Oreo。现在,就软件而言,该公司正式向该设备告别。如果你碰巧拥有这些手机之一,一加公司想要让你知道的是他们将不再提供软件更新。实际上OnePlus 6和OnePlus 6T的硬件配置到了今天依然够用,并且在当时的售价也比大多数旗舰机便宜,它采用了骁龙845芯片组,提供6GB至12GB的内存容量。如前所述,OnePlus 6和6T是内置Android Oreo系统推出的,这些设备最晚将收到2021年12月的安全补丁,但没有基于Android 12的OxygenOS 12 OTA可以提供。该公告是在OnePlus论坛上悄悄宣布的:嗨,朋

  • 《阿凡达:清算》定位射击类MMORPG手游 Android/iOS双平台

    由 Archosaur Games、腾讯、Lightstorm Entertainment 和迪士尼联合出品的《阿凡达:清算》(Avatar: Reckoning)的射击类 MMORPG 手游,有望在不久的将来登陆 Android / iOS 平台...由官网介绍可知,目前 Archosaur Games 正在基于虚幻引擎 4 打造《阿凡达:清算》手游,且该项目已经历多次开发迭代...《阿凡达:清算》将带领玩家深入潘多拉星球,在那里遇到为守卫家园、而与寻求资源开发的强大 RDA 部队展开交战的娜美族人......

  • 微软正在为Surface Duo 1和2开发Android 12L系统更新

    虽然微软仍要为Surface Duo 1推出Android 11(为Surface Duo 2推出Android 12),但据说微软已经在为这两款手机开发Android 12L。微软事实上并不打算为这两款手机推出Android 12,而是会直接跳到Android 12L,因为它对大型手机有特殊的适配设计。"例如,在超过600dp的屏幕上,通知屏、锁屏和其他系统界面使用新的双栏布局,以充分利用屏幕空间,多任务处理也更加强大,更加直观"。该更新目前正在与Google进行测试,微软也在参与开?

  • 流畅度最高提升52%!小米12确认全系出厂内置MIUI 13

    今天下午,小米手机官微正式宣布了一个好消息,小米12系列将出厂直接预装全新的MIUI 13系统,带来完全焕然一新的体验。这次,心仪小米12的用户终于吃下了一颗定心丸。据此前消息,MIUI 13这次主要针对此前大家不满意的地方进行了大规模的改进,能带来更加稳定、速度更快的体验。官方此前曾透露,MIUI 13的焦点计算、原子内存、液态存储三大核心技术全面升级,系统流畅性相比MIUI 12.5增强版明显提升。MIUI 13的液态存储、原子内存?

这篇文章对你有价值吗?

  • 热门标签

热文

  • 3 天
  • 7天