Как очистить и выгрузить холст Unity WebGL при смене страницы

У меня проблема в моем веб-приложении, когда я меняю текущую страницу после загрузки и запуска игры Unity WebGL.

На самом деле я точно знаю, что игра запущена, потому что я постоянно слышу звуки, когда мой игрок умирает.

Есть ли способ удалить весь контекст при изменении веб-страницы? Может ли это быть своего рода утечкой памяти?

Редактировать 1: Мое веб-приложение выполнено с помощью AngularJS/Material


person MadJlzz    schedule 20.04.2016    source источник
comment
Это ошибка Unity точно. Однако вы можете создать сценарий браузера, чтобы принудительно выгрузить все, что загружено.   -  person Nika Kasradze    schedule 20.04.2016
comment
Дело в том, что я толком не знаю, что загружает Unity. Как мне это сделать, не выгружая собственные скрипты?   -  person MadJlzz    schedule 20.04.2016
comment
Есть около 5-10 файлов, сгенерированных Unity, выгрузите их все (YourBuildName.data, YourBuildName.html.mem, YourBuildName.js и т. д.). Изменить: я думаю, что они находятся в папке Release или Debug в зависимости от сборки.   -  person Nika Kasradze    schedule 20.04.2016
comment
Что вы имеете в виду под их разгрузкой? В файле index.html я ясно вижу, что скрипт единства загружает файлы, но у меня нет доступа, чтобы сообщить Unity о выгрузке этих файлов.   -  person MadJlzz    schedule 20.04.2016
comment
@NikaKasradze: у javascript нет прямого способа удалить нетривиальные ресурсы. Когда что-то загружено, оно обычно остается таким.   -  person Krzysztof Bociurko    schedule 21.04.2016
comment
блин, я просто педантичен в javascript   -  person Nika Kasradze    schedule 21.04.2016


Ответы (2)


Решение простое: загрузите Unity WebGL в iframe, это изолирует приложение.

Когда вы закончите работу с приложением единства, просто удалите узел iframe, например:

var iframe=...;
iframe.parentNode.removeChild(iframe);

И он, и все его ресурсы должны быть моментально выгружены.

Вы не можете общаться с проигрывателем Unity напрямую, когда вы находитесь в iframe, но вы по-прежнему можете передавать сообщения в него и из него с помощью postMessage.

person Krzysztof Bociurko    schedule 21.04.2016
comment
Спасибо за ответ. Ваше решение выглядит довольно красиво и взаимозаменяемо, но как только я помещаю свой Unity WebGL в iframe, он даже не ищет ресурсы для загрузки... - person MadJlzz; 22.04.2016
comment
Такого быть не должно, можно подробнее? Журналы консоли веб-разработки, онлайн-демонстрация с проблемой и т. Д.? - person Krzysztof Bociurko; 22.04.2016
comment
Ну, я отвечаю быстро. На самом деле, с необработанными index.html, которые Unity генерирует при сборке игры, она работает (и данные выгружаются без каких-либо действий). Дело в том, что я пытался передать значения AngularJS напрямую через iframe. Я думаю, что у меня нет другого решения использовать метод GET старой школы. Или можно использовать postMessage для передачи данных AngularJS? - person MadJlzz; 22.04.2016
comment
Это должно быть возможно, но если вы планируете передавать эти данные только при инициализации, лучше всего использовать хэш-часть URL-адреса (часть после # char, например: http://example.com/path?search#hash). Таким образом, он даже не будет отправлен на сервер, оставаясь при этом доступным в JavaScript с помощью location.hash. - person Krzysztof Bociurko; 22.04.2016
comment
Господи спасибо за помощь. Вы мне очень помогли! Для меня это нормально, но если вы считаете, что мне нужно что-то прояснить для других, пожалуйста, скажите мне, прежде чем я приму ваш ответ :) - person MadJlzz; 22.04.2016
comment
Не уверен, что вы имеете в виду, разъяснение части postMessage? - person Krzysztof Bociurko; 22.04.2016
comment
Я не хочу использовать iframe, есть ли другое доступное решение? - person Muhammad Faizan Khan; 28.02.2019
comment
@MuhammadFaizanKhan, этой проблеме уже 3 года, но с тех пор я не видел другого способа сделать это. Может быть, посмотрите на Emscripten (это то, что Unity использует для сборки в браузере) — возможно, сейчас есть лучший способ. Некоторые подробности о что делает unity при загрузке может быть хорошим началом. Но почему не iframe? - person Krzysztof Bociurko; 28.02.2019
comment
На самом деле я не знаю, будет ли вторая команда использовать его (iframe) или нет, и вторая причина в том, что я не знаю, как проверить, что его ресурсы должны быть мгновенно выгружены - person Muhammad Faizan Khan; 28.02.2019
comment
Вам не нужно использовать postMessage, если iframe из того же домена. Вы можете напрямую вызывать функции в iframe window.frames[0].window.functionInIframe, а также искать и напрямую управлять DOM iframe window.frames[0].document.querySelector('body').style.background = 'red'; Если они из разных доменов, вы получите сообщение об ошибке. - person gman; 28.02.2019

Unity 2019.1 предоставил правильный способ выйти из webgl и освободить память (хотя в моем тестировании это не удалось, может быть, я ошибаюсь, пожалуйста, дайте мне знать, это действительно работает или нет):

  • С#: вызов Application.Quit()
  • JS: вызов unityInstance.Quit (обратный вызов)

Вы можете использовать версию JS, как это

unityInstance.Quit(function() {
    console.log("done!");
});

Для получения дополнительной информации см. Выход и очистка памяти

person Muhammad Faizan Khan    schedule 18.03.2019