хранение объекта сетки three.js с indexedDB - PullRequest
1 голос
/ 12 ноября 2011

Использование этого урока Я пытаюсь понять, могу ли я сэкономить пропускную способность с помощью большого меша, кэшируя его с помощью 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

I'mне уверен, что это на самом деле означает, но должен быть способ обойти это нет?

1 Ответ

4 голосов
/ 15 ноября 2011

Это означает, что ваш THREE.Mesh object искажен, но не нарушает индексы, уникальность или что-то в этом роде.Я вижу эту ошибку, когда пытаюсь сохранить объекты, которые имеют невыполненные функции, в качестве членов.

Техническое определение от spec :

Данныесохраненный файл не может быть клонирован внутренним алгоритмом структурированного клонирования.

Если вы пытаетесь сохранить состояние объекта пространства имен, которое вы нашли.Если вы храните простые данные, я бы попытался сделать глубокую копию объекта THREE.Mesh (), проверяя typeof на наличие «функции».

РЕДАКТИРОВАТЬ: я изучил это дальше.IndexedDB копирует объекты в хранилище объектов, используя алгоритм структурированного клона HTML5 .Согласно спецификации , объекты Error и Function не могут быть клонированы и выдают DATA_CLONE_ERR.Это то, что вы видите.

...