当使用多个图层时,KineticJS / Canvas会在ipad上造成safari崩溃?

时间:2014-04-01 20:45:47

标签: javascript ipad safari kineticjs

这让我发疯了。如果我在下面运行简单的HTML,它可以在我的IPad2(A1396)上运行,但不能在我的IPad 3(A1416)上运行。每当我将IPad 3从Portrait旋转到Landscape时Safari都会崩溃。我看起来添加的层数与每层的宽度/高度之间存在关系。

<!DOCTYPE HTML>
<html>
  <head>
    <style>
      body {
        margin: 0px;
        padding: 0px;
      }
    </style>
  </head>
  <body>
    <div id="container"></div>
    <script src="http://d3lp1msu2r81bx.cloudfront.net/kjs/js/lib/kinetic-v5.0.2.min.js"></script>
    <script defer="defer">
        var stage = new Kinetic.Stage({
            container: 'container',
            width: 580,
            height: 400
        });
        var NrOfAttribute = 50;
        for (var AttributeNo = 0, NrOfAttribute; AttributeNo < NrOfAttribute; AttributeNo++) {
            var layer = new Kinetic.Layer();

            var rect = new Kinetic.Rect({
                x: 20*AttributeNo,
                y: 20*AttributeNo,
                width: 50,
                height: 10,
                fill: 'green',
                stroke: 'black',
                strokeWidth: 4
            });

            // add the shape to the layer
            layer.add(rect);

            // add the layer to the stage
            stage.add(layer);
        }
    </script>
  </body>
</html>

这是IPad上的错误还是一些内存问题?任何帮助将不胜感激,因为我真的需要这个工作。

谢谢!

编辑:我刚测试用“常规”Canvas做同样的事情,如果我增加层数它也会崩溃(所以它似乎不是特定的动力学)。如果你增加足够的层数,它也会在Ipad2上崩溃。

1 个答案:

答案 0 :(得分:0)

这可能不是您的选择,但是您是否需要为每个Rect分别使用一个图层,或者您可以将它们全部放在同一图层中?我怀疑这有助于减少内存使用量,因为你最终不会得到50个canvas元素。您可以为每个Rect赋予唯一的name,然后仍然可以使用rect = layer.find('.{name}'); # do something with rect

之类的单独操作它们