Принудительно Pixi.js WebGL всегда использовать новый холст для устранения ошибки, появляющейся после перезагрузки страницы без очистки кэша браузера

#javascript #html #html5-canvas #pixi.js

#javascript #HTML #html5-холст #pixi.js

Вопрос:

Мой Pixi.js «игра» рисуется нормально и работает очень хорошо, когда веб-страница (см. временную ссылку в разделе Комментариев) загружается с первого раза ИЛИ на новой странице просмотра Chrome / Incognito. Однако всегда при перезагрузке страницы на холсте (webgl) появляется ошибка рисования.

Эта проблема не появляется, если я оставляю параметр Chrome ОТКЛЮЧИТЬ КЭШ включенным в Chrome Developer Tools, поэтому он должен быть связан с кешем. Кэш Canvas необходимо очистить, чтобы холст снова отображался правильно.

Я должен предположить, что на клиенте остается некоторое кэшированное содержимое (webgl) между повторными посещениями / перезагрузкой страницы, которое вызывает эту ошибку рисования на холсте. Даже нажатие Shift reload приводит к повторному появлению ошибки повторного рисования.

О Pixi WebGL Canvas, я пытаюсь каждый раз создавать новый холст в качестве исправления, но, похоже, это не помогает, новый упоминается так, но Pixi всегда создает свой собственный холст

   r.app = new l.Application({
            backgroundColor: 16777215,
            height: 620,
            width: 1100, clearBeforeRender: true, view :  document.getElementById("canv"amp;location.search.split('v=')[1])
        })
    },
  

Я предпочитаю каким-то образом принудительно очищать кэш canvas, помогает ли это всегда использовать новое имя canvas или указывать некоторые параметры canvas?

Другим вариантом было бы вообще не использовать режим WebGL. Как я могу заставить PixiJS никогда не использовать WebGL?

Комментарии:

1. Я думаю, нам нужно больше информации. Учитывая, что большинство страниц, созданных с Pixi.js работайте просто отлично, что вы делаете по-другому? Не зная этого, как мы можем помочь? Можете ли вы попытаться сделать минимальное репо и поместить его в сам вопрос через фрагмент

2. к сожалению, просто ссылка на ваш код вне сайта не по теме для stack overflow. Вы должны поместить достаточно кода в сам вопрос , чтобы воспроизвести проблему.

3. Ну, проблема в том, что я не знаю, какая часть кода 32K вызывала проблему, возможно, мне нужно перефразировать свой вопрос примерно так: как заставить Pixi всегда сбрасывать холст…

4. Это один из основных моментов создания минимальной версии. извлеките все части. Начните добавлять части обратно, пока не исправите проблему. Вы либо обнаружите проблему самостоятельно, либо у вас будет минимальная версия для совместного использования. Можете ли вы нарисовать одну текстуру и исправить проблему? Если нет, если у вас есть 2 текстуры, исправляет ли это проблему? И т.д., добавляйте функции, пока не получите минимальную версию.

5. Спасибо gman, один вопрос; Можно ли решить всю проблему, отключив WebGL в настройках PIXI? Есть ли у canvas2d такое кэширование спрайтов вообще? Все, что нужно, это избавиться от нескольких элементов, оставшихся на холсте после перезагрузки страницы.

Ответ №1:

Можете ли вы, пожалуйста, попробовать это сначала?

 <meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />
  

Если это не сработает, вот мой другой вопрос.

Вы запускали сервер на своем локальном сервере? Или же вы работали со статическими HTML-файлами? Если вы работаете с каким-либо сервером, вам нужно следовать приведенной ниже инструкции в соответствии с типом сервера.

  • [ http://cristian.sulea.net/blog/disable-browser-caching-with-meta-html-tags / ]

Комментарии:

1. Извините, это не помогло.

Ответ №2:

ну, TextureCache создается каждый раз, когда вы вызываете новый PIXI.Texture.FromImage и проверяет, сохранен ли он (или базовая структура) в кэше, чтобы предотвратить повторную загрузку текстуры …. с вашего сервера, если он уже загружен.

Представьте, что вы создаете эффект дождя и готовите капли дождя в цикле for с i <= 200; Без кэша текстур это означало бы, что вам придется вызывать свой сервер 200 раз. кэш текстур создается из двух элементов.

TextureCache и baseTexture. (Под каждой кэшированной текстурой есть базовая текстура, если вы удалите TextureCache, вызвав .destroy() это удалит текстуру, но оставит базовую текстуру в вашей памяти. Практически это означает, что если у вас есть спрайт на сцене, и вы вызываете destroy() для текстуры. Спрайт, загруженный на сцену, все равно будет доступен для визуализации. Но после этого, если вы вызовете ту же (ранее удаленную текстуру), она повторно загрузит ее с сервера.

Использование метода destroy(true) для текстуры удаляет TextureCache и baseTexture. Практически, если вы будете использовать этот метод с аргументом true для текстуры, используемой спрайтом, который находится на вашей сцене, спрайт станет черным. Базовые текстуры широко используются в контексте WebGL для ускорения вычислений с использованием методов gl.

https://github.com/GoodBoyDigital/pixi.js/issues/949#issuecomment-54502749

Комментарии:

1. Спасибо, да, есть спрайты, но нет существ, загружаемых с сервера, это просто очень простые текстовые шрифты и несколько цветов. Есть ли способ удалить все кэшированные спрайты в начале перезагрузки страницы?