我的工作对象是一个金融库,它要求我通过实时更新到画布中的线条图。为了优化更新图表的过程,我想只更新最新的数据点,而不是清理和重新绘制整个画布。
当只频繁地重新呈现最新的数据池时,我注意到这条线不清晰(图像中有一个点)。
--这是这条线最初的样子(没有重绘)

在对“”进行了几次更新之后,行如下所示:

注意,这2行的“连接”可以用更深的阴影看到。
是否有一种方法只为最新的数据点实现部分重新绘制线&而不是完全绘制整条线?
参考码
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.beginPath();
ctx.lineWidth = 2;
ctx.lineJoin = "miter";
ctx.moveTo(20, 50);
ctx.lineTo(100, 50);
ctx.save();
ctx.lineTo(150, 60);
ctx.stroke();
/*Call this every second to re-draw only the latest data point*/
function partial_rerender(){
ctx.clearRect(100,50, 400,400);
ctx.restore();
ctx.lineTo(150, 60);
ctx.stroke();
}发布于 2017-06-30 12:49:36
每次呈现时,您都需要创建一个新的路径,否则最终会一次又一次地重新呈现相同的内容。
ctx.save()和ctx.restore()从堆栈中推和弹出,对于每一次恢复,您都需要进行匹配的保存。ctx.save(),ctx.restore(),ctx.restore()第二次恢复什么也不做,因为没有匹配的保存。
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.beginPath();
ctx.lineWidth = 2;
ctx.lineJoin = "miter";
ctx.moveTo(20, 50);
ctx.lineTo(100, 50);
ctx.save();
ctx.lineTo(150, 60);
ctx.stroke();
// Your function should look more like this
function partial_rerender(){
ctx.lineWidth = 2;
ctx.lineJoin = "miter";
ctx.save(); // needed to remove clip
ctx.beginPath(); // removes old path ready to create a new one
ctx.rect(100,50, 400,400); // create a clip area
ctx.clip(); // activate the clip area
ctx.clearRect(100,50, 400,400);
ctx.beginPath(); // needed to draw the new path
ctx.moveTo(100,50)
ctx.lineTo(150, 60);
ctx.stroke();
ctx.restore(); // remove the clip area
}发布于 2017-06-30 12:15:48
当您在画布上绘图时,您确实会覆盖所需的像素。但其余的都保持不变。你想要达到的目标是不可能的。您必须清除画布(canvas.clear()),然后重新绘制所有元素,以从以前的绘图调用中删除这些工件,并实现您想要的结果。
https://stackoverflow.com/questions/44846234
复制相似问题