Задать вопрос
@pshevnin

Почему не освобождается куча при уничтожении Unitywebgl приложения?

Добрый день, я пишу небольшой сайт на sveltekit, на котором использую три UnityWebgl приложения, которые можно открыть и переключать в одном компоненте. Приложения корректно загружаются и переключаются, но при каждом новом открытом UnityWebgl приложении, растет потребление RAM вкладкой с сайтом (страницу при этом я не перезагружаю, очень хотелось бы этого избежать). На скрине пример того, как я инициализирую, потом уничтожаю несколько раз один и тот же UnitywebGl объект: 67bca6b3ab832422997588.png

Итого, получается, что после нескольких переключений объектов приложение падает с ошибкой нехватки памяти. Сами по себе приложения памяти потребляют в разумных пределах, проблема исключительно в том, что после уничтожения (куча?) не освобождается, а в следующий раз снова аллоцируется. Вот моя функция по уничтожению Unitywebgl компонента
xport async function destroyUnityInstance() {
    if (!unityInstance) return;

    try {
      await unityInstance.Quit();
      unityInstance = null;

      if (canvas) {
        let gl = canvas.getContext("webgl2") || canvas.getContext("webgl");
        if (gl) {
          let ext = gl.getExtension("WEBGL_lose_context");
          if (ext) {
            ext.loseContext();
          }
        }
      }

      if (canvas && canvas.parentNode) {
        console.error("Canvas was removed!");
        canvas.parentNode.removeChild(canvas);
        canvas = null;
      }

      if (canvas && canvas.style) {
        canvas.style.display = "none";
      }

      if (script) {
        script.src = "";
        document.head.removeChild(script);
        script = null;
      }
    } catch (error) {
      console.error("Error quitting Unity instance:", error);
    }
  }

Судя по логам всё уничтожается успешно и проблем кроме этой нет. Читал документацию Unity но не нашел конкретно своего примера
p.s. Я использую обычный canvas:
<div id="unity-container" class="unity-desktop">
 {#if isAnimationHidden === false}
  <PointerAnimation />
 {/if}
 <canvas id="unity-canvas" on:click={hideAnimation}></canvas>
</div>
а не iframe, хотелось бы избежать использования iframe
  • Вопрос задан
  • 18 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
sfi0zy
@sfi0zy
Creative frontend developer
Сколько существует Unity WebGL, столько же люди жалуются на работу сборщика мусора. Это древнее зло, которое завязано на потоки, которых нет в JS в браузере, и в текущих алгоритмах его работы и связях с браузерными сборщиками мусора черт ногу сломит. Он то работает, то не работает, то в одних браузерах работает, а в других не работает, а потом наоборот. Есть обсуждение проблемы с Quit(), похожей на вашу, и оно пришло к тому, что разработчики Unity просто решили забить, потому что эта проблема у них не в приоритете. В вашем случае будет разумно не полагаться на механизмы работы с памятью со стороны Unity, а подумать, как можно все изолировать чисто фронтендерскими инструментами. Это будет надежнее в долгосрочной перспективе. Вариант с iframe вполне себе рабочий.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы