Esempio n. 1
0
        public bool shouldUpdate(double delta)
        {
            double currentTime = TimeSource.clockTime();

            if (currentTime >= myNextUpdate)
            {
                myNextUpdate = currentTime + myUpdateFrequency;
                return(true);
            }

            return(false);
        }
Esempio n. 2
0
        void handleClient(object client)
        {
            TcpClient tcpClient = (TcpClient)client;

            //2MB buffers, should help with overflow conditions
            tcpClient.ReceiveBufferSize = 1024 * 1024 * 20;
            tcpClient.SendBufferSize    = 1024 * 1024 * 20;
            NetworkStream clientStream = tcpClient.GetStream();

            ConcurrentQueue <Event> myEventQueue = new ConcurrentQueue <Event>();

            myClientQueues.Add(myEventQueue);

            if (onClientConnected != null)
            {
                onClientConnected(tcpClient);
            }

            byte[] header     = new byte[1000];
            byte[] tempBuffer = new byte[4096];
            byte[] messageBuffer;
            Int32  bytesRead;

            while (myShouldQuit == false)
            {
                bytesRead = 0;

                try
                {
                    double readTime = TimeSource.currentTime() + 0.25; //poll socket for 1/4 a second before giving up
                    while (clientStream.DataAvailable == true && TimeSource.clockTime() < readTime)
                    {
                        //blocks until a client sends a message,  then just read the size of the message
                        bytesRead = clientStream.Read(header, 0, 4);
                        Int32 msgSize = BitConverter.ToInt32(header, 0);

                        if (msgSize == Int32.MaxValue) //this is a shutdown request
                        {
                            break;
                        }

                        if (msgSize > (1024 * 64)) // a reasonable number
                        {
                            throw new Exception("Message received is too big");
                        }

                        messageBuffer = new byte[msgSize];
                        int bytesReceived = bytesRead;
                        //copy the size of the message into the buffer, since this is important for decoding
                        Array.Copy(header, 0, messageBuffer, 0, bytesReceived);

                        //read the rest of this message
                        while (bytesReceived < msgSize)
                        {
                            int bytesToRead = 0;
                            if ((msgSize - bytesReceived) > 4096)
                            {
                                bytesReceived = 4096;
                            }
                            else
                            {
                                bytesToRead = msgSize - bytesReceived;
                            }

                            bytesRead = clientStream.Read(tempBuffer, 0, bytesToRead);
                            Array.Copy(tempBuffer, 0, messageBuffer, bytesReceived, bytesRead);
                            bytesReceived += bytesRead;
                        }

                        //we got it all, so decode it, and send it off
                        Event e = Event.decode(ref messageBuffer);

                        bool filtered = false;
                        if (filterReceiveEvent != null)
                        {
                            if (filterReceiveEvent(e, tcpClient) == true)
                            {
                                filtered = true;
                            }
                        }

                        if (filtered == false)
                        {
                            if (receivedEvent != null)
                            {
                                receivedEvent(e, tcpClient);
                            }
                        }
                    }
                }
                catch
                {
                    //a socket error has occurred
                    break;
                }

                //send any waiting messages
                double writeTime = TimeSource.currentTime() + 0.25;
                Event  evt       = null;
                while (myEventQueue.TryDequeue(out evt) == true && TimeSource.clockTime() < writeTime)
                {
                    bool filtered = false;
                    if (filterSendEvent != null)
                    {
                        filtered = filterSendEvent(evt, tcpClient);
                    }

                    if (filtered == false)
                    {
                        try
                        {
                            if (sendingEvent != null)
                            {
                                sendingEvent(evt, tcpClient);
                            }
                            //Debug.print("Fullfilled request for chunk: {0}", tr.chunkId);
                            byte[] msg = evt.encode();
                            clientStream.Write(msg, 0, msg.Length);
                            clientStream.Flush();
                        }
                        catch
                        {
                            //a socket error has occurred
                            break;
                        }
                    }
                }

                //the client has disconnected from the server
                if (tcpClient.Connected == false)
                {
                    break;
                }

                Thread.Sleep(1);
            }

            tcpClient.Close();
        }
Esempio n. 3
0
        public bool tick(double minSeconds, double maxSeconds)
        {
            processedMessages = 0;
            double startTime = TimeSource.clockTime();
            double minTime   = minSeconds == -1.0 ? startTime : startTime + minSeconds;
            double maxTime   = maxSeconds == -1.0 ? startTime + 1000000.0 : startTime + maxSeconds;

            myIsTicking = true;

            //determine number of messages to process for this frame
            int count = myEventQueue.Count;

            int runningTasks = 0;

            //keep looping if we have time
            while (TimeSource.currentTime() < maxTime && processedMessages < count)
            {
                Event e;

                //no message available, sleep until min time is met
                if (!myEventQueue.TryDequeue(out e))
                {
                    break;
                }
                processedMessages++;

                //is it time to process this event (i.e enough delay has passed)
                if (TimeSource.currentTime() - e.timeStamp < e.delay)
                {
                    //still has time left, put it back on the queue
                    myEventQueue.Enqueue(e);
                    continue;
                }

                EventResult res = dispatchEvent(e);
            }

            //wait for running tasks to finish
            while (runningTasks > 0)
            {
                System.Threading.Thread.Sleep(0);
            }

            myIsTicking = false;

            //handle any changes that may have occurred during event processing
            //can't do this during event processing since it may invalidate
            //iterators
            EventListenerInfo eli;

            while (myPendingAdds.TryDequeue(out eli))
            {
                registerEvent(eli.eventName);
                myRootEventListener.addEventListener(eli.func, eli.eventName);
            }

            while (myPendingRemoves.TryDequeue(out eli))
            {
                myRootEventListener.removeEventListener(eli.func, eli.eventName);
            }

            //sleep for the rest of the time
            double now = TimeSource.clockTime();

            if (now < minTime)
            {
                double sleepTime = minTime - now;
                Thread.Sleep((int)(sleepTime * 1000.0f));
            }

            return(true);
        }