MST

星途 面试题库

面试题:Flutter中Skia图形引擎与平台原生图形系统的交互及性能调优

Flutter通过Skia图形引擎在不同平台上实现跨平台渲染。请详细说明Skia图形引擎是如何与Android和iOS的原生图形系统进行交互的?在这种交互过程中,为了达到最佳性能,有哪些关键的性能调优点需要注意,并且结合实际项目经验谈谈你是如何进行这些调优的?
11.0万 热度难度
前端开发Flutter

知识考点

AI 面试

面试题答案

一键面试

Skia与Android原生图形系统交互

  1. Surface创建
    • 在Android上,Flutter通过Android的Surface类创建一个用于绘制的表面。Surface提供了一个可绘制的区域,Skia在这个区域上进行图形绘制。例如,SurfaceViewTextureView都可以作为Skia绘制的目标表面。SurfaceView有自己独立的渲染线程,适合进行高性能、低延迟的渲染,而TextureView则基于OpenGL,可以在主线程外渲染,并且支持内容变换等特性。
    • Flutter通过EglSurface与Android的EGL(嵌入式系统图形库)进行交互。EGLOpenGL在嵌入式设备上的接口,它负责管理图形上下文、渲染表面等。Skia使用EGL提供的上下文进行图形绘制操作,确保绘制的内容能正确显示在Android设备的屏幕上。
  2. 图形绘制与同步
    • Skia在Android平台上使用OpenGL进行实际的图形渲染。Skia将其内部的图形指令转换为OpenGL命令,然后通过EGL提交到Android的图形系统。
    • 为了确保渲染的一致性和性能,需要进行适当的同步操作。例如,使用SyncFence来同步渲染操作,防止前一帧未完成渲染就开始下一帧的绘制,避免资源竞争和画面闪烁等问题。

Skia与iOS原生图形系统交互

  1. Surface创建
    • 在iOS上,Flutter使用CAEAGLLayer作为Skia绘制的目标表面。CAEAGLLayerCore Animation框架中与OpenGL ES集成的层,它允许在Core Animation的环境中使用OpenGL ES进行渲染。
    • Skia与iOS的Core GraphicsOpenGL ES进行交互。Core Graphics是iOS上的2D图形绘制框架,而OpenGL ES则用于3D图形绘制和高性能2D绘制。Skia利用OpenGL ES的上下文来执行图形绘制操作。
  2. 图形绘制与同步
    • Skia将其图形指令转换为OpenGL ES命令在iOS设备上进行渲染。
    • 同样,为了保证性能和渲染的正确性,需要进行同步。iOS提供了dispatch_semaphore等机制来进行线程同步,确保渲染操作按顺序进行,避免数据竞争和渲染错误。

关键性能调优点

  1. 减少绘制次数
    • 尽量合并相似的绘制操作,避免频繁的绘制调用。例如,在绘制多个相同颜色和样式的图形时,可以将它们合并为一个绘制操作,减少OpenGLOpenGL ES的指令提交次数。
    • 使用缓存机制,对于不变的图形元素,如背景图片、图标等,只绘制一次并缓存起来,后续复用,减少重复绘制。
  2. 优化纹理使用
    • 纹理压缩,选择合适的纹理压缩格式,如在Android上的ETC1、ETC2格式,iOS上的ASTC格式等,减少纹理内存占用,提高加载速度和渲染性能。
    • 合理管理纹理大小,避免使用过大的纹理,根据实际显示需求调整纹理分辨率,减少内存消耗和渲染压力。
  3. 控制帧率
    • 避免过度渲染,将帧率控制在设备支持的合理范围内,如60fps。过高的帧率会增加设备功耗和渲染压力,而帧率不稳定会导致画面卡顿。
    • 使用Vsync(垂直同步)机制,确保渲染操作与屏幕刷新同步,避免画面撕裂等问题。

实际项目调优经验

  1. 在一个地图应用项目中
    • 减少绘制次数:地图上有大量的标注和线条,我们通过将相同类型的标注(如餐厅、酒店等)进行分组,在一个绘制批次中进行绘制。对于地图的底图,我们采用了瓦片缓存机制,只绘制当前可见区域的瓦片,并且对已绘制的瓦片进行缓存,当地图移动时复用未超出可见范围的瓦片,大大减少了绘制次数。
    • 优化纹理使用:地图中的图标纹理,我们采用了ETC1格式进行压缩,在保证视觉效果的前提下,大幅减少了纹理内存占用。同时,根据不同分辨率的设备,动态加载合适分辨率的纹理,避免在低分辨率设备上加载过高分辨率的纹理造成资源浪费。
    • 控制帧率:我们使用Vsync来同步渲染操作与屏幕刷新,确保地图在滑动和缩放过程中帧率稳定在60fps。通过监测帧率,我们发现某些复杂区域(如城市中心建筑密集区)会出现帧率下降的情况,通过进一步优化绘制算法,如减少不必要的图形计算,成功解决了帧率问题,提升了用户体验。