【问题标题】:VERY poor performance with KineticJS on Android :(在 Android 上使用 KineticJS 的性能非常差 :(
【发布时间】:2014-02-16 07:24:00
【问题描述】:

我有一个有 1 层的舞台,它有 100 个 kineticImage 对象(当然还有 100 个附加到它们的图像)。当我点击一个动态图像对象时,我写了一个非常简单的补间:

    var growTween = new Kinetic.Tween({
        node: that.kineticImage, 
        duration: 0.1,
        scaleX: that.kineticImage.scaleX()+0.2,
        scaleY: that.kineticImage.scaleY()+0.2
    });
    growTween.play();

您可以在以下位置查看整个示例: http://trueicecold.no-ip.org/pumpkin/demo.html

所以每张按下的图像将在 1/10 秒内增长 20%...只有1-2帧...

会不会是 100 张图片太重,Android 无法处理?我正在使用 Galaxy S3。

编辑:我也尝试了 100 个圈子:http://trueicecold.no-ip.org/pumpkin/demo2.html,结果相同...

【问题讨论】:

    标签: android html kineticjs


    【解决方案1】:

    移动设备上的画布明显比桌面上的画布慢。

    像 KineticJS 这样在画布上赋能对象的库将明显比纯移动画布慢。

    为了获得更好的性能,请尝试将补间对象临时移动到单独的图层上。

    myTweeningShape.moveTo( myTweenLayer );
    

    只有 1 个对象会在每个补间步骤中重绘,而其他 99 个对象(在另一层上)不必重绘。

    然后当补间结束时,您可以再次将补间对象放回主层。

    您可以将 onFinish 函数添加到补间中,该函数将在补间结束时触发。

    [其他想法]

    (1) 新的 Image() 太多

    只需在南瓜“类”之外加载一次南瓜图像,然后使用该 1 个图像作为每个 Kinetic.Image 的图像。不要在每个 Pumpkin 中加载和保存新的 Image()。

    (2) Tweens 没有被销毁,因此正在累积

    Kinetic.Tween 不会在补间播放后自动销毁自己,因此请告诉每个新补间在播放后销毁自己:

    var growTween = new Kinetic.Tween({
        node: that.kineticImage, 
        duration: 0.1,
        scaleX: that.kineticImage.scaleX()+0.2,
        scaleY: that.kineticImage.scaleY()+0.2
        onFinish:function(){ this.destroy(); }
    });
    

    【讨论】:

    • 谢谢markE,不幸的是这没有帮助......另外,我注意到在南瓜​​上点击8-10次后,android浏览器崩溃:(我很确定我错过了有些东西,我不敢相信 KineticJS 不能在任何浏览器上处理 100 个元素...:/
    • 谢谢,mark,我用我们的建议更新了第一个演示链接,虽然它看起来好一点,但运行起来非常缓慢和不稳定:(
    • ...仍然波涛汹涌。好的,试试这个重构代码(1)从它的元素容器中解封装 Kinetic.Image 对象。 (2) 在 Pumpkin 对象之外创建/销毁补间。 (3) 将任何补间的南瓜移动到 tweenLayer,但在补间完成后不将其移回主层来节省处理。下一个优化步骤是通过在 requestAnimationFrame 内缩放而不是使用 Kinetic 的补间来“手动”进行补间)。我这么说是因为 tween.destroy 似乎没有完全回收该 tween 的资源。链接:jsfiddle.net/m1erickson/rCUJe
    • markE,太棒了! :) 现在我在 android 上有 56fps ! :) 只是一侧节点,我不得不放“Shared.GameGrid.draw();”在 moveTo 方法之后,因为旧南瓜仍在显示。我是否正确地假设,每个南瓜都转动了,tweenLayer 变得更大更重来渲染?但是 Shared.GameGrid 会更轻 :) 再次感谢!
    • 很高兴我能帮上忙。是的,tweenLayer 将累积节点,作为交易,主层将拥有更少的节点。祝你的项目好运!
    猜你喜欢
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多