使用indexedDB存储three.js网格对象

时间:2011-11-11 20:11:31

标签: javascript three.js indexeddb

利用this tutorial我试图通过使用indexedDB缓存来节省大网格的带宽。

所以在我正在做的加载器回调函数中......

object = new THREE.Mesh( geometry, material );

webkitIndexedDB.open("MyNewDB").onsuccess = function(event) {
  window.db = event.srcElement.result;

  window.db.setVersion("1.0").onsuccess = function(event) {
    var objectStore = window.db.createObjectStore("meshes", { keyPath: "item_id" });

    objectStore.add({item_id: 0, mesh: object});  //  <= this is the crucial line

  };
};

然而,将包含object的对象添加到数据库的最后一行会导致以下错误。

Uncaught Error: DATA_CLONE_ERR: DOM Exception 25

我不确定这是什么意思但是必须有办法解决它吗?

1 个答案:

答案 0 :(得分:4)

这意味着您的THREE.Mesh object格式不正确,但不会违反索引,唯一性或类似内容。当我尝试将具有未执行功能的对象存储为成员时,我看到了这个错误。

the spec的技术定义是:

  

内部结构化无法克隆存储的数据   克隆算法。

如果您正在尝试存储名称空间的对象状态,那么您就会被清除。如果你要存储普通数据,我会尝试对THREE.Mesh()对象进行深度复制,检查typeof是否为'function。'

编辑:我进一步研究了这个问题。 IndexedDB使用HTML5 structured clone algorithm将对象复制到对象库中。根据{{​​3}},无法克隆错误和函数对象并抛出DATA_CLONE_ERR。这就是你所看到的。