コード例 #1
0
        // a bit dirty. only used by WorldClientCollection
        public void Send(SegmentStream stream)
        {
            if (Socket == null || !Connected)
            {
                stream.Dispose();
                return;
            }

            var args = ObjectPoolMgr.ObtainObject <PoolableSocketArgs>();

            try
            {
                args.Completed += OnSendCompleted;
                args.SetBuffer(stream.Segment.Buffer.Array, stream.Segment.Offset, (int)(stream.Position));
                args.UserToken = stream;

                if (!Socket.SendAsync(args))
                {
                    args.Completed -= OnSendCompleted;
                    stream.Dispose();
                    ObjectPoolMgr.ReleaseObject(args);
                }
            }
            catch
            {
                args.Dispose();
                stream.Dispose();
                // args could be disposed if an error occured
                throw;
            }
        }
コード例 #2
0
        public static SocketAsyncEventArgs AcquireSocketArg()
        {
            var args = ObjectPoolMgr.ObtainObject <SocketAsyncEventArgs>();

            CleanSocketArg(args);
            return(args);
        }
コード例 #3
0
        public static void ReleaseSocketArg(SocketAsyncEventArgs arg)
        {
            //Interlocked.Increment(ref s_ReleasedArgs);
            //Interlocked.Decrement(ref s_OutstandingArgs);
            //Console.WriteLine("Releasing SocketAsyncEventArg {0}:{1}", s_OutstandingArgs, s_ReleasedArgs);

            ObjectPoolMgr.ReleaseObject <SocketAsyncEventArgs>(arg);
        }
コード例 #4
0
 static SocketHelpers()
 {
     if (!ObjectPoolMgr.ContainsType <SocketAsyncEventArgs>())
     {
         ObjectPoolMgr.RegisterType(CreateSocketArg);
         ObjectPoolMgr.SetMinimumSize <SocketAsyncEventArgs>(CfgMgr.BasicCfg.MaxNumberOfConnections);
     }
 }
コード例 #5
0
        //static int s_AcquiredArgs;
        //static int s_ReleasedArgs;
        //static int s_OutstandingArgs;

        static SocketHelpers()
        {
            if (!ObjectPoolMgr.ContainsType <SocketAsyncEventArgs>())
            {
                ObjectPoolMgr.RegisterType <SocketAsyncEventArgs>(CreateSocketArg);

                // TODO: have the minimum value set in config or find an appropriate minimum.
                ObjectPoolMgr.SetMinimumSize <SocketAsyncEventArgs>(100);
            }
        }
コード例 #6
0
        public static SocketAsyncEventArgs AcquireSocketArg()
        {
            //Interlocked.Increment(ref s_OutstandingArgs);
            //Interlocked.Increment(ref s_AcquiredArgs);
            //Console.WriteLine("Acquiring SocketAsyncEventArg {0}:{1}", s_OutstandingArgs, s_AcquiredArgs);
            SocketAsyncEventArgs args = ObjectPoolMgr.ObtainObject <SocketAsyncEventArgs>();

            CleanSocketArg(args);

            return(args);
        }
コード例 #7
0
        private static void OnSendCompleted(object sender, SocketAsyncEventArgs args)
        {
            args.Completed -= OnSendCompleted;
            var stream = args.UserToken as SegmentStream;

            if (stream != null)
            {
                stream.Dispose();
            }

            ObjectPoolMgr.ReleaseObject((PoolableSocketArgs)args);
        }
コード例 #8
0
 private void Awake()
 {
     if (_instance == null)
     {
         _instance = this;
     }
     // 인스턴스가 존재하는 경우 새로생기는 인스턴스를 삭제한다.
     else if (_instance != this)
     {
         Destroy(gameObject);
     }
     // 아래의 함수를 사용하여 씬이 전환되더라도 선언되었던 인스턴스가 파괴되지 않는다.
     DontDestroyOnLoad(gameObject);
 }
