【问题标题】:Three js children length三个js子长度
【发布时间】:2016-10-24 06:03:41
【问题描述】:

我创建了一个三个 js 对象并添加了一些子对象。然后我将孩子的长度更改为 0。然后对象已经离开屏幕。这会使对象完全从屏幕和内存中删除吗?

var balls = new THREE.Object3D();  // parent

用于创建儿童

var geometry = new THREE.SphereGeometry(5, 32, 32);
var material = new THREE.MeshPhongMaterial({color: 0x0f0ff0, shininess: 50, transparent: true, opacity: 1});
var sphere = new THREE.Mesh(geometry, material);
sphere.position.x = scale('some random value');
sphere.position.y = scale('some random value');
balls.add(sphere);

对更多球体重复上述步骤

然后在控制台中我写了

balls.children = [];

这会从场景中移除所有球体。这是否也会从内存中删除所有球体对象??

【问题讨论】:

  • stackoverflow.com/a/8467563/3264799 你做得“正确”,因为你希望它被垃圾收集。但是,Three.js 方式是通过 scene.remove( child ) 方法从场景中删除每个元素。按照 Three.js 想要的方式进行操作是一个很好的做法,因为它无论如何都负责创建和控制元素。有时,如果库中有一些包含有关内容信息的私有变量,它们可能会感到困惑,但随后这些内容会被突然删除,从而破坏系统。

标签: javascript three.js


【解决方案1】:

是的,当您有一个数组然后设置array.length = 0; 时,该数组的所有元素都将被删除。当您键入array.length = 2 时,除了前两个元素之外的所有元素都将被删除。 Javascript 有一个名为 slice() 的函数,它做类似的事情。

【讨论】:

    【解决方案2】:

    删除子的正确方法是从其父调用remove(child),然后对子的材质和几何体使用dispose()。

    在您的代码中:

    var balls = new THREE.Object3D();  // parent
    
    var geometry = new THREE.SphereGeometry(5, 32, 32);
    var material = new THREE.MeshPhongMaterial({color: 0x0f0ff0, shininess: 50, transparent: true, opacity: 1});
    var sphere = new THREE.Mesh(geometry, material);
    sphere.position.x = scale('some random value');
    sphere.position.y = scale('some random value');
    balls.add(sphere);
    
    // Do some work
    
    balls.remove(sphere);
    geometry.dispose();
    material.dispose();
    

    仅在不再被其他 Mesh 使用时才处理材质/几何体。

    来自THREE.Object3D at remove(object, ...)

    “将对象作为该对象的子对象移除。可以移除任意数量的对象。”

    来自THREE.Geometry at dispose()

    “删除几何时不要忘记调用此方法,因为它会导致内存泄漏。”

    来自THREE.Material at dispose()

    “这会处理材质。材质的纹理不会被处理。这些需要由纹理处理。”

    如果你使用textures,你也必须处理这些。

    (三个.js r85)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      • 2015-03-16
      • 2019-05-15
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多