Goal of this project is to develop a c++ library for synchronizing objects of one server with n-clients over network which provides following features:
- able to handle massive count of clients and objects
- linear scalability with the count of cpus/cores
- threadsafe interface to provide multithreading support for the apps
- keeping overhead and complexity small to provide good performance
=> SyncSys goal is to be a network solution (c++ - under zlib license - Win/Linux/Unix) which is really MMO ready!
This results in some design decisions which may be a bit strange at first glance:
- serialized data are seperated from game objects (NetEntity) with thread safe access and shared ptr implementation
- changes of data and visibility have to be indicated manually (NetEntity::SignalizeDataChange / NetEntity::SignalizeVisibilityChange both are thread safe) => avoids waste of cpu cycles and traffic due to frequent memory observation and premature update sending
- the changes will only take effect when NetEntity::PerformNeededUpdates is called => allows to change data and visibility across thread bounderies while keeping update logic within a specific thread context
- a tree like object hierarchy and visbility is encouraged(visbility is handed down from higher to subordinated objects) => can reduce taffic and update time considerably and make "wallhacks" less effective (nescient clients are nice clients)
- On client side objects are not generated automatically by the system via callback but manually by SyncClient::GetReceivedElement / SyncClient::GetReceivedElementByFactory => control is up to the developer
Of couse some decisions have drawbacks but e.g. the client side object generation can be done mostly automatic (if Deserialize of a parent/superior object is called and a serialized ID list of its clients is received it can deserialize its children via DeserializeChildren).
The library is composed of three parts:
- objectlayer - concern with the unique-ids + updating + de/serialisation + versioning + visibility
- abstract transportlayer - collects data, packs and and sends them
- networklayer - a tcp class-set which can be replaced easily by another lib of your choice
A rough and uncomplete overview over the main classes of sync system:
If you have questions or an idea for improvements just contact me Nox@7bitfaster.de or post in the
forum.
You want a comparison to other solutions like i.e. RakNet or enet? Take a look at
this.
Looking for the newest code?
http://syncsys.svn.sourceforge.net/svnroot/syncsys/
Or do you need an example?
usage example 1,
usage example 2,
usage example 3
This library is licensed under zlib.