合作咨询
我们的专家服务团队将竭诚为您提供专业的合作咨询服务
XComponent组件作为一种渲染组件,可用于满足开发者实现高级自定义渲染的需求,例如相机预览流的显示和游戏画面的渲染。XComponent渲染时可能出现黑屏、卡顿等问题,本文从XComponent渲染原理、图形渲染定位工具链、典型案例分析思路三个方面提供定位排查指导。
XComponent组件负责创建Surface,并通过回调将Surface的相关信息告知应用。应用可以通过一系列接口设定Surface的属性。该组件本身不对所绘制的内容进行感知,亦不提供渲染绘制的接口。XComponent渲染的架构图如下图所示:

XComponent持有一个Surface,开发者能通过调用NativeWindow模块的接口,申请并提交Buffer至图形队列,以此方式将自绘制内容传送至该Surface,其主体流程如下图所示:

数据流向图如下图所示:

经过上述流程,应用自绘制的内容就可以显示在XComponent持有的Surface区域,而XComponent则负责将此Surface整合进UI界面,其中展示的内容正是开发者发送的自绘制内容。Surface的默认位置与大小与XComponent组件一致,开发者可利用setXComponentSurfaceRect()接口自定义调整Surface的位置和大小。
在日志里面搜索XComponent,可以获取组件id信息、onSurfaceCreated()和onLoad()的触发信息、通过getXComponentSurfaceId()获取的Surface id信息,如下图所示:

在日志中搜索C01401或Bufferqueue,可以获取图形渲染异常信息和对应的错误码。错误码可参考OHNativeErrorCode,异常信息如下图所示:

参考获取期望应用组件树获取组件树信息,然后搜索XComponent,可获取XComponent组件信息,如下图所示:

参考获取系统服务详细信息获取Render Service信息,如下图所示:

使用hdc shell "hidumper -s RenderService -a allInfo"命令可同时获取surface、RS树等信息。
1. 获取RS树信息
RS树是Render Service根据UI组件树转换成的渲染树信息。使用hdc shell "hidumper -s RenderService -a RSTree" > RSTree.dump命令获取RS树信息,然后搜索SURFACE_NODE,可获取XComponent组件对应的节点信息,如下图所示:

2. 获取surface信息
使用hdc shell "hidumper -s RenderService -a surface" > surface.dump命令获取surface信息,然后根据XComponent id或者XComponent的Surface id搜索,可获取XComponent组件对应的surface信息和图形队列信息,如下图所示:

问题描述
使用OH_NativeXComponent的OnSurfaceCreated()接口从XComponent组件获取NativeWindow后,传递给渲染子线程使用,当页面退出,XComponent组件销毁时,出现崩溃。
可能根因
解决方案
问题描述
使用XComponent组件绘制内容的背景是透明的,但是层叠布局只能看到第一层绘制的内容。
可能根因
当开发者传输的绘制内容包含透明元素时,Surface区域的显示效果会与下方内容进行合成展示。如果传输内容完全透明,将XComponent的背景色设置成黑色,最终显示为一片黑色区域,层叠布局下方的内容将不可见。
解决方案
将XComponent组件的backgroundColor设置为透明。
问题描述
使用XComponent组件渲染,画面黑屏。
可能根因
解决方案
问题描述
页面切换时,XComponent渲染画面出现闪烁。
可能根因
XComponent组件销毁重建或XComponent属性发生变化。
解决方案
参考Hidumper查询图形渲染信息,排查UI树和RS树上的XComponent节点信息是否有变化,例如id、宽高、背景色、透明度等属性是否有变化。
问题描述
从XComponent对应的NativeWindow中获取Buffer并进行绘制,送显后画面出现花屏、裂屏。
可能根因
使用OH_NativeWindow_NativeWindowRequestBuffer()获取Buffer时,会返回一个fenceFd,这个fenceFd是消费者进程创建的一个文件句柄,表示消费者是否已完成Buffer消费。只有消费端完成消费后,生产者才可以开始填充Buffer,否则会造成花屏、裂屏等问题。
解决方案
调用OH_NativeWindow_NativeWindowRequestBuffer()后,等待fenceFd等于-1(-1表示消费者已完成Buffer消费)后,再将生产的内容写入Buffer。详细使用方法可参考NativeWindow开发指导 (C/C++)。
问题描述
从XComponent对应的NativeWindow中获取Buffer并进行绘制,连续渲染时画面出现卡顿。
可能根因
解决方案
问题描述
使用OH_NativeImage_AcquireNativeWindowBuffer()获取Buffer,消费后已使用OH_NativeImage_ReleaseNativeWindowBuffer()归还Buffer,仍然出现内存泄漏。
可能根因
解决方案