首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

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

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

    浅谈 Canvas 渲染引擎

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

    2.6K20

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

    双缓存画布 现在我们有一幅图需要放在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.3K20

    【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

    1.4K20

    从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次,但是绘制的内容更新并没有这么频繁,所以我们需要做时间管理

    1.6K10

    前端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 事件。

    2.4K40

    熬夜总结了 “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

    7.6K10

    熬夜总结了 “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...我后面会不断更新网络技术相关的文章,如果觉得文章对你有用,欢迎给个“在看”,也欢迎分享,感谢大家 !!

    7.1K21

    利用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地址。

    4.7K50

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

    一.什么是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

    2K20

    【实战】Canvas实现图片上标注、缩放、移动和保存历史状态

    采用的是canvas绘制画笔,由css3的transform属性来进行平移与缩放,因为呢考虑到如果用canvas的drawImage或者scale等属性进行变化,生成出来的图片也会有影响,想着直接css3...= img.width canvas.height = img.height context.drawImage(img, 0, 0) // 设置变化基点,为画布容器中央...实现画布缩放 画布缩放我主要通过右侧的滑动条以及鼠标滚轮来实现,首先我们再监听画布鼠标事件的函数中加一下监听滚轮的事件 总结一下: 监听鼠标滚轮的变化 更新缩放倍数,并改变样式 // 监听鼠标滚轮,更新画布缩放倍数...总结一下: 鼠标抬起时,获取当前canvas画布状态 添加进状态列表中,并且更新状态下标 如果当前处于撤销状态,若使用画笔更新状态,则将当前的最为最新的状态,原先位置之后的状态全部清空 const handleLineMode...= null canvas.onmouseup = null } } 画布状态的撤销与恢复 ok,其实现在关于画布状态的更新,我们已经完成了。

    6.8K40
    领券