示例#1
0
        public EntitySyncServer(long threadCount, int syncRate,
                                Func <IClientRepository, NetworkLayer> createNetworkLayer,
                                Func <SpatialPartition> createSpatialPartition, IIdProvider <ulong> idProvider)
        {
            if (threadCount < 1)
            {
                throw new ArgumentException("threadCount must be >= 1");
            }

            entityThreads            = new EntityThread[threadCount];
            entityThreadRepositories = new EntityThreadRepository[threadCount];
            clientThreadRepositories = new ClientThreadRepository[threadCount];

            for (var i = 0; i < threadCount; i++)
            {
                var clientThreadRepository = new ClientThreadRepository();
                var entityThreadRepository = new EntityThreadRepository();
                entityThreadRepositories[i] = entityThreadRepository;
                clientThreadRepositories[i] = clientThreadRepository;
                entityThreads[i]            = new EntityThread(entityThreadRepository, clientThreadRepository, createSpatialPartition(), syncRate,
                                                               OnEntityCreate,
                                                               OnEntityRemove, OnEntityDataChange, OnEntityPositionChange, OnEntityClearCache);
            }

            entityRepository = new EntityRepository(entityThreadRepositories);
            clientRepository = new ClientRepository(clientThreadRepositories);
            networkLayer     = createNetworkLayer(clientRepository);
            networkLayer.OnConnectionConnect    += OnConnectionConnect;
            networkLayer.OnConnectionDisconnect += OnConnectionDisconnect;
            this.idProvider = idProvider;
        }
示例#2
0
        public EntitySyncServer(ulong threadCount, int syncRate, Func <ulong, bool> netOwnerEvents,
                                Func <ulong, IClientRepository, NetworkLayer> createNetworkLayer,
                                Func <IEntity, ulong, ulong> entityThreadId,
                                Func <ulong, ulong, ulong, ulong> entityIdAndTypeThreadId,
                                Func <ulong, SpatialPartition> createSpatialPartition, IIdProvider <ulong> idProvider)
        {
            if (threadCount < 1)
            {
                throw new ArgumentException("threadCount must be >= 1");
            }

            if (syncRate < 0)
            {
                throw new ArgumentException("syncRate must be >= 0");
            }

            entityThreads            = new EntityThread[threadCount];
            entityThreadRepositories = new EntityThreadRepository[threadCount];
            clientThreadRepositories = new ClientThreadRepository[threadCount];
            spatialPartitions        = new SpatialPartition[threadCount];

            for (ulong i = 0; i < threadCount; i++)
            {
                var clientThreadRepository = new ClientThreadRepository();
                var entityThreadRepository = new EntityThreadRepository();
                var spatialPartition       = createSpatialPartition(i);
                entityThreadRepositories[i] = entityThreadRepository;
                clientThreadRepositories[i] = clientThreadRepository;
                spatialPartitions[i]        = spatialPartition;
                entityThreads[i]            = new EntityThread(i, entityThreadRepository, clientThreadRepository, spatialPartition, syncRate, netOwnerEvents(i),
                                                               OnEntityCreate,
                                                               OnEntityRemove, OnEntityDataChange, OnEntityPositionChange, OnEntityClearCache, OnEntityNetOwnerChange);
            }

            entityRepository = new EntityRepository(entityThreadRepositories, entityThreadId, entityIdAndTypeThreadId);
            clientRepository = new ClientRepository(clientThreadRepositories);
            networkLayer     = createNetworkLayer(threadCount, clientRepository);
            networkLayer.OnConnectionConnect    += OnConnectionConnect;
            networkLayer.OnConnectionDisconnect += OnConnectionDisconnect;
            this.idProvider = idProvider;
        }