Esempio n. 1
0
        public void Test(RpcValue paramater)
        {
            ArrayPool <byte> bufferPool = TcpClient.GetBufferPool();

            ArrayPool <byte> .Node buffer;
            lock (bufferPool)
            {
                buffer = bufferPool.AllocBuffer(DEFAULT_BUFFER_SIZE);
            }

            int serializePoint = buffer.GetOffset();

            paramater.Serialize(buffer.GetBuffer(), ref serializePoint);

            int dserializePoint = buffer.GetOffset();

            paramater.Deserialize(RpcValueArrayPool
                                  , RpcValuePool
                                  , buffer.GetBuffer()
                                  , ref dserializePoint);

            lock (bufferPool)
            {
                bufferPool.ReleaseBuffer(buffer);
            }

            MDebug.Assert(serializePoint == dserializePoint
                          , "Rpc"
                          , "serializePoint == dserializePoint");
        }
Esempio n. 2
0
        internal void Release(ArrayPool <RpcValue> rpcValueArrayPool
                              , ObjectPool <RpcValue> rpcValuePool)
        {
            switch (ValueType)
            {
            case ValueType.Byte:
            case ValueType.Short:
            case ValueType.Int:
            case ValueType.Long:
            case ValueType.Float:
            case ValueType.Double:
                MDebug.Assert(ArrayValue == null
                              , "Rpc"
                              , "ArrayValue == null");
                break;

            case ValueType.FixedValueTypeArray:
            case ValueType.VariableValueTypeArray:
                int        startPoint = ArrayValue.GetOffset();
                int        endPoint   = startPoint + ArrayValue.GetSize();
                RpcValue[] elements   = ArrayValue.GetBuffer();
                for (int iElement = startPoint; iElement < endPoint; iElement++)
                {
                    RpcValue iterElement = elements[iElement];
                    iterElement.Release(rpcValueArrayPool, rpcValuePool);
                    rpcValuePool.Release(iterElement);
                    elements[iElement] = null;
                }
                rpcValueArrayPool.ReleaseBuffer(ArrayValue);
                ArrayValue = null;
                break;

            default:
                throw new Exception("Not support ValueType: " + ValueType);
            }
        }
Esempio n. 3
0
        public override void OnUpdate(float deltaTime)
        {
            lock (m_TcpConnectActionLock)
            {
                if (m_TcpConnectData != null)
                {
                    try
                    {
                        switch (m_TcpConnectData.ConnectState)
                        {
                        case ConnectState.Connected:
                            OnConnected?.Invoke(m_TcpConnectData);
                            break;

                        case ConnectState.ConnectFailed:
                            OnConnectFailed?.Invoke(m_TcpConnectData);
                            break;

                        case ConnectState.Disconnected:
                            OnDisconnected?.Invoke(m_TcpConnectData);
                            break;

                        default:
                            MDebug.Assert(false, LOG_TAG, "Not handle ConnectState: " + m_TcpConnectData.ConnectState);
                            break;
                        }
                    }
                    catch (Exception e)
                    {
                        MDebug.LogError(LOG_TAG
                                        , $"Inove connect:{m_TcpConnectData.ConnectState} Exception:\n{e.ToString()}");
                    }
                    m_TcpConnectData = null;
                }
            }

            if (!IsConnected() ||
                m_ReceivedPackages2 == null)
            {
                return;
            }

            int packageCount;

            lock (m_ReceiveLock)
            {
                packageCount = m_ReceivedPackages.Count;
                if (m_ReceivedPackages2.Capacity < packageCount)
                {
                    m_ReceivedPackages2.Capacity = m_ReceivedPackages2.Capacity * 2;
                    m_ReceivedPackages2._SetCount(m_ReceivedPackages2.Capacity);
                }
                for (int iPackage = 0; iPackage < packageCount; iPackage++)
                {
                    m_ReceivedPackages2[iPackage] = m_ReceivedPackages.Dequeue();
                }
#if GF_DEBUG
                MDebug.Assert(m_ReceivedPackages.Count == 0, LOG_TAG, "m_ReceivedPackages.Count == 0");
#endif
            }

            if (packageCount > 0)
            {
                if (OnReceivedPackage != null)
                {
                    for (int iPackage = 0; iPackage < packageCount; iPackage++)
                    {
                        ArrayPool <byte> .Node iterPackage = m_ReceivedPackages2[iPackage];
                        try
                        {
                            OnReceivedPackage.Invoke(iterPackage);
                        }
                        catch (Exception e)
                        {
                            MDebug.LogError(LOG_TAG
                                            , $"Invoke OnReceivedPackage length: {iterPackage.GetSize()}. Exception:\n{e.ToString()}");
                        }
                    }
                }

                lock (m_BufferPool)
                {
                    for (int iPackage = 0; iPackage < packageCount; iPackage++)
                    {
                        m_BufferPool.ReleaseBuffer(m_ReceivedPackages2[iPackage]);
                        m_ReceivedPackages2[iPackage] = null;
                    }
                }
            }
        }