On 9 November 2016 at 02:09, Dimitris Chloupis <kilon.al...@gmail.com>
wrote:

> I have only played with c structs and it looks like they do the job fine .
> If json parsing is slow especially in Pharo then it's out of the question.
> Parsing must be kept close to zero because I will be running some very
> tight loops of 100 frames per second and there is no way that I will let
> Pharo take its time as the whole idea of using the fastest way to IPC was
> to keep Pharo in sync with unreal . Heavy lifting will be done only by
> Unreal. Pharo will be used just for logic.
>
> Well, it depends what you want: if you want to give away a
complete/general solution for IPC with Pharo via shared memory, then you
should create some kind of library (both C++ and Pharo) which would allow
users to setup the bridge configuration in the way they want, leaving the
application-specific exchange to the hands of users.. And if you just want
to make own data exchange for own purpose, then you are basically done.


> In any case there is a ton of testing and profiling needed to be done . So
> these are just the first steps.
> On Wed, 9 Nov 2016 at 02:58, Igor Stasenko <siguc...@gmail.com> wrote:
>
>> JSON? -- But you were talking about speed. Once you put JSON as a base
>> for IPC, then say goodbye to speed.
>>
>> Because JSON parsing/writing will eat like 90% of time even if you would
>> use sockets.
>> So, why not using some kind of binary protocol?
>> Unless you wanna use JSON for initial handshaking exchange. Then it is
>> quite reasonable.
>>
>> But all of that still won't free you from inventing some kind of
>> contract(s) which would allow parties to agree who writes where and/or who
>> writes, while other waits then reads etc.
>>
>>
>> On 9 November 2016 at 00:06, Dimitris Chloupis <kilon.al...@gmail.com>
>> wrote:
>>
>>
>> *https://youtu.be/pI4PR3XaX6Q <https://youtu.be/pI4PR3XaX6Q>*
>>
>> *What is it ?*
>>
>> CPPBridge is a library that allows Pharo to share memory with any C/C++
>> application. Opening the door not only to IPC and data sharing but also
>> even complete control of C++ code from Pharo and vice versa.
>>
>> *How to install ?*
>>
>> In a few hours it should be available from Package Browser, if not you
>> can always fetch it with Metacello from here because it comes with a
>> Baseline
>>
>> https://github.com/kilon/CPPBridge
>>
>> *Why bother making such a library ? *
>>
>> In my saga to find a way to use Pharo as a scripting language for Unreal
>> Game Engine, I had two options
>>
>> a) Build Unreal as a Library and use Pharo UFFI to launch and control it
>> b) Embed Pharo inside the Unreal Executable (this is what every other
>> scripting language uses for controlling Unreal)
>>
>> Option (a) was a no go, because Unreal is huge , complex and uses its own
>> custom made build tools, making a DLL for Pharo or an army of DLLs  out of
>> the question
>>
>> Option (b) Embeding Pharo inside an executable is impossible and
>> implementing it also insanely complex
>>
>> Naturally my mind went first into sockets which is what I use to make
>> Pharo able to use Python libraries. However sockets have proven too slow
>> for the insanely fast loops of Unreal.
>>
>> *What are the advantages ?*
>>
>> 1) *No need to move data around.* Sharing memory means you don't have to
>> move data around, you can use directly the shared memory
>>
>> 2)* Extend the Pharo image beyond Pharo.* Shared memory is mapped into a
>> file means that you can do with C++ what you can do with Pharo image, save
>> the live state directly to a binary file. That means we no longer need to
>> worry about sessions and reinitializing C/C++ data since memory mapped file
>> acts as an extension of the Pharo image.
>>
>> 3) *Blazing fast. *Memory mapping is a function that comes directly from
>> the OS kernel and as such it has to be extremely fast. Memory mapping is
>> also what is used for dynamically linked shared libraries an extremely
>> important feature for any application including Pharo that heavily depends
>> on (see Cairo for Athens). So its a very mature , well tested method.
>>
>> 4) *No extra libraries needed* to be installed, CPPBridge uses OS
>> libraries to work out of the box
>>
>> 5) *Low level handling of memory.* Direct access to memory you can even
>> manipulate the memory byte by byte
>>
>> 6)* Memory efficient.* Memory mapping excels at large data, the bigger
>> the better. Can take full advantage of your entire free memory and not
>> waste a byte.  That means also that can be used to optimise Pharo memory,
>> since you could compress your Pharo objects to bytes and mapped file will
>> store the live state.
>>
>> 7) *Tons of Languages. *Because memory mapping is a core functionality
>> for every OS out there, pretty much every programming language supports it.
>> CPPBridge currently supports only C/C++ but all languages can be supported
>> giving access to Pharo to any library for any programming language. Sky is
>> the limit
>>
>> 8) *Self Documented. *CPPBridge is small, simple and with large class
>> comment and comments for every method. YouTube video tutorial also
>> available and linked on top.
>>
>> 9) *Works both ways*, C/C++ and Pharo can access and modify the shared
>> memory. Making it possible for C/C++ to use Pharo libraries and Pharo to
>> use C/C++ libraries.
>>
>> 10) Experiments have proven that it improves sex life...  if it does not
>> please file a bug report ;)
>>
>>
>> *What are the disadvantages ?*
>>
>> 1) *Candy Crash Saga*. Dare do something incorrectly and Pharo will
>> crash. CPPBridge can easily point to wrong address if you are not aware of
>> what you doing.
>>
>> 2) *C++/C* . If you think you can avoid learning C/C++ and that this is
>> a magic solution , think again. The C/C++ application must be modified to
>> include shared memory mapping for CPPBridge to work .
>>
>> 3) *Local only*. Unlike sockets, Shared Memory works only on the same
>> machine so no remote execution and manipulation of code like in my socket
>> bridge to Python
>>
>> 4) *UFFI still No1 option*. No replacement for UFFI it actually depends
>> on it to work , so if you can turn your C/C++ code into a DLL that should
>> be your first option.
>>
>> *Roadmap *
>>
>> Currently CPPBridge works only on MacOS , most likely on Linux too
>> (because it uses the Unix architecture) but I will have to test it.
>>
>> Windows is coming next ASAP, since its my No1 platform for creating
>> commercial games.
>>
>> Maybe establish a small protocol of communication via the Shared Memory ,
>> JSON looks like a good universal format
>>
>> *Thanks*
>>
>> Big thanks to Eliot for inspiring me and Esteban for helping me figure
>> out things.
>>
>>
>>
>>
>> --
>> Best regards,
>> Igor Stasenko.
>>
>


-- 
Best regards,
Igor Stasenko.

Reply via email to