diff --git a/web/shell/loader.ts b/web/shell/loader.ts index 3a292b4..f3cadcc 100644 --- a/web/shell/loader.ts +++ b/web/shell/loader.ts @@ -34,8 +34,11 @@ class ImageLoader { private populateFiles(files:any, volumeLabel:string) { var grGenerator = new GameResourceGenerator(); for (var name in files) { - var data: ArrayBufferView = new Uint8Array(files[name]); - FS.writeFile(name, data, { encoding: 'binary' }); + var data: ArrayBuffer = files[name]; + // Store contents in the emscripten heap, so that it can be mmap-ed without copying + var ptr = Module.getMemory(data.byteLength); + Module.HEAPU8.set(new Uint8Array(data), ptr); + FS.writeFile(name, Module.HEAPU8.subarray(ptr, ptr + data.byteLength), { encoding: 'binary', canOwn: true }); grGenerator.addFile(name); } FS.writeFile('xsystem35.gr', grGenerator.generate()); diff --git a/web/shell/shell.ts b/web/shell/shell.ts index f9c3487..fe6eaae 100644 --- a/web/shell/shell.ts +++ b/web/shell/shell.ts @@ -12,10 +12,11 @@ declare namespace Module { function setStatus(status: string): void; function monitorRunDependencies(left: number): void; function callMain(): void; + function getMemory(size: number): number; } declare namespace FS { - function writeFile(path: string, data: ArrayBufferView | string, opts?: {encoding?: string; flags?: string}): void; + function writeFile(path: string, data: ArrayBufferView | string, opts?: {encoding?: string; flags?: string; canOwn?: boolean}): void; } namespace xsystem35 {