Форум

как отключить 1 из загруженных canvas

08 мая 2017 12:04
есть прекрасный урок вот тут


где 2 canvas инициализируются по средствам:
b4w.require("canvas1","canvas1").init();
b4w.require("canvas2","canvas2").init();


но мне допустим больше ненужен:
"canvas2"
как мне остановить его работу ? чтобы он отключился, и не грузил лишней информацией страницу ?
08 мая 2017 14:59
Вы хотите отключить его после запуска, или не включать вообще?

Просто, чтобы не включать вообще, для этого нужно исправить исходные коды HTML и не вызывать инициализацию на ненужном канвасе.

А чтобы отключить его после запуска, я не нашёл метода… Самому инетресно. Также как и понять, как работают две сцены одновременно.
08 мая 2017 15:30
Ответ на сообщение пользователя Дмитрий Пелевин
Вы хотите отключить его после запуска, или не включать вообще?

Просто, чтобы не включать вообще, для этого нужно исправить исходные коды HTML и не вызывать инициализацию на ненужном канвасе.

А чтобы отключить его после запуска, я не нашёл метода… Самому инетресно. Также как и понять, как работают две сцены одновременно.


Ага именно последнее отключить после запуска.
Суть в том что мы открыли какой-то 3д контент, покрутили потыкали круто, надоел он нам, мы закрыли его, и открыли другой.

закрыть то ладно я могу удалить элемент из ДОМ дерева, но грузить то он от этого не перестанет. вот мне интересно как отключить .init чтобы не грузить систему
08 мая 2017 18:49
Ответ на сообщение пользователя Gogarian
Ага именно последнее отключить после запуска.
Суть в том что мы открыли какой-то 3д контент, покрутили потыкали круто, надоел он нам, мы закрыли его, и открыли другой.

закрыть то ладно я могу удалить элемент из ДОМ дерева, но грузить то он от этого не перестанет. вот мне интересно как отключить .init чтобы не грузить систему

Короче, почитал я статью, поднял проект, потестировал….
Для выключения работы всей сцены используется метод:
m_data.unload();

Соответственно его нужно вызывать у того модуля DATA, который находится в неймспейсе сцены, которую нужно отключить.

Для примера в тестовых сценах можно добавить его вместо всего кода в функции:
exports.ext_method = function() {
    if(m_scs.get_scenes().length > 0){
        m_data.unload();
    }
}

В этом случае при клике на втором канвасе, первый умрёт.
Но дальше вопрос, как на самом деле контролировать, что сцены уже выгружены.
Я проверяю, что есть сцены, но может это заблуждение…. Можно подключить модуль лоадера, к примеру и проверять шедулер на null… В общем есть много мест, которые можно проверить.

Но по факту это лишь отключает механизмы, с которыми работает движок модулями в определённом неймспейсе. В теории было бы круто ещё удалить все объекты, которые этому неймспейсу принадлежат (сборка мусора, все дела), но в JS это всегда больная тема… Может разработчики чего скажут интересного.

Нашёл ещё доп метод ,благодаря которому можно отлинковать созданный в каком-либо неймспейсе модуль от основного модуля движка b4w:
b4w.cleanup("canvas1","canvas1");


Это позволит сборщику мусора его удалить, если конечно кто-то ещё не ссылается на этот модуль. Но проблема в том, что на этот модуль уже ссылка есть в canvas2:
var m_ext_canv  = b4w.require("canvas1", "canvas1");


В любом случае вопрос открыт и нет единого метода для удаления аппликейшена (в теории это в модуле APP должен быть метод типа terminate()) и всех связанных с ним доп ресурсов.
08 мая 2017 21:05
Но дальше вопрос, как на самом деле контролировать, что сцены уже выгружены.
Я проверяю, что есть сцены, но может это заблуждение…. Можно подключить модуль лоадера, к примеру и проверять шедулер на null… В общем есть много мест, которые можно проверить.

Добрый день.

Да, это было бы полезно. В начале неделе рассмотрим такой вариант для проверки наличия сцен. Спасибо за фидбэк

Но по факту это лишь отключает механизмы, с которыми работает движок модулями в определённом неймспейсе. В теории было бы круто ещё удалить все объекты, которые этому неймспейсу принадлежат (сборка мусора, все дела), но в JS это всегда больная тема… Может разработчики чего скажут интересного.

Вы имеете ввиду unload метод? Он как раз удаляет все ссылки на объекты сцены, отдавая их сборщику мусора. Именно сцены. Namespace имеет отношение к модулям движка
Разработчик Blend4Web
09 мая 2017 15:52
А если у меня они не связанны. у меня есть 6 допустим канвасов. но между собой они не связанны, не как,
мне -
b4w.cleanup("canvas1","canvas1");
поможет ?
10 мая 2017 09:32
поможет ?
Поможет, но данные сначала надо в нём удалить:
m_data.unload();

Но, если не связаны, то лучше делать через IFRAME обычным методом. Оптимальнее будет.
Вы имеете ввиду unload метод? Он как раз удаляет все ссылки на объекты сцены, отдавая их сборщику мусора. Именно сцены. Namespace имеет отношение к модулям движка
Ну не сам unload, его реализация это лишь m_data.cleanup() (глянул в API, оказалось это одна и та же функция….).
Из неё то понятно, что физически дропаются все данные.

