Задать вопрос
Пользователь пока ничего не рассказал о себе

Наибольший вклад в теги

Все теги (14)

Лучшие ответы пользователя

Все ответы (31)
  • Как получить буфер линейной памяти wasm модуля из WebWorker без его копирования?

    @desocrew
    Действительно, вы не можете передать ArrayBuffer, который используется внутри WebAssembly, через postMessage() с опцией transfer. Это происходит потому, что в этом случае браузер пытается оторвать буфер от исходного контекста и присоединить его к новому контексту (в данном случае, от worker'а к основному потоку). Однако ArrayBuffer, связанный с памятью, используемой внутри WebAssembly, не может быть оторван и перенесен в другой контекст.

    Есть несколько вариантов, как можно передать данные между основным потоком и worker'ом без копирования.

    1. Использовать SharedArrayBuffer вместо ArrayBuffer. Однако, как вы уже заметили, у SharedArrayBuffer есть ограничения на использование в некоторых браузерах. Кроме того, не все платформы поддерживают SharedArrayBuffer (например, некоторые мобильные устройства iOS). Чтобы использовать SharedArrayBuffer в вашем случае, вы можете создать его в основном потоке и передать его в worker через postMessage(). Затем вы можете использовать этот SharedArrayBuffer внутри вашего WebAssembly модуля.

    2. Вы можете использовать Transferable Objects для передачи данных без копирования. В вашем случае, если память внутри WebAssembly модуля уже инициализирована, вы можете передать указатель на начало памяти через Transferable Objects. Например:

    Основной поток:
    const mem = instance.exports.memory.buffer;
    const ptr = instance.exports.getPixelDataPtr();
    worker.postMessage({mem, ptr}, [mem]);

    Web Worker:
    self.onmessage = (event) => {
      const {mem, ptr} = event.data;
      const pixels = new Uint8Array(mem, ptr, numPixels * 4);
      // делаем что-то с пикселями
    }

    В этом случае, вы передаете указатель на начало памяти вместе с буфером, но не копируете саму память. Вы можете использовать TypedArray для доступа к данным в памяти. Обратите внимание, что в вашем WebAssembly модуле должна быть функция, которая возвращает указатель на начало памяти, который вы можете передать в worker.

    Однако, если вы измените данные в памяти на стороне worker'а, эти изменения не будут отражены в памяти, используемой внутри WebAssembly модуля.
    Ответ написан
    1 комментарий
  • Как правильно разделить assets в сборке?

    @desocrew
    Чтобы избежать копирования контентных изображений и статических файлов в dist, вы можете добавить правила исключения для этих файлов в ваш файл конфигурации Vite. Для этого можно использовать опцию exclude в секции build вашего файла конфигурации.

    Вот пример кода, который позволит вам исключить все контентные изображения и статические файлы из вашей сборки Vite:
    import { defineConfig } from 'vituum';
    import nunjucks from '@vituum/nunjucks';
    
    export default defineConfig({
      integrations: [nunjucks()],
      templates: {
        format: 'njk',
      },
    
      filenamePattern: {
        '+.css': false,
        '+.scss': 'src/styles',
      },
    
      vite: {
        build: {
          rollupOptions: {
            output: {
              assetFileNames: (assetInfo) => {
                let extType = assetInfo.name.split('.').at(1);
                if (/png|jpe?g|svg|gif|tiff|bmp|ico/i.test(extType)) {
                  console.log(assetInfo)
                  extType = 'img';
                }
                return `assets/${extType}/[name][extname]`;
              },
              chunkFileNames: 'assets/js/[name].js',
              entryFileNames: 'assets/js/[name].js',
            },
          },
          // исключение контентных изображений и статических файлов
          exclude: [
            '**/*.{png,jpg,jpeg,gif,svg,bmp,tiff,ico}',
            '**/*.{txt,json,html,css,js,map}',
          ],
        },
      },
    });


    Здесь мы использовали exclude для указания путей к файлам, которые мы хотим исключить из сборки. Вы можете изменять эти пути, чтобы подстроить их под свои нужды.
    Ответ написан
    1 комментарий
  • Почему не верно работают LODы?

    @desocrew
    Возможно, причина в разнице между режимами рендеринга в редакторе и в билде. Например, в редакторе может быть установлен режим рендеринга в Perspective, а в билде - в Orthographic.

    Perspective режим использует перспективную проекцию, где объекты, находящиеся дальше от камеры, кажутся меньше, чем ближе расположенные объекты. Orthographic режим использует ортографическую проекцию, где все объекты отображаются одинакового размера, независимо от расстояния до камеры.

    Если в вашем случае режим рендеринга в билде изменился на Orthographic, это может объяснить, почему LOD'ы стали прогружаться ближе, чем в редакторе.

    Чтобы исправить эту проблему, необходимо убедиться, что режим рендеринга в билде совпадает с режимом рендеринга в редакторе. Если режимы рендеринга совпадают, то необходимо проверить, нет ли других настроек, которые могут влиять на расстояние прорисовки LOD'ов.

    Также возможно, что проблема связана с настройками камеры, такими как угол обзора и дистанция от камеры до объектов. Проверьте настройки камеры и убедитесь, что они правильно настроены для вашей сцены.
    Ответ написан
    Комментировать
  • Название хука, для вставки HTML между двумя контейнерами?

    @desocrew
    var area = document.querySelector(".content-area");
    area.innerHTML = "<html код>" + area.innerHTML
    Ответ написан
    Комментировать