сохранение three.js сетчатый объект с помощью IndexedDB

#javascript #three.js #indexeddb

#javascript #three.js #indexeddb

Вопрос:

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

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

Техническое определение из спецификации является:

Хранимые данные не могут быть клонированы внутренним алгоритмом структурированного клонирования.

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

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