草庐IT

图形测试分析毫无头绪?HarmonyOS图形栈测试技术帮你解决

HarmonyOS开发者社区 2023-03-28 原文

作者:huangran,图形图像技术专家

 

应用开发以后无法知道性能瓶颈的根因是什么?滑动卡顿、白块产生的原因是什么?代码写完之后,不知道如何优化让它表现地更好……


我们发现,如今测试人员的需求已经不只是停留在应用层面的测试数据了,而是需要数据背后的根因。但业界的图形栈测试,绝大部分都只提供应用层面的数据,有一部分可以深入系统层分析,但仍无法触及硬件这一层的测试分析。


HarmonyOS图形栈测试技术,不仅可以深入系统层分析,帮助开发测试者得到数据背后的根因,还能触达硬件层的测试分析。那它是如何做到的呢?让我们一起揭秘HarmonyOS图形栈测试技术。

 

一、HarmonyOS 图形栈全貌


众所周知,图形是操作系统里面非常核心的模块,和内核、编译器等模块一起作为操作系统的底层基座,不仅如此,它还是体现竞争力的关键模块。但因为图形栈非常复杂,所以需要构筑一套完整的测试技术才可以保证其质量和竞争力。

 

图1 图形栈整体架构


如图1所示,左边部分是HarmonyOS图形栈的全貌,其中最上面一层是渲染前端,包括2D类应用、3D类应用和重负载的游戏视频类应用,这一层与右边测试部分的应用层对应,包括体验KPI和负载模型能力。


中间一层则是我们图形栈操作系统的核心能力,如组件、JS 引擎、ArkUI的三棵树(Component树,Element树和Render树)、自研2D引擎、自研3D引擎、动效、手势、布局等。这一层与右边测试部分的系统层对应,包括图形栈关键耗时函数解析和图形栈优化方案可见的能力。


最下面一层则是HarmonyOS 1+8+N设备需要横跨的两个部分:操作系统和硬件设备,需要对其进行兼容支持,这一层与右边测试部分的硬件层对应,包括跨系统对比测试能力、跨设备测试能力和硬件SOC分析能力。


我们图形栈的测试能力不只是停留在应用层的体验KPI,它可以将体验KPI指标进一步分解成系统级别的耗时函数、以及硬件级别的SOC分析能力,并最终提供优化方案(后文将举例说明)。


了解完整体架构后,我们再进一从2D图形栈应用和3D图形栈应用两个角度去了解图形栈测试技术:

 

二、2D图形栈应用


图2 是HarmonyOS ArkUI开发框架,对应右边的三层结构,最底层是接口层测试,中间层是组件层测试,最上层是应用层测试。接下来我们会给大家重点介绍负载模型、系统分析案例和应用分析案例。

 

图2 ArkUI开发框架

 

对于一个新的开发框架,在没有海量生态的应用进来之前我们是如何验证这个平台的测试能力的?


我们最初设想的是构建足够多的场景来覆盖和验证整个ArkUI框架,比如三棵树(Element树、Component树和Render树)、布局/动效、手势、2D渲染引擎。但因为不存在穷举的方式去覆盖所有业务,所以我们提出了负载模型的概念。


2D负载模型到底是什么?


我们选取了Top200的应用,对应用进行基于场景的分类,并提取特征, 然后形成了8大类常见用户场景(图3),如购物类、图库类、视频类等,同时也抽象出6大类负载,比如资源加载、图层叠加、负载布局 。

 

图3 负载场景及类型


同时我们还结合了Beta与商用的性能问题单和用户体验反馈,来逆向帮助我们补充可能遗漏的负载,比如系统I/O负载压力。这样构建的负载模型有两个作用,不仅可以测试HarmonyOS图形栈架构,还可以为作为HarmonyOS应用样例,供开发者参考。


