I want to create two applications (Renderers) which will work in sync.
If some functionality is occurred on first render then same should get reflected to another render.
Both the renders will be running on different machines.
One way of doing that is sending events through UDP packets to and fro.
Is there any other way with which two renders can perform in sync without inclusion of UDP ?
Can two renderers be made to work in sync?
If the two renderers would run on the same machine, you could have used Spout to share texture between them. On different machines, though, this is not possible. You’d either have to render - compress - send image data, or indeed use a custom network protocol to synchronize the two renderers.
I did this for a project a while back by having a master app that sent an absolute time value as a double ( as bytes ) via UDP multicast using Asio. I then had multiple renderers listening for this, each with their own TimelineRef instance that would step to this time when it was received. For my purposes this was fine - I didn’t need the renderers to let the master know when all messages were received before continuing, any new message just replaced any old unprocessed messages. I didn’t noticed dropped frames in that project although admittedly the screens had some space between them so were pretty forgiving.
I think NDI ( network device interface ) would be an ideal candidate for your purposes and I doubt that you would get better results with anything hand-rolled on a LAN with stable bandwidth.
I have an initial implementation that wraps the basic functionality into a Cinder block here but the SDK has been updated since then which means that it would need some small tweaking for getting it up and running again. That said I know that @num3ric has been working with it on Windows and I think he has kept it up-to-date with the latest SDK changes. You can find his fork here.
You can see it in action here :
This is sender running on OSX and receiver running on a Linux VM. For some more info you can also check the original post I made for Cinder-NDI here .
Perhaps Most Pixels Ever for cinder :
Do you have any sample examples for Windows? I am confused about the communication happens between multiple machines. Will it be working like master slave application or there is some another architecture behind it?
It’s a port of shiffman’s most pixels ever, originally for processing, so there’s a ton of info on the original project’s github wiki.
I did this once with 21 screens across 7 machines, it wasn’t fun. Good luck!