首页
学习
活动
专区
圈层
工具
发布

腾讯文档Doc Canvas渲染引擎流程改造

API drawImage将对应区域直接绘制到离屏canvas(在内存中创建的canvas元素,未dom挂载在页面上展示);针对新渲染区域(滚动产生的新出现在可视范围的区域),则在离屏canvas中执行基础渲染...相关,且在canvas画布尺寸大到一定量级时,浏览器有相应的逻辑限制drawImage绘制。...可以天然对应起来:图片分页渲染将每次渲染和复用的最小单位固定为文档的分页(对应排版结构LogicPage),滚动过程中仅仅需要对出现在渲染区域的新分页进行渲染,且新渲染分页可以复用脱离渲染区域的分页DOM,未脱离渲染区域的分页则无需任何更新...通过这样的流程改造后,有以下收益:可以完全弃用离屏canvas和drawImage,解决了drawImage带来的问题,减少了离屏canvas带来的额外显存和总画布尺寸占用一个分页对应一个canvas,...可以看下两种回收设置对比:图片图片如上图所示,在safari浏览器,直接将canvas画布设置为width = 0, height=0,虽然画布尺寸确实更新为0,但是占用的显存并没有被浏览器回收。

5.8K130
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    浅谈 Canvas 渲染引擎

    封装 2.1 虚拟节点 Canvas 是一张画布,里面的内容都是自己调用 API 绘制的,所以更像是我们拿起画笔来作画。...事件 Canvas 本身是一块画布,所以里面的内容都是画出来的,在 DOM 树里面也只是一个 Canvas 的节点,所以如何才能知道当前点击的是哪个图形呢?...当用户鼠标点击 Canvas 画布的时候,可以拿到鼠标触发的 x、y,将其传给内存里面的 Canvas。...4.2 离屏渲染 离屏渲染我们应该都比较熟悉了,就是两个 Canvas 来回用 drawImage 绘制可复用部分,从而减少绘制的耗时。...比较难应用于表格这种形式的业务 Konva 没有脏检测能力,即使 Group 里面的 Shape 属性改变了,依然不会更新离屏 Canvas。

    3.3K20

    前端“油画设计师”——双缓存绘制与油画分层机制

    双缓存画布 现在我们有一幅图需要放在Canvas中,使用drawImage()方法,有三种写法: // 将image放到目标canvas指定位置 void ctx.drawImage(image, dx...裁剪之后放到目标canvas指定位置,指定宽高渲染 void ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight..., sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight); // 在视图canvas中绘制 viewcontext.drawImage(canvas,...在需要渲染时,只需要讲缓存画布的内容克隆到主画布上,再附加上装饰图层元素 这样,当表格需要更新时候,比如单元格背景改变,只需要在克隆缓存画布后重绘对应单元格内容即可。...而当表格向下滚动时,表格滚动结束,需要重绘,主画布会被清空,然后从缓存画布中根据行为上下文进行画布偏移,将偏移后的图层直接绘制在主画布上,随后在主画布上绘制偏移后的剩余部分,最后更新缓存。

    1.8K20

    【Java AWT 图形界面编程】Canvas 中绘制超大图片 ( 使用鼠标拖动查看全图 | 设置 JFrame 窗口自动关闭 | 获取并绘制图片 | 鼠标拖动计算位移 | 画布偏移 )

    函数 , 向 Canvas 中绘制图片 ; // 绘制图形 graphics.drawImage(image, 0, 0, this); 绘图的函数原型为 : ImageObserver...就是 Canvas 对象本身 ; public abstract boolean drawImage(Image img, int x, int y,...ImageObserver observer); 3、鼠标拖动计算位移 鼠标按下时 , 记录按下的位置 , 保存到 startX 和 startY 变量中 , 这两个变量每次鼠标按下都会更新 ;...java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public class LargeCanvas extends JPanel { // 鼠标按下时的坐标 以及 更新后的坐标...LargeCanvas canvas = new LargeCanvas(); // 将画布放入滚动布局 JScrollPane scrollPane

    2K20

    从Chrome小恐龙游戏学习2D游戏制作

    ,是一个定时回调,每隔一段时间去更新游戏的逻辑,比如处理用户的交互,更新游戏的状态,绘制动画等等 mainloop() { this.clearCanvas() // 清除画布 // 处理逻辑...这里面涉及到的知识点是canvas的创建、画面清除,以及drawImage的应用。...通过drawImage我们可以裁剪精灵图中某一部分的图像,并绘制到画布中,drawImage一共有9个参数context.drawImage(img,sx,sy,swidth,sheight,x,y,width...('2d') } // 二次绘制的时候清除画布 this.ctx.clearRect(0, 0, CANVAS_WIDTH, CANVAS_WIDTH, CANVAS_HEIGHT) // 绘制地面...context.drawImage() // 更新绘制 } 动画就涉及到更新频率,如果像上面那样每次循环的时候都去绘制,mainloop一秒会执行60次,但是绘制的内容更新并没有这么频繁,所以我们需要做时间管理

    2K10

    前端canvas基础复习,canvas学习笔记,持续记录

    ctx.strokeStyle = color; ctx.strokeStyle = gradient; ctx.strokeStyle = pattern; 3.渐变 Gradients 经过测试,渐变色未填满整体图形时...只支持路径,不支持fillRect、drawImage这些操作 状态保存和恢复 Canvas 是基于「状态」来绘制图形的。...切片,图像指定一部分到画布指定位置 drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight) 组合 Compositing globalCompositeOperation...3.不要在用drawImage时缩放图像 在离屏 canvas 中缓存图片的不同尺寸,而不要用drawImage()去缩放它们。...移动物体:在鼠标移动(mousemove)中,更新物体坐标为鼠标坐标。 松开物体:在鼠标松开(mouseup)时,移除 mouseup 事件(自身事件也得移除)和 mousemove 事件。

    3.7K40

    熬夜总结了 “HTML5画布” 的知识点(共10条)

    为了不每次更新动态场景的时候,都去绘制静态场景。 一般把静态场景绘制在离屏canvas上,更新动态场景的时候,把静态场景copy过来,而不是重新绘制。...离屏技术: 一个Canvas中的图形绘制到另一个Canvas方法: ctx.drawImage(canvas,x,y),该方法把canvas绘制在(x,y)处 ctx.drawImage(canvas...()方法可以将图像添加到Canvas画布中,绘制一幅图像,需要有三个重载的方法: 使用: drawImage(image, x, y) // 在画布上定位图像 // 方法在画布上绘制图像、画布或视频。...drawImage(image, x, y, width, height) // 在画布上定位图像,并规定图像的宽度和高度 drawImage(image, sourceX, sourceY, sourceWidth...示例: // 为画布设置边框 canvas { border: 1px solid #ccc; } // 准备画布,默认是300*150 // 设置画布的大小 canvas width="1200

    8.7K10

    熬夜总结了 “HTML5画布” 的知识点(共10条)

    为了不每次更新动态场景的时候,都去绘制静态场景。 一般把静态场景绘制在离屏canvas上,更新动态场景的时候,把静态场景copy过来,而不是重新绘制。...使用drawImage()方法可以将图像添加到Canvas画布中,绘制一幅图像,需要有三个重载的方法: 使用: drawImage(image, x, y) // 在画布上定位图像 // 方法在画布上绘制图像...drawImage(image, x, y, width, height) // 在画布上定位图像,并规定图像的宽度和高度 drawImage(image, sourceX, sourceY, sourceWidth...drawImage() img 图片对象、canvas对象、video对象 x,y,w,h 图片中的一个矩形区域 x1,y1,w1,h1 画布中的一个矩形区域 img 图片对象、canvas对象、video...我后面会不断更新网络技术相关的文章,如果觉得文章对你有用,欢迎给个“在看”,也欢迎分享,感谢大家 !!

    8.3K21

    利用canvas给图片加水印 (转)

    一、使用canvas在前端实现图片水印合成 如果仅仅是普通的合成,例如一个底图和一个PNG水印图片合成,直接使用canvas的drawImage()方法即可,语法如下: context.drawImage...画布上放置img提供的高度(可能会有图片剪裁效果)。 而PNG水印图片的合成,直接连续在使用drawImage()把对应的图片绘制到canvas画布上就可以,原理就是这么简单。...画布上,核心JS代码如下: var canvas = document.createElement('canvas'); var context = canvas.getContext('2d');...(imgUpload, 0, 0, 180, 180); }; imgUpload.src = base64; 三是在已经绘制好了本地图片的画布上继续画水印图片,并借助canvas的toDataURL(...)方法把我们的canvas画布转换成base64无损PNG地址。

    5.2K50

    前端|利用画布制作地球轨道

    一.什么是canvas> canvas> 画布标签常用于绘制图像,但是,canvas> 元素本身并没有绘制能力,它仅仅是图形的容器,要想通过canvas>画布标签来绘制图像,还需要调用js方法。...今天就利用canvas> 画布来绘制一下地球轨道的效果。 ? 图1.1 效果图 二.canvas>基础知识介绍 canvas只有height高度和width宽度两个属性。...canvas> 画布的基础就不再介绍了,因为之前看到过一篇关于canvas>画布知识的介绍,链接如下: https://mp.weixin.qq.com/s/B3T8ERjAEjlwG6HU_RLEYw...这个方法是告诉浏览器执行动画,并请求浏览器调用指定的函数以在下次重绘之前更新动画。该方法将回调作为在重绘之前调用的参数。...(earth,-12,-12);//把地球图形,添加到画布上 //画太阳 ctx.drawImage(sun,0,0,300,300); window.requestAnimationFrame

    2.5K20

    OpenHarmony 实战开发——ArkUI之Canvas组件

    在 Web 浏览器中,canvas 是一个可自定义 width、height 的矩形画布,画布左上角为坐标原点,以像素为单位,水平向右为 x 轴,垂直向下为 y 轴,画布内所有元素都基于原点进行定位。...canvas 采用轻量的逐像素渲染机制,以 JS 为“画笔”直接控制画布像素,从而实现图形绘制。...图 1 canvas 画布1.2Canvas 的“画笔”canvas 本身虽不具备绘制能力,但是提供了获取“画笔”的方法。...如图 3 所示,在画布内绘制了一个黑色的填充矩形,x 与 y 指定了在 canvas 画布上所绘制的矩形的左上角(相对于原点)的坐标,width 和 height 则设置了矩形的尺寸。...将图片渲染到 canvas 画布上let img:ImageBitmap = new ImageBitmap("图片路径(如common/images)/"+this.imgList[数组下标]);this.ctx.drawImage

    41020
    领券