Eines der Dinge, die ich tun muss, ist, so schnell wie möglich auf eine Leinwand zu malen. Ich habe viele Fragen zu diesem speziellen Thema gefunden, aber sie sind alle ein paar Jahre alt und WASM hat sich in dieser Zeit stark verändert, daher denke ich, dass viele Antworten veraltet sind.
Diese Antwort ist insbesondere vielversprechend, weil sie impliziert, dass eine Art Speicherfreigabe möglich ist, um Kopien zu vermeiden, aber sie verweist im Grunde nur auf dieses Projekt. Das Projekt ist sehr relevant, da es sich um eine Spiel-Engine in WASM handelt, aber leider basiert es auf Blazor, sodass es anscheinend einige Unterschiede gibt, die verhindern, dass es für mich funktioniert.
Der Code zum Malen von einem IntPtr auf eine Leinwand lautet insbesondere
Code: Select all
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;
}
Meine Fragen lauten also:
- Was ist der beste Weg, um so schnell wie möglich auf die Leinwand zu malen?
- Wenn es verwendet wird Module.HEAPU8, wie greife ich dann darauf zu?
OK, ich denke, ich habe das Module.HEAPU8-Problem gelöst – die gescaffoldte main.js zerlegt das von dotnet.create zurückgegebene Objekt, aber wenn Sie das nicht tun, erhalten Sie ein Objekt mit einer localHeapViewU8-Funktion
was meiner Meinung nach dasselbe ist als Module.HEAPU8.
Ich bekomme also keinen JS-Fehler mehr, aber es funktioniert auch immer noch nicht. Der IntPtr, den ich von C# an JS sende, kommt als undefiniert an, also denke ich, dass das das Problem ist, aber laut der äußerst minimalen Dokumentation sollten Sie in der Lage sein, einen IntPtr zu senden.
Ich habe versucht, ihn so zu ändern, dass ein Slice des Arrays anstelle eines angehefteten Zeigers auf das Array gesendet wird, aber es heißt: „Der Typ ‚Slice‘ wird von der von der Quelle generierten JavaScript-Interop nicht unterstützt. Die generierte Quelle wird das Marshalling des Parameters ‚dataPtr‘ nicht verarbeiten.“ und es verweist mich auf die Dokumentation, die besagt, dass Sie in der Lage sein sollten, ein Slice zu senden...
Mobile version