Эффективно рисовать на холсте из WASMC#

Место общения программистов C#
Ответить
Anonymous
 Эффективно рисовать на холсте из WASM

Сообщение Anonymous »

Я использую новый шаблон проекта .NET 8 «WebAssembly Browser App» (не Blazor), чтобы попытаться создать небольшой игровой движок.
Одна из вещей, которые мне нужно сделать, — это как можно быстрее нарисовать на холсте. Я нашел много вопросов, задающих именно эту тему, но им всем уже несколько лет, и WASM сильно изменился за это время, поэтому я думаю, что многие ответы устарели.
Этот ответ особенно многообещающий, поскольку он подразумевает, что возможно какое-то разделение памяти, чтобы избежать копирования, но по сути он просто указывает на этот проект. Проект очень актуален, поскольку это игровой движок на WASM, но, к сожалению, он построен на Blazor, поэтому, похоже, есть некоторые различия, которые мешают ему работать у меня.
В частности, код для рисования из IntPtr на холст:

Код: Выделить всё

window.PaintCanvas = function PaintCanvas(dataPtr) {
imageData.data.set(Uint8ClampedArray.from(Module.HEAPU8.subarray(dataPtr, dataPtr + imageData.data.length)));
context.putImageData(imageData, 0, 0);
context.drawImage(canvas, 0, 0, canvas.width, canvas.height);
return true;
}
но я получаю сообщение «Uncaught ReferenceError: Модуль не определен», что, как я предполагаю, связано с тем, что Blazor делает что-то для доступа к куче WASM, чего не делает проект приложения WebAssembly Browser App.
Поэтому мои вопросы:
  • Как лучше всего рисовать на холсте как можно быстрее?
  • Если он использует Module.HEAPU8, тогда как мне получить к нему доступ?
РЕДАКТИРОВАТЬ:
ОК, я думаю, что решил проблему Module.HEAPU8 — шаблонный main.js разлагает объект, возвращаемый dotnet.create, но если вы этого не сделаете, вы получите объект с функцией localHeapViewU8
, которая, я думаю, такая же как Module.HEAPU8.
Поэтому я больше не получаю ошибку JS, но она все равно не работает. IntPtr, который я отправляю из C# в JS, поступает как неопределенный, поэтому я думаю, что это проблема, но согласно крайне минимальной документации вы должны иметь возможность отправлять IntPtr.
Я пытался изменить его, чтобы отправлять фрагмент массива вместо закрепленного указателя на массив, но он говорит: «Тип «Slice» не поддерживается взаимодействием JavaScript, сгенерированным исходным кодом. Сгенерированный источник не будет обрабатывать маршалинг параметра 'dataPtr'." и это указывает мне на документацию, в которой говорится, что вы должны иметь возможность отправлять фрагмент...

Подробнее здесь: https://stackoverflow.com/questions/784 ... -from-wasm
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»