由于设备硬件能力的差异性,负载模型实际上是参数可调节的。比如对于IP Camera这类没有GPU的设备,我们无法给它加很强的负载,它的分辨率较小、物理尺寸也较小,如果用手机的分辨率给它渲染这是没有意义的。所以我们将负载模型构建成一个参数可调模型,这样它就会基于测试者的硬件设备来选择不同的资源做测试,非常灵活便捷。


如前文所说,我们的图形栈测试能力不只是停留在应用层,而是要进入到系统层和硬件层。接下来举两个例子让大家了解一下我们在系统和硬件层面上如何做分析。


案例一:系统分析案例


我们先举一个跟硬件相关的例子,比如“多个应用连续页面切换”的场景,这时候可能产生多应用切换的时延、丢帧等问题。

 

如图4所示,假如我们定义丢帧率的KPI为0.5%,但是经过测试达到了3%,丢帧指标超标,那么我们将进一步对硬件的CPU占用率和I/O压力进行数据统计。拿到统计数据之后,平台还会告诉你具体是哪一个进程产生了CPU和I/O的压力,并给出优化建议。 

 

图4 系统分析和优化建议


案例二:应用分析案例


接下来我们举个应用内的性能分析案例,比如图库应用的图片删除场景,也可能产生丢帧和时延问题。

 

如图5所示,假设我们定义时延指标为100ms,经过测试发现时延达到1048ms,时延超标,然后我们将ArkUI图形栈函数展开,得到耗时占比,发现在系统层面上FlushBuild()和FlushLayout()耗时较长,然后平台会基于这些数据进行分析,找到可能原因,并给出优化建议,以帮助开发者明确下一步优化方向和动作。

 

图5 应用分析和优化建议

 

三、3D图形栈应用


图6是3D图形栈的整体架构,它包括了两部分,一部分是右侧的自研3D引擎,大家可以基于3D自研引擎进行3D应用的开发,比如3D动效、AR应用、3D壁纸等。

 

图6左边的部分是SDK,我们提供了一系列API,主要是针对大型的3D游戏,因为大型的3D游戏对于系统和SOC的压力较大,这些API可以帮助大型游戏更好地使用系统和硬件,比如GTX、System Cache、画质增强等SDK接口。

 

接下来我们会为大家重点介绍3D应用分析基础、特性拆分和分析方法和3D壁纸调优案例。

 

图6 “3D图形栈”


1. 3D应用分析基础


3D应用对于性能功耗的压力会更大,所以更需要底层SOC以及系统的分析能力。其实无论是3D自研引擎,还是SDK,都可以通过将负载进行特性拆分,然后进行细粒度分析。

 

如图7所示,场景A关键帧就是由渲染特性HDR、Bloom等粒子特效组成,再加上CPU负载就形成一个关键帧,这些关键帧连续起来就是3D场景。通过这些特性进一步调用到硬件逻辑的相关特性,比如ALU、Texture压力,最终通过DDK调用到硬件层执行。

 

图7 “3D应用分析基础”


有了以上分析基础后,我们再来看一下特性拆分和分析方法。


2. 特性拆分和分析方法


如图8所示,这帧渲染画面是由Particle、Shadow map、Point light、Bloom等特效组成,如果GPU的负载较重,性能出现瓶颈,如何找到问题的根因呢?我们把这一帧的GLES的指令截取到,并将每一个单特性进行分拆,然后看每一个单特性(如Particle)对硬件造成的压力。特性拆完后再结合GPU counters来帮助我们定位根因。

 

图8 特性拆分


如何使用GPU counters来定位问题呢?如图9所示,场景C提示fragment cycles比较重,所以要求开发者减少像素渲染。而对于场景A,不仅Fragment cycles很重,而memory R/W以及Vertex cycles都比较重,那么就要针对这几个瓶颈进行优化。

图9 GPU Counters


3D壁纸调优案例


我们举一个3D壁纸调优的案例给大家展示如何找到性能瓶颈。

 

图10 “3D壁纸调优”


