예제 #1
0
        // may be on user thread
        private NetSenderChannelBase CreateSenderChannel(NetMessageType tp)
        {
            NetSenderChannelBase chan;

            lock (m_sendChannels)
            {
                NetDeliveryMethod method = NetUtility.GetDeliveryMethod(tp);
                int sequenceChannel      = (int)tp - (int)method;

                int channelSlot = (int)method - 1 + sequenceChannel;
                if (m_sendChannels[channelSlot] != null)
                {
                    // we were pre-empted by another call to this method
                    chan = m_sendChannels[channelSlot];
                }
                else
                {
                    switch (method)
                    {
                    case NetDeliveryMethod.Unreliable:
                    case NetDeliveryMethod.UnreliableSequenced:
                        chan = new NetUnreliableSenderChannel(this, NetUtility.GetWindowSize(method), method);
                        break;

                    case NetDeliveryMethod.ReliableOrdered:
                        chan = new NetReliableSenderChannel(this, NetUtility.GetWindowSize(method));
                        break;

                    case NetDeliveryMethod.ReliableSequenced:
                    case NetDeliveryMethod.ReliableUnordered:
                    default:
                        chan = new NetReliableSenderChannel(this, NetUtility.GetWindowSize(method));
                        break;
                    }
                    m_sendChannels[channelSlot] = chan;
                }
            }

            return(chan);
        }
예제 #2
0
		// may be on user thread
		private NetSenderChannelBase CreateSenderChannel(NetMessageType tp)
		{
			NetSenderChannelBase chan;
			lock (m_sendChannels)
			{
				NetDeliveryMethod method = NetUtility.GetDeliveryMethod(tp);
				int sequenceChannel = (int)tp - (int)method;

				int channelSlot = (int)method - 1 + sequenceChannel;
				if (m_sendChannels[channelSlot] != null)
				{
					// we were pre-empted by another call to this method
					chan = m_sendChannels[channelSlot];
				}
				else
				{

					switch (method)
					{
						case NetDeliveryMethod.Unreliable:
						case NetDeliveryMethod.UnreliableSequenced:
							chan = new NetUnreliableSenderChannel(this, NetUtility.GetWindowSize(method));
							break;
						case NetDeliveryMethod.ReliableOrdered:
							chan = new NetReliableSenderChannel(this, NetUtility.GetWindowSize(method));
							break;
						case NetDeliveryMethod.ReliableSequenced:
						case NetDeliveryMethod.ReliableUnordered:
						default:
							chan = new NetReliableSenderChannel(this, NetUtility.GetWindowSize(method));
							break;
					}
					m_sendChannels[channelSlot] = chan;
				}
			}

			return chan;
		}
예제 #3
0
파일: NetConnection.cs 프로젝트: rc183/igf
		// may be on user thread
		private NetSenderChannelBase CreateSenderChannel(NetMessageType tp)
		{
			NetSenderChannelBase chan;
			NetDeliveryMethod method = NetUtility.GetDeliveryMethod(tp);
			int sequenceChannel = (int)tp - (int)method;
			switch (method)
			{
				case NetDeliveryMethod.Unreliable:
				case NetDeliveryMethod.UnreliableSequenced:
					chan = new NetUnreliableSenderChannel(this, NetUtility.GetWindowSize(method));
					break;
				case NetDeliveryMethod.ReliableOrdered:
					chan = new NetReliableSenderChannel(this, NetUtility.GetWindowSize(method));
					break;
				case NetDeliveryMethod.ReliableSequenced:
				case NetDeliveryMethod.ReliableUnordered:
				default:
					chan = new NetReliableSenderChannel(this, NetUtility.GetWindowSize(method));
					break;
			}

			int channelSlot = (int)method - 1 + sequenceChannel;
			NetException.Assert(m_sendChannels[channelSlot] == null);
			m_sendChannels[channelSlot] = chan;

			return chan;
		}