Neither one nor Many
Software engineering blog about my projects, geometry, visualization and music.
Motivation for using separate processes for rendering is if you wish to have multiple threads rendering. I do a lot of set blending type, put pixels, set blender type again, more pixels, etc. If I use async() to render multiple images at once these function calls might interfere as race conditions.
Probably a noobish moment, but I never realized the "stack" was this limited. I tried declaring something like
struct structw800h600
{
...
Pixels pixels[800 * 600].
};
message_queue mq (create_only, "pixels",
1, //max message number
sizeof(structw800h600)); //max message size
structw800h600 img;
memset(&img, 0x00, sizeof(structw800h600));
This code caused an exception while constructing the object that declared an instance of the struct on the stack:
Unhandled exception at 0x003E5017 in Starcry.exe: 0xC00000FD: Stack overflow (parameters: 0x00000000, 0x00702000).
Shows break here in chkstk.asm (because I am in debug mode):
[...]
; Find next lower page and probe
cs20:
sub eax, _PAGESIZE_ ; decrease by PAGESIZE
test dword ptr [eax],eax ; probe page. <<<<<<<<<<<<<<<<<<<< here
jmp short cs10
_chkstk endp
end
I did not find out the exact threshold but the the crash occured when the size of the struct was above ~1024972 bytes or ~1000 kB. (Size of each pixel object is 16 byte). If I understand it correctly the stack is only several MB so I was simply storing too much data on it.
Still posting this because I almost jumped to the false conclusion that it was a windows platform shared memory limitation.
Simply allocate the Pixel objects from the free-store and send that through the message queue. Something like:
Pixel *pixels = new Pixel[800 * 600]
;