【问题标题】:Better way to draw a quadratic Curve in KineticJS?在 KineticJS 中绘制二次曲线的更好方法?
【发布时间】:2013-05-07 20:32:33
【问题描述】:

我正在编写一个应用程序,我必须在其中绘制大量可拖动的二次曲线。

我为此使用 Kinetic.Shape (KineticJS 4.4.3)。

由于性能不是很好,我尝试分析和优化代码,发现drawFunc函数执行了两次。 查看随附的演示代码。

var stage = new Kinetic.Stage({
    container: 'kinetic',
    width: 400,
    height: 300
});

var curveLayer = new Kinetic.Layer();

var line = new Kinetic.Shape({
    drawFunc: function (canvas) {
        console.log("drawFunc executed");
        var context = canvas.getContext();
        context.beginPath();
        context.moveTo(10, 10);
        context.quadraticCurveTo(95, 100, 200, 10);
        canvas.stroke(this);
    },
    strokeWidth: 10
});

curveLayer.add(line);
stage.add(curveLayer);

如果你运行脚本,控制台中会出现 2 次“drawFunc executed”。

我不明白为什么,我问自己是否有更好的方法。

小提琴的链接: http://jsfiddle.net/solitud/ZpU4J/9/

我的项目的链接: http://modulargrid.net/e/patches/view/92

【问题讨论】:

    标签: performance kineticjs quadratic-curve


    【解决方案1】:

    KineticJS 总是创建一个不可见的缓冲区画布,用于拖动等。

    您看到 drawFunc 为该缓冲区画布执行一次,为您的可见画布执行一次。

    没有办法消除那个 2X 绘图。

    查看您的项目链接,我猜测用户通过视觉拖动插头来创建与各种受体的连接。没有办法提高效率。

    但是,一旦任何连接完成,您可以通过将连接器缓存到图像来大大加快重绘连接器的速度:connector1.toImage( ... );

    与重绘四贝塞尔曲线相比,重绘图像缓存的“连接器”会产生更少的性能损失

    【讨论】:

    • 非常感谢,这一切都清楚了。我将尝试图像缓存方法。如果我理解正确,当用户与该图像交互时(悬停,单击..),我必须将图像转换回形状对象?是否有最佳实践/教程可用?
    • 贝塞尔曲线的绘制成本很高,因为每次重绘都必须计算曲线上的每个点。您的 15+ 根电缆乘以每根电缆上 100+ 个计算点 = 性能损失!我会将任何已经就位的贝塞尔“电缆”转换为图像,但每个“插头”圆圈仍将是一个可拖动的动力学对象。如果插头开始拖动,则使电缆成为“实时”可拖动贝塞尔曲线。这样,您将重绘 15+- 固定电缆图像(廉价的重绘),而不是重绘那么多“实时”贝塞尔曲线(昂贵的重绘)。
    • 我会试试这个,谢谢。插头和电缆已经在不同的层上分开了,所以这可能会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多