1

利用本教程,我试图查看是否可以通过使用 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

我不确定这到底意味着什么,但一定有办法解决它,不是吗?

4

1 回答 1

4

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

规范中的技术定义是:

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

如果您正在尝试存储命名空间的对象状态,那么您将被淹没。如果您要存储纯数据,我会尝试对 THREE.Mesh() 对象进行深层复制,检查typeof“功能”。

编辑:我进一步研究了这一点。IndexedDB 使用 HTML5结构化克隆算法将对象复制到对象存储中。根据规范,不能克隆 Error 和 Function 对象并抛出DATA_CLONE_ERR. 这就是你所看到的。

于 2011-11-15T01:53:30.823 回答