如图10所示,用Blender制作3D壁纸模型,再用我们的自研引擎增加渲染效果,最终形成一个有光照、反射的画面。


我们将3D壁纸画面进行特性剥离,再看特性剥离后每一个单特性对硬件造成的压力,数据如表1所示。发现表面细分(顶点50W)+点光(1术)+反射面的归一化电流达到了1921.33,性能出现较大恶化,如果使用一般的测试工具,就只能到这一步了。

 

 

但我们的工具可以帮助大家进一步分析。我们结合表2的Counters来帮助大家定位问题。


 

在表2的第一、二组数据可以看到,将反射面减少,会发现“shadercycles”从1910降低到1190,这提示开发者“shader”写的过于复杂了。


我们进一步将顶点数从50W减少到5W,会发现“VertexComputeCycles”从459降低到93.2,说明“VertexComputeCycle”就是一个需要优化的瓶颈。
通过这样的分析方式,就可以逐步定位到问题,并找到优化的方向,从而达成性能功耗和画质的平衡。 

 

四、图形栈工具


我们前文介绍的2D和3D图形应用的分析优化的能力都集成于HarmonyOS图形栈的测试平台——DevEco Testing。

 

图11 DevEco Testing-图形栈测试分析能力


如图11所示,DevEco Testing是一个“三端+自动化”的结构,其中三端包括设备端、PC端和云端,而自动化就是可以使2D或3D应用的做到自动化测试,同时还具备以下测试能力:

  • 性能、功耗、热的采集和分析
  • 游戏测试自动化能力
  • 大数据统计和分析
  • 增强型服务:独立APK、帧采集回放、画质检测、多路测试等


在以上测试能力中,有3个增强型服务测试能力是我们的特色:


(1)独立的APK测试能力


如图12所示,该工具支持脱离PC的方式进行测试,可直接在被测设备上部署工具,并且在进行设备应用操作时,可以实时展示数据。比如出现帧率的巨大下降时,可以直接在屏幕上展示数据并提供测试的报告,非常直观和便捷。

 

图12灵活的独立APK测试


(2)分布式渲染多路测试


该工具适用于HarmonyOS分布式多设备场景,可以绑定多个设备(如手机+笔记本),并且该工具平台可以把这些设备的测试报告进行绑定,形成完整的测试报告。

 

(3)支持单帧或多帧的采集和回放功能


如图13所示,该工具可以采集一帧或多帧API Trace结果,然后进行回放,再结合GPU Counters进行定位(如前文壁纸调优案例所述)。

 

图13 单帧或多帧采集回放

 

五、结语


HarmonyOS图形栈是整个HarmonyOS操作系统的基座,包括ArkUI 2D和3D部分。图形栈的测试是一个分层接口,包括应用层、系统层以及硬件层,可以帮助开发测试者从用户体验指标到深入了解系统和硬件发生了什么。

 

这些测试服务能力集成DevEco Testing下的图形图像测试工具,欢迎大家下载使用。

 

扫码添加开发者小助手微信

获取更多HarmonyOS开发资源和开发者活动资讯

有关图形测试分析毫无头绪?HarmonyOS图形栈测试技术帮你解决的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  3. ruby - Ruby 的 Hash 在比较键时使用哪种相等性测试? - 2

    我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。

  4. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  5. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  6. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  7. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  8. ruby-on-rails - 如何使辅助方法在 Rails 集成测试中可用? - 2

    我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel

  9. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  10. ruby-on-rails - 如何调试 cucumber 测试? - 2

    我有:When/^(?:|I)follow"([^"]*)"(?:within"([^"]*)")?$/do|link,selector|with_scope(selector)doclick_link(link)endend我打电话的地方:Background:GivenIamanexistingadminuserWhenIfollow"CLIENTS"我的HTML是这样的:CLIENTS我一直收到这个错误:.F-.F--U-----U(::)failedsteps(::)nolinkwithtitle,idortext'CLIENTS'found(Capybara::Element

随机推荐