【问题标题】:THREE.js freezes after I splice 3dObject from array从数组拼接 3dObject 后,THREE.js 冻结
【发布时间】:2019-04-23 07:28:54
【问题描述】:

我正在创建一个在线实时游戏。我所有的玩家和他们的动画混合器都存储在数组中。一切正常,直到玩家离开游戏。当他们离开时,我尝试从播放器数组中拼接它们,但每次我这样做时,程序都会冻结。

var indexer = i;
scene.remove(players[indexer]);
players[indexer].geometry.dispose();
players[indexer].material.dispose();
players.splice(indexer, 1);
interval.splice(indexer, 1);
mixers.splice(indexer, 1);
anim.splice(indexer, 1);
ids.splice(indexer, 1);

当我尝试拼接这些数组时出了什么问题?

【问题讨论】:

  • 你什么时候拼接?它是否处于某种迭代的中间?
  • 您遇到了什么错误?请提供一个可重现的例子。
  • 到第一条评论,它在for循环的中间,
  • 对于第二条评论,我没有收到任何错误,我只是冻结了

标签: javascript arrays three.js


【解决方案1】:

最终你不能在 for 循环中间的数组中拼接 3dObjects 和 three.js。因此,我创建了一个函数,并使用window.setTimeout() 调用该函数。现在一切都运行良好。

window.setTimeout(RemovePlayer, 10, i);

function RemovePlayer(indexer){
    scene.remove(players[indexer]);
    players[indexer].geometry.dispose();
    players[indexer].geometry = null;
    players[indexer].material.dispose();
    players[indexer].material = null;
    players[indexer].dispose();
    players[indexer] = null;
    players.splice(indexer, 1);
    interval.splice(indexer, 1);
    mixers.splice(indexer, 1);
    anim.splice(indexer, 1);
    ids.splice(indexer, 1);
}

【讨论】:

  • 这与 THREE.js 无关。在迭代数组时修改数组总是很棘手,必须经过深思熟虑。可能发生的情况是您将 null 传递给 scene.remove 或其他东西,因为您的迭代逻辑被破坏了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 2018-11-16
  • 2011-03-19
  • 2015-05-18
  • 1970-01-01
  • 2018-09-09
相关资源
最近更新 更多