А вот с неймспейсом я вас не понял… То что он имеет отношение к модулям движка тоже ясно, но эти модули же создают свой инстанс для каждого неймспейса. И по факту сборщик мусора бы до них добрался, если бы ссылок не было (да, ссылки все стираются при вызове b4w.cleanup(moduleId, namespaceName);)б но при использовании нескольких канвасов на странице весь сок в их взаимодействии (а зачем ещё?). И тогда получается у нас полюбому будут ссылки на удаляемые канвасы (объекты, неймспейсы, как угодно можно назвать) в модулях других сцен….

Но тут конечно нельзя сказать, как правильно на самом деле. Задача не тривиальная и движок не для таких целей спроектирован. Так что кто как хочет так и будет извращаться) Да и по факту объекты весить много не должны, так что это уже паранойя какая-то)
10 мая 2017 18:09
Ответ на сообщение пользователя Дмитрий Пелевин
Поможет, но данные сначала надо в нём удалить:
m_data.unload();

Но, если не связаны, то лучше делать через IFRAME обычным методом. Оптимальнее будет.

Ну не сам unload, его реализация это лишь m_data.cleanup() (глянул в API, оказалось это одна и та же функция….).
Из неё то понятно, что физически дропаются все данные.

А вот с неймспейсом я вас не понял… То что он имеет отношение к модулям движка тоже ясно, но эти модули же создают свой инстанс для каждого неймспейса. И по факту сборщик мусора бы до них добрался, если бы ссылок не было (да, ссылки все стираются при вызове b4w.cleanup(moduleId, namespaceName);)б но при использовании нескольких канвасов на странице весь сок в их взаимодействии (а зачем ещё?). И тогда получается у нас полюбому будут ссылки на удаляемые канвасы (объекты, неймспейсы, как угодно можно назвать) в модулях других сцен….

Но тут конечно нельзя сказать, как правильно на самом деле. Задача не тривиальная и движок не для таких целей спроектирован. Так что кто как хочет так и будет извращаться) Да и по факту объекты весить много не должны, так что это уже паранойя какая-то)


Iframe не как нельзя вообще. :(
подскажите мне плз тогда. вот смотрите у нас есть функция она собераетсся как то там и потом
b4w.require("canvas2","canvas2").init();

как мне тогда снова обратиться к этому модулю после .init чтобы реализовать
m_data.unload();

и потом
b4w.cleanup("canvas2","canvas2");

?

1) то есть примерно так где то когда то уже произашло ( .init )
2) теперь при клике на какой-то элемент на странице вы делаем m_data.unload(); из объекта canvas2
3) и потом b4w.cleanup("canvas2","canvas2")

вот с пунктом 1 и 3 мне все понятно а вот с пунктом 2 нет :( можно мне его как то разжевать или пнуть меня в нужную сторону ?
12 мая 2017 10:14
Ну можно либо в самом (внутри) canvas2 прописать логику, что если произошёл клик по тому то элементу, то я сам себя удаляю.

Либо можно обратиться к нему напрямую, т.к. вызов b4w.require("canvas2","canvas2") возвращает вам объект того самого модуля. Внутри модуля создаете функцию (сейчас там уже есть init() И она же вызывается при создании), например terminate(), в ней прописываете m_data.cleanup() и потом примерно так:
var someModule = b4w.require("canvas2","canvas2");
someModule.init();

$(".button").click(function(){
    someModule.terminate();
    someModule = null;
});


Стоит быть аккуратным и самому контролировать объекты (модули), которые вы уже удалили. Стоит делать на них ссылки = null и постараться не обращаться к ним хаотично из глобального неймспейса (window).
12 мая 2017 11:11
Ответ на сообщение пользователя Дмитрий Пелевин
Ну можно либо в самом (внутри) canvas2 прописать логику, что если произошёл клик по тому то элементу, то я сам себя удаляю.

Либо можно обратиться к нему напрямую, т.к. вызов b4w.require("canvas2","canvas2") возвращает вам объект того самого модуля. Внутри модуля создаете функцию (сейчас там уже есть init() И она же вызывается при создании), например terminate(), в ней прописываете m_data.cleanup() и потом примерно так:
var someModule = b4w.require("canvas2","canvas2");
someModule.init();

$(".button").click(function(){
    someModule.terminate();
    someModule = null;
});


Стоит быть аккуратным и самому контролировать объекты (модули), которые вы уже удалили. Стоит делать на них ссылки = null и постараться не обращаться к ним хаотично из глобального неймспейса (window).


Кажется начинаю понимать получается что то вроде вот так ?
var someModule = b4w.require("canvas2","canvas2");
someModule.terminate = function {
	m_data.unload();
	m_data.cleanup();
}
someModule.init(); // а init еще раз обязательно вызывать ?

$(".button").click(function(){
    someModule.terminate();
    someModule = null;
});


как я понял такую функцию еще можно прописать на моменте создания модуля "b4w.register"
и потом вызвать где угодно в коде ( естественно после "init" ) я верно понимаю ?
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.