コード例 #9
0
 public void Send(SegmentStream stream)
 {
     if (this.Socket != null && this.Connected)
     {
         SocketAsyncEventArgs socketAsyncEventArgs = ObjectPoolMgr.ObtainObject <SocketAsyncEventArgs>();
         socketAsyncEventArgs.Completed += new EventHandler <SocketAsyncEventArgs>(this.OnSendCompleted);
         socketAsyncEventArgs.SetBuffer(stream.Segment.Buffer.Array, stream.Segment.Offset, (int)stream.Position);
         socketAsyncEventArgs.UserToken = stream;
         if (!this.Socket.SendAsync(socketAsyncEventArgs))
         {
             socketAsyncEventArgs.Completed -= new EventHandler <SocketAsyncEventArgs>(this.OnSendCompleted);
             stream.Dispose();
             ObjectPoolMgr.ReleaseObject <SocketAsyncEventArgs>(socketAsyncEventArgs);
         }
         this.LastActivity = DateTime.Now;
     }
 }
コード例 #10
0
 public void Initialize(ClientManager.CreateClientHandler createClientHandler)
 {
     if (this.IsInitialized)
     {
         throw new Exception("ClientManager already initialized");
     }
     if (!ObjectPoolMgr.ContainsType <SocketAsyncEventArgs>())
     {
         ObjectPoolMgr.RegisterType <SocketAsyncEventArgs>(() => new SocketAsyncEventArgs());
         ObjectPoolMgr.SetMinimumSize <SocketAsyncEventArgs>(100);
     }
     this.m_createClientDelegate  = createClientHandler;
     this.m_semaphore             = new SemaphoreSlim(ClientManager.MaxConcurrentConnections, ClientManager.MaxConcurrentConnections);
     this.m_acceptArgs.Completed += delegate(object sender, SocketAsyncEventArgs e)
     {
         this.ProcessAccept(e);
     };
     this.IsInitialized = true;
 }
コード例 #11
0
    void Awake()
    {
        if (instance == null)
        {
            instance = this;
        }
        else if (instance != this)
        {
            Destroy(gameObject);
        }

        //如果没有进行过初始化,先初始化创建池中的对象
        if (!_binit)
        {
            _init();
            _binit = true;
        }

        DontDestroyOnLoad(gameObject);
    }
コード例 #12
0
        public void Initialize(CreateClientHandler createClientHandler)
        {
            if (IsInitialized)
            {
                throw new Exception("ClientManager already initialized");
            }

            if (!ObjectPoolMgr.ContainsType <PoolableSocketArgs>())
            {
                ObjectPoolMgr.RegisterType(() => new PoolableSocketArgs());
                ObjectPoolMgr.SetMinimumSize <PoolableSocketArgs>(MaxConcurrentConnections);
            }

            m_createClientDelegate = createClientHandler;

            // init semaphore
            m_semaphore             = new SemaphoreSlim(MaxConcurrentConnections, MaxConcurrentConnections);
            m_acceptArgs.Completed += (sender, e) => ProcessAccept(e);

            IsInitialized = true;
        }
コード例 #13
0
 public void PushSocketArg(PoolableSocketArgs args)
 {
     ObjectPoolMgr.ReleaseObject(args);
 }
コード例 #14
0
        public PoolableSocketArgs PopSocketArg()
        {
            var arg = ObjectPoolMgr.ObtainObject <PoolableSocketArgs>();

            return(arg);
        }
コード例 #15
0
    //ect...........

    #endregion

    private void Awake()
    {
        inst = this;

        InitObjectPool();
    }
コード例 #16
0
 public void PushSocketArg(SocketAsyncEventArgs args)
 {
     ObjectPoolMgr.ReleaseObject <SocketAsyncEventArgs>(args);
 }
コード例 #17
0
 public SocketAsyncEventArgs PopSocketArg()
 {
     return(ObjectPoolMgr.ObtainObject <SocketAsyncEventArgs>());
 }
