【发布时间】:2016-04-19 11:56:11
【问题描述】:
我正在尝试使用鼠标移动事件来模拟钢笔绘图工具。
elCanvas.on("mousedown", function(e){
moving = true;
var position = getPos(e);
points = [];
points.push(position);
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
ctx.beginPath();
ctx.moveTo(position.x, position.y);
}
elCanvas.on("mousemove", function(e){
if (moving) {
var curr = getPos(e);
points.push(curr);
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
var p1 = points[0];
var p2 = points[1];
ctx.beginPath();
ctx.moveTo(p1.x, p1.y);
for (var i = 1, len = points.length; i < len; i++) {
var midPoint = midPointBtw(p1, p2);
ctx.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y);
p1 = points[i];
p2 = points[i + 1];
}
ctx.lineTo(p1.x, p1.y);
ctx.stroke();
}
现在这段代码在 Safari 中运行良好。但是鼠标在mac上的webView中严重滞后。我目前正在使用 iMac 5K 显示器对其进行测试。
我还注意到一件事,代码运行良好(没有滞后),提供了更新的 webView 类 OSX (WKWebView)。但它有 64 位要求。
所以我希望它在带有 4k 或 5k 显示器的 mac webview 上工作。
我还将结果与 www.awwapp.com 进行比较,该结果在同一个 webView 中使用相同的设置运行良好。
注意:为了流畅,我需要整点重绘逻辑。如果我们在每次移动后盲目地抚摸,就会导致绘制粗糙。由于这段代码在 Safari 中运行良好,我主要关心的是为什么在 webView 中运行缓慢?
【问题讨论】:
-
你有性能损失。为什么要在每个
mousemove上的所有点之间绘制所有曲线?您只需要在最后一点和新点之间绘制曲线 -
那是因为如果我们在每个点之后盲目地描边,就会导致绘制粗糙。如此处所示perfectionkills.com/exploring-canvas-drawing-techniques 并且此代码在 safari 下运行良好。所以我认为webView代码也有改进的机会。
标签: javascript macos performance webview