【HarmonyOS NEXT】Canvas画布绘制性能瓶颈

【关键字】

Canvas / globalAlpha / app闪退 / 绘制path2D / 马克笔的画笔颜色透明度

【问题描述】

1、Canvas画板绘制多条路径, 进行缩放, 缩放过程出现App闪退, 无闪退日志。

2、画布监听首饰进行绘制时globalAlpha效果不对, 缩放之后效果正常。

如下图: 缩放之后整条线有明显的透明度, 缩放之前线的最下端有轻微的透明度。

图1

cke_1371.png

图2

cke_2341.png

场景描述:

缩放过程中利用setTimeOut进行频率控制, 路径缩放使用画布组件放大和setTransform进行缩放实现,。

相关逻辑方法为:

  • containerPinchGestureUpdate 缩放监听

  • updateScale/updateContainerOffset 手势数据处理

  • updateContainerOffset 缩放绘制方法

【问题分析】

1、画布组件放大会导致app闪退:

原因:每次放大画布组件都会频繁触发PinchGesture().onActionUpdate()回调,回调中的containerPinchGestureUpdate(event)方法的调用链中的containerScaleDidUpdate方法中的语句this.offCanvas = new OffscreenCanvas(this.canvasWidth, this.canvasHeight)会申请一个新的离线画布,每次申请都会占用内存,导致占用内存过多应用崩溃。

2、马克笔的画笔颜色在缩放之后才有透明度:

原因:绘制需要缩放之后才有透明度是因为绘制path2D时每次绘制都会把之前的路径绘制,多次绘制叠加看起来没有透明度,缩放后才有透明度是因为缩放后重新绘制了,只绘制了一次。

【解决方案】

1、画布组件放大会导致app闪退:

解决方案:将new OffscreenCanvas此行代码注释掉后没有崩溃问题。建议不要每次都创建一块新的离屏画布,使用一个离屏画布然后改变其宽高来解决该问题。

2、马克笔的画笔颜色在缩放之后才有透明度:

解决方案:在drawCurrentPathModel()方法中不要直接使用this.context.stroke(item.path)绘制路径,而是使用clearRect清空画布后对当前已有路径进行重绘。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值