Thanks jj, I will try this out. On Monday, August 1, 2016 at 5:59:28 PM UTC+8, jj wrote: > > Yeah, the marked line does create a clone of the subarray memory. The only > case where a memory copy is not made is if canOwn was set by caller, which > tells that the write function is allowed to just grab the passed in typed > array as is. If you're trying to optimize out copying, see the call stack > to check if you might be able to get the canOwn field set to true by the > caller, which woud avoid copying. > > 2016-07-12 14:18 GMT+03:00 awt <[email protected] <javascript:>>: > >> jj, >> >> I was looking thru the code and realize that FS_createDataFile will use >> the write method of MEMFS (for my case) to store the data: >> >> write:function (stream, buffer, offset, length, position, canOwn) { >> if (!length) return 0; >> var node = stream.node; >> node.timestamp = Date.now(); >> >> if (buffer.subarray && (!node.contents || >> node.contents.subarray)) { // This write is from a typed array to a typed >> array? >> if (canOwn) { // Can we just reuse the buffer we are given? >> assert(position === 0, 'canOwn must imply no weird position >> inside the file'); >> node.contents = buffer.subarray(offset, offset + length); >> node.usedBytes = length; >> return length; >> } else if (node.usedBytes === 0 && position === 0) { // If >> this is a simple first write to an empty file, do a fast set since we don't >> need to care about old data. >> node.contents = new Uint8Array(buffer.subarray(offset, >> offset + length)); >> node.usedBytes = length; >> return length; >> } else if (position + length <= node.usedBytes) { // Writing >> to an already allocated and used subrange of the file? >> node.contents.set(buffer.subarray(offset, offset + length), >> position); >> return length; >> } >> } >> >> Since the constructor of Uint8Array is taking in another typedarray >> because of the subarray call, am I right to say that we are actually >> copying the buffer into a new Uint8Array which is then assigned to >> node.contents rather than assigning it to the 'backing store of that >> function' like you mentioned previously? Therefore, this is the same as >> cloning the typed array? >> >> On Friday, August 1, 2014 at 3:58:15 PM UTC+8, jj wrote: >>> >>> Make sure that 'data' comes as a typed array and not e.g. a string. The >>> FS_createDataFile will end up in to library_memfs.js write() function. >>> Debug through that one to ensure that the implementation will not clone the >>> typed array, but just assigns that typed array into the backing store of >>> that function. In that case, the flow should be pretty much as efficient as >>> possible via the filesystem. >>> >>> Note that one shortcoming is that using fread() etc. will cause a jump >>> out of asm.js every time it is called. Therefore fread()ing small amounts >>> of bytes at a time can be slow. Either make sure you have a large reads, or >>> perhaps give a shot at mmap() which will memcpy the typed array into the >>> asm.js HEAP. >>> >>> The most non-intervening route is to allocate/_malloc the memory space >>> in the HEAP, and place the XHR data into the allocated space in HEAP, and >>> then pass a pointer to C code. That gives you a direct C memory access to >>> the data, that you can free() afterwards. This is pretty much what the >>> existing Emscripten wget functions already do. >>> >>> >>> 2014-08-01 6:09 GMT+03:00 caiiiycuk <[email protected]>: >>> >>>> Hi. I have 3d engine that compiled with emscripten. This engine take >>>> models from binary data and then render it. Render cycle looks like: >>>> >>>> loadModels(uint8_t* data, size_t len); >>>> eachFrame -> render(); >>>> >>>> I want to query data from web server. What is the best way to pass >>>> binary data to c++ code. For now i use FS api for that. It is look like: >>>> >>>> $.ajax({ >>>> url: "/raw/" + left + "/" + top + "/" + right + "/" + >>>> bottom, >>>> type: 'GET', >>>> beforeSend: function (xhr) { >>>> xhr.overrideMimeType("text/plain; >>>> charset=x-user-defined"); >>>> }, >>>> success: function( data ) { >>>> Module['FS_createDataFile']("/tmp", "memfile", data, >>>> true, true); >>>> Module.ccall('readModels', 'void', ['string'], >>>> ["/tmp/memfile"]); >>>> } >>>> }); >>>> >>>> readModels(const char* file) { >>>> FILE *file = fopen(filePath, "rb"); >>>> //... do parse stuff >>>> fclose(file); >>>> remove(filePath); >>>> } >>>> >>>> It this method effective? >>>> >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "emscripten-discuss" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to [email protected]. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> -- >> You received this message because you are subscribed to the Google Groups >> "emscripten-discuss" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected] <javascript:>. >> For more options, visit https://groups.google.com/d/optout. >> > >
-- You received this message because you are subscribed to the Google Groups "emscripten-discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