コード例 #18
0
 private void OnSendCompleted(object sender, SocketAsyncEventArgs e)
 {
     e.Completed -= new EventHandler <SocketAsyncEventArgs>(this.OnSendCompleted);
     ((SegmentStream)e.UserToken).Dispose();
     ObjectPoolMgr.ReleaseObject <SocketAsyncEventArgs>(e);
 }
コード例 #19
0
 public static void ReleaseSocketArg(SocketAsyncEventArgs arg)
 {
     ObjectPoolMgr.ReleaseObject(arg);
 }
コード例 #20
0
ファイル: ObjectPoolMgr.cs プロジェクト: ChangeMaker13/D.R.C
    void Awake()
    {
        instance = this;

        m_PooledObject           = new Dictionary <string, List <GameObject> >();
        m_Directory_PooledObject = transform.GetChild(2);

        //Initializing Position (포지션을 할당해 놓는다.)
        Transform Directory_PoolingPos = transform.GetChild(1);

        m_PoolingPos = new Vector3[Directory_PoolingPos.childCount];
        for (int i = 0; i < m_PoolingPos.Length; i++)
        {
            m_PoolingPos[i] = Directory_PoolingPos.GetChild(i).position;
        }


        //AddObjectToPool-------------------------------------------
        //Zomebie(Businessman)
        AddObjectToPool(0, 50, ObjType.OBJ_ENEMY, false);

        //Particle(FX_BloodSplatter_Katana)
        AddObjectToPool(1, 20, ObjType.OBJ_ETC, true);

        //Bullet
        AddObjectToPool(2, 20, ObjType.OBJ_BULLET, true);

        //Particle(FX_BloodSplatter_Bullet)
        AddObjectToPool(3, 50, ObjType.OBJ_ETC, true);

        //Zomebie(SA_Zombie_RoadWorker)
        AddObjectToPool(4, 50, ObjType.OBJ_ENEMY, false);

        //DropHeart
        AddObjectToPool(5, 20, ObjType.OBJ_ETC, true);

        //DropAmmo
        AddObjectToPool(6, 10, ObjType.OBJ_ETC, true);

        //Flame
        AddObjectToPool(7, 10, ObjType.OBJ_ETC, true);

        //ExplosionParticle
        AddObjectToPool(8, 10, ObjType.OBJ_ETC, true);

        //Devil Zombie
        AddObjectToPool(9, 10, ObjType.OBJ_ENEMY, false);

        //Rugby Zombie
        AddObjectToPool(10, 10, ObjType.OBJ_ENEMY, false);

        //PrisonerZombie
        AddObjectToPool(11, 10, ObjType.OBJ_ENEMY, false);

        //SoldierZombie
        AddObjectToPool(12, 10, ObjType.OBJ_ENEMY, false);

        //Zomebie(Normal3)
        AddObjectToPool(13, 50, ObjType.OBJ_ENEMY, false);

        //Zomebie(Normal4)
        AddObjectToPool(14, 50, ObjType.OBJ_ENEMY, false);

        //Zomebie(Normal5)
        AddObjectToPool(15, 50, ObjType.OBJ_ENEMY, false);

        //Rocket
        AddObjectToPool(16, 3, ObjType.OBJ_BULLET, true);

        //SniperBullet
        AddObjectToPool(17, 5, ObjType.OBJ_BULLET, true);

        //Bullet Impact_Concrete
        AddObjectToPool(18, 100, ObjType.OBJ_ETC, false);
        m_ParticleOrderList.Add("WFXMR_BImpact Concrete + Hole Unlit", new ParticleOrderList());

        //Bullet Impact_Dirt
        AddObjectToPool(19, 100, ObjType.OBJ_ETC, false);
        m_ParticleOrderList.Add("WFXMR_BImpact Dirt + Hole", new ParticleOrderList());

        //Soldier Zombie Bullet
        AddObjectToPool(20, 10, ObjType.OBJ_BULLET, true);

        //Soldier Zombie Bullet
        AddObjectToPool(21, 5, ObjType.OBJ_COLLEAGUE, true);

        //Flame Collider
        AddObjectToPool(22, 9, ObjType.OBJ_BULLET, false);
    }