【发布时间】:2014-11-07 20:29:32
【问题描述】:
我创建了画布指针错误。它显示目标到所需位置(鼠标位置):
http://jsfiddle.net/conmute/rk276q3g/
问题出在 Firefox 渲染中,(移动鼠标非常快):
http://jsfiddle.net/conmute/rk276q3g/1/
矩形的行为很奇怪,我错过了。谁能指出具体是什么?
ctx.rect(
// start x,y pair
patternOffset.x, -p.circle.h/2 - patternOffset.y - 12,
// end x,y pair
-p.repeat.w, distance - p.circle.h - 1
);
ctx.fillStyle = pattern;
ctx.fill();
状态更新
我解决了这个问题: http://jsfiddle.net/rk276q3g/2/
通过注释掉 ctx.save() 和 .restore() 并在绘制矩形之前放置箭头图像。
所以实际上我解决了这个问题,但问题是......
问题更新
...如果我在做了一些 ctx.translate(... 和一些图纸之后需要画画怎么办?
我需要使用 ctx.save() 和 .restore() 方法,但这会导致问题。我如何在不评论的情况下完成这项工作?因为当我删除它们时,它解决了问题。
我认为我正确理解了它们的工作原理,但我发现我没有。
更新
似乎通过删除所有ctx.restore() 和ctx.save() 解决了解决方案,但是当我通过计算先前的位置将translateed 回来之后添加要绘制的部分时,问题再次出现!
【问题讨论】:
-
我不会使用
mousemove事件来触发绘画,而是使用window.requestAnimationFrame。mousemove被触发的频率很高,比浏览器的重绘率还要频繁。 -
@philipp 同意,但问题仍然存在。无论如何,我应该在事件回调中请求每次 requestAnimationFrame (用于鼠标位置)。问题不在于优化,而在于 .rect() 渲染。
-
我相信@philipp 已经发现了您的问题。你试图用每一个鼠标移动做太多事情。
-
我查看了代码,对于您想要实现的目标,我看起来非常复杂,您正在为每个循环的模式创建另一个画布,我想您不需要,因为您可以使用你所拥有的环境。你保存了两次上下文,但你从来没有恢复它……总而言之,如果一个人快速移动鼠标,两个位置之间的距离就会增加,并且失败变得可见。我声明当你移动鼠标缓慢时也存在问题,但是因为故障很小,所以你看不到它。是的,性能似乎不是问题。
-
@philipp 你关于保存和恢复状态的评论帮助了我,但我不明白为什么这个保存恢复的东西对我的情况不起作用。请参阅问题的更新。谢谢。
标签: javascript canvas fill picturefill