То есть вам не нравится эта часть?
var data = new Uint8Array(dataLength);
for (var i = 0; i < dataLength; i++) {
data[i]=HEAPU8[dataPointer+i];
}
var blob = new Blob([data], {type: 'application/octet-stream'});
Вы можете сделать ее однострочной:
var blob = new Blob([HEAPU8.subarray(dataPointer, dataPointer + dataLength)], {type: 'application/octet-stream'});
// or this
var blob = new Blob([new Uint8Array(HEAPU8.buffer, dataPointer, dataLength)], {type: 'application/octet-stream'});
Они оба должны быть намного быстрее, чем ваш исходный код, и оба они должны иметь одинаковую производительность. Это потому, что они создают новый Blob
непосредственно из HEAPU8
без создания дублированного массива, как ваш исходный код.
HEAPU8
является Uint8Array
, одним из семейства TypedArray. Одна действительно важная вещь в TypedArray - это то, что это на самом деле не буфер / данные, а скорее «представление» базового объекта ArrayBuffer (это HEAPU8.buffer
), который содержит фактические данные. См. ArrayBufferView
.
Итак, HEAPU8
предоставляет интерфейс для HEAPU8.buffer
объекта ArrayBuffer, в частности WebAssembly.Memory.buffer
в Emscripten, чтобы выглядеть как массив uint8_t , Emscripten также предоставляет HEAPU16, HEAPU32, HEAPF32 и др. c, но у них один и тот же ArrayBuffer с разными представлениями.
Что .subarray(start, end)
и new Uint8Array(buffer, offset, size)
делают для создания нового "представления" ArrayBuffer объект с указанным диапазоном, не копировать буфер. Таким образом, вы получите минимальный штраф за производительность.