Konva离屏缓存

news2024/12/30 2:09:54

前言

cache实例方法定义在Node基类上,通过该方法可以实现图形缓存,在Konva中Stage、Layer、Group、Shape等所有容器类和图形类都直接或间接继承了Node基类,故而都可以使用缓存方法。本篇文章就是探讨Konva背后的缓存机制,版本是v9.2.1。

Konva离屏缓存

就以下面的实例进行整体过程的分析:

      const stage = new Konva.Stage({
        container: 'root',
        width: window.innerWidth,
        height: window.innerHeight,
      });
      const layer = new Konva.Layer();
      const star = new Konva.Star({
        innerRadius: 20,
        outerRadius: 50,
        fill: 'red',
        stroke: 'black',
        strokeWidth: 5,
        numPoints: 5,
        x: 60,
        y: 60,
        shadowOffset: { x: 5, y: 5 },
        shadowColor: 'black',
        shadowBlur: 5,
        shadowOpacity: 0.5,
        shadowForStrokeEnabled: false,
      });

      star.cache()
      layer.add(star);
      stage.add(layer);

	  // 创建10个Star
      let clone;
      for (var n = 0; n < 10; n++) {
        clone = star.clone({
          x: Math.random() * stage.width(),
          y: Math.random() * stage.height(),
        });
        clone.cache();
        layer.add(clone);
      }

上面的实例就是创建11个Star图形,每个图形都会调用cache实例方法进行缓存。

cache处理流程

cache实例方法的处理逻辑如下:
Cache处理逻辑
当图形对象调用缓存方法cache时,其逻辑总结如下:

  • 首先内部会计算当前图形的包围框信息(大小以及位置),通过包围框的大小信息创建cachedSceneCanvas、cachedFilterCanvas、cachedHitCanvas三个Canvas图层,这三个图层不会挂载在页面上仅仅位于内存中
  • 然后将当前图形绘制到CachedSceneCanvas、CachedHitCanvas中
  • 最后会将相关包围框位置信息以及CachedCanvas保存到_cache实例属性中,用于后续的逻辑处理

需要注意的是总会保存最新信息到_cache实例属性中,如果多次调用cache实例方法时会先删除_cache中存在的key,然后重新添加,逻辑如下:

cache() {
	...
	this._cache.delete(CANVAS);
	...
    this._cache.set(CANVAS, {
    	scene: cachedSceneCanvas,
    	ilter: cachedFilterCanvas,
        hit: cachedHitCanvas,
        x: x,
        y: y,
    });
    ...
缓存图形的渲染

Konva是批量渲染图形的,在之前
Konva批量渲染文章中就有较为详细的处理逻辑,缓存图形的渲染逻辑也包含在其中,只是之前并没有具体说明。实际上针对缓存图形的渲染处理具体逻辑如下:

_drawCachedSceneCanvas(context) {
  context.save();
  ...
  var cacheCanvas = this._getCachedSceneCanvas();
  var ratio = cacheCanvas.pixelRatio;
  context.drawImage(cacheCanvas._canvas, 0, 0, cacheCanvas.width / ratio, cacheCanvas.height / ratio);
  context.restore();
}
drawScene(can, top) {
  ...
  if (cachedSceneCanvas) {
    context.save();
    ...
    this._drawCachedSceneCanvas(context);
    context.restore();
  } else {
    this._drawChildren('drawScene', canvas, top);
  }
  return this;
}

核心逻辑就是drawImage方法,对于缓存的图形实际上就是使用drawImage将其保存的CachedCanvas绘制到SceneCanvas中,而不是调用Canvas API进行具体的绘制。

总结

Konva缓存本质上就是创建位于内存中的Canvas图层,将当前图形绘制到CachedCanvas中,之后渲染时使用drawImage将整个CachedCanvas绘制到场景中,从而减少向CPU发送操作指令进而实现性能的提升。

从上面梳理逻辑知道每调用一次cache实例方法都会创建三个CachedCanvas并保存到对应属性中,如果图形很多,这是非常大的性能消耗,所以cache不能随便使用。实际上Konva官网也有cache的使用建议,可以去具体看看,这里就不再说明了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1050915.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

300以内的开放耳机哪款好、300以内神级耳机推荐

开放式耳机基于不入耳、长久舒适佩戴的特点&#xff0c;在 2023 年迎来了增长爆发期。基于其开放式不入耳设计&#xff0c;佩戴时耳道会持续保持畅通状态&#xff0c;减少了对耳朵的压力&#xff0c;既能在通话或欣赏音乐时提供清晰的声音&#xff0c;又能让周围的环境声音透过…

Scala第二章节

Scala第二章节 scala总目录 章节目标 掌握变量, 字符串的定义和使用掌握数据类型的划分和数据类型转换的内容掌握键盘录入功能理解Scala中的常量, 标识符相关内容 1. 输出语句和分号 1.1 输出语句 方式一: 换行输出 格式: println(里边写你要打印到控制台的数据);方式二…

【Java 进阶篇】MySQL多表查询之子查询详解

在数据库查询中&#xff0c;多表查询是一项非常常见且重要的任务。它允许我们从多个相关联的表中检索和组合数据&#xff0c;以满足各种复杂的查询需求。在多表查询中&#xff0c;子查询是一种强大的工具&#xff0c;用于在查询中嵌套另一个查询。本文将深入探讨MySQL中的子查询…

直播软件开发技巧:7个实时视频传输和弹幕功能的关键步骤

近年来&#xff0c;随着直播行业的快速崛起&#xff0c;直播软件的开发变得越来越重要。直播软件的成功不仅依赖于稳定的实时视频传输&#xff0c;还需要强大的弹幕功能来提升用户体验。作为直播软件开发领域的专家&#xff0c;我将与您分享七个关键步骤&#xff0c;帮助您掌握…

python使用mitmproxy和mitmdump抓包在电脑上抓包

mitmproxy是一个中间人角色&#xff0c;供python抓包使用。 本机环境&#xff1a;win10 64位&#xff0c;python3.10.4。首先安装mitmproxy&#xff0c;参考我的文章 记录一下python2和python3在同一台电脑上共存使用并安装各自的库以及各自在pycharm中使用的方法-CSDN博客 一…

SimpleCG文字输出基础

前言 前面已经介绍了图形绘制&#xff0c;本篇将介绍简单的文字输出操作方法。其实文字在计算机中也是作为图形处理的&#xff0c;只是一种特殊的图形&#xff0c;是按固定预设字模图形来绘制的&#xff0c;称为字体。文字输出就是按文字所在字体中的对应图形绘制出来&#xff…

【golang】调度系统之整体介绍

调度系列 调度系列之goroutine 调度系列之m 调度系列之p 调度系列之sysmon 前面几篇对调度体系的G、M、P、sysmon分别进行了介绍。拆分的介绍有助于聚焦单一的角色&#xff0c;比较快地建立认识&#xff0c;同时也能更深入细节&#xff0c;但是不足以建立全局的认知。本篇在前面…

C理解(五):编译,链接库,宏,关键字,变量

编译 编译过程 文件.c->(预处理)->文件.i->(编译)->文件.S->(汇编)->文件.o->(链接)->elf程序 预处理 内容:加载头文件(#include),清除注释(//,./*),替换条件编译(#if #elif #endif #ifdef),替换宏定义(#define) …

[杂谈]-ESP32中的无线通信协议

ESP32中的无线通信协议 文章目录 ESP32中的无线通信协议1、ESP32 无线通信协议简介2、Bluetooth Low Energy (BLE)3、**Bluetooth Classic**4、**ESP-NOW**5、Wi-Fi&#xff08;客户端-服务器通信协议&#xff09;6、MQTT7、**LoRa**8、**GSM/GPRS/LTE**9、总结 ESP32是一个基于…

BL808学习日志-0-概念理解

一、主核心的介绍 1.三个核心在FREERTOS系统中相互独立&#xff0c;各负责各自的外设和程序&#xff1b;其中M0和LP核心在一个总线上&#xff0c;D0单独在一个总线上&#xff0c;两个总线使用AXI4.0(??)通讯&#xff1f; CPU0(M0)-E907架构&#xff0c;320MHz; CPU1(LP)-E9…

基于微信小程序的高校宿舍管理系统设计与实现(亮点:选择宿舍、宿舍评分、宿舍报修)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

【中秋节快乐】Matplotlib:3d绘图合集

目录 一、环境介绍 二、Matplotlib绘图&#xff08;3d&#xff09; 0. 设置中文字体 1. 3D线框图&#xff08;3D Wireframe Plot&#xff09; 2. 3D散点图&#xff08;3D Scatter Plot&#xff09; 3. 3D条形图&#xff08;3D Bar Plot&#xff09; 4. 3D曲面图&#xff0…

微信小游戏从零到上线系列文章整理,建议收藏

引言 本系列是《从零开始开发贪吃蛇小游戏到上线系列》&#xff0c;欢迎大家关注分享收藏订阅。 大家中秋快乐&#xff0c;我是亿元程序员&#xff0c;一位有着8年游戏行业经验的主程。前面笔者给大家讲解了微信小游戏如何从零到上线的流程。可能很多小伙伴都还没有看到。 本…

【深度学习_TensorFlow】卷积神经网络(CNN)

写在前面 这篇文章的行文思路如下&#xff1a; 先根据视频了解卷积和卷积神经网络的整体框架 接着了解卷积神经网络构建过程中的一些重要操作&#xff0c;包括内积、填充、池化。 然后介绍卷积层如何实现。 最后用卷积神经网络的开山之作&#xff08;LeNet-5&#xff09;来…

22 mysql range 查询

前言 这里主要是 探究一下 explain $sql 中各个 type 诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断 这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录 以及 相关的差异 此系列文章建议从 mysql const 查询 开始看 测试表结构…

奶茶果饮外卖配送小程序商城的作用是什么

奶茶果饮商家众多&#xff0c;有加盟品牌也有独立自创品牌或小店等&#xff0c;奶茶果饮已经成为众多年轻人群体喜爱的饮品&#xff0c;在实际消费方面&#xff0c;普遍以到店外卖为主&#xff0c;市场需求较高&#xff0c;但同样的竞争压力也不小。 同行竞争激烈&#xff0c;…

【教学类-35-03】学号+姓名+班级(小3班)学号字帖(A4竖版2份)

图片展示: 背景需求: 本周排到小3班&#xff0c;还没有来得及设计小班主题活动书的内容&#xff0c;于是就把小2班的学号字帖微调一下&#xff0c;做一份竖版2份的学号字帖。 让幼儿熟悉自己的学号&#xff0c;让我也熟悉幼儿的名字和学号 材料准备&#xff1a; 描字写&#…

Excel 使用 ctrl + E 快捷键进行数据提取、合并、添加前后缀等操作

使用组合键【Ctrl E】&#xff0c;你可以对数据进行合并、数据提取、添加前后缀等操作。 合并 提取 加前后缀或单位

KNN(上):数据分析 | 数据挖掘 | 十大算法之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

day09_数组进阶

今日内容 零、 复习昨日 一、作业 二、引用类型[重要] 三、数组拷贝 四、数组扩容 五、数组排序[面试|笔试] 六、Arrays 零、 复习昨日 1数组创建后能否改变长度 不能 2数组创建后能否存储不同类型的数据 不能 √能,能默认转型的可以存储 double[] arr2 new double[3]; arr2[0…