• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天行健 君子當自強而不息

            Getting Online with Multiplayer Gaming(11)

             

            The Message Queue

            The server never deals directly with incoming messages; instead, the server pulls
            messages from the queue. If a message needs to be processed, it must be inserted
            into the queue. Using a queue ensures that the server never gets bogged down with
            processing incoming network data.

            The queue is just an array of sMsg structures that is allocated when the application
            class is initialized. I set a limit of 1,024 messages to be allocated for the server, but you
            can change that amount just by altering the MAX_MESSAGE macro in the source code.

            To track messages being added and removed from the queue, use two variables—
            m_msg_head and m_msg_tail. Check out Figure 19.12 to see how the queue uses those
            two variables to track which messages are to be inserted or removed.

            Whenever a message needs to be added to the message queue, a special function is
            called. That function is cApp::queue_msg, and it takes a single argument: the
            sMsg structure to add to the queue.

            Remember the incoming message functions of cApp (covered in the section “DirectPlay
            Messages to Game Messages”)? Those functions built a message structure and added
            the message to the queue via queue_msg. Look at the queue_msg code to see what’s
            going on:

            bool cApp::queue_msg(const void* msg)
            {
                
            const sMsgHeader* header = (const sMsgHeader*) msg;

                
            // return if no room left in queue
                if((m_msg_head + 1) % MAX_MESSAGES == m_msg_tail)
                    
            return false;

                
            // stuff message into queue
                if(header->size <= sizeof(sMsg))
                {
                    EnterCriticalSection(&m_msg_cs);

                    memcpy(&m_msgs[m_msg_head], msg, header->size);

                    
            // goto next empty message (flip around if at end)
                    m_msg_head++;

                    
            if(m_msg_head >= MAX_MESSAGES)
                        m_msg_head = 0;

                    LeaveCriticalSection(&m_msg_cs);
                }

                
            return true;
            }

            As you can see, queue_msg merely copies the supplied sMsg structure into the
            next available element in the message array (pointed to by m_msg_head). Two things
            you haven’t seen are the EnterCriticalSection and LeaveCriticalSection functions.
            Windows uses these two functions to restrict the application’s access to memory
            (using the EnterCriticalSection function), only allowing a single process to modify
            that memory. Once you finish modifying the memory, you need to inform
            Windows by calling LeaveCriticalSection.

            Although this may not make sense at first, think about it like this—the network
            component (a process) is running in the background at the same time as the application
            (another process). If the network component is adding messages to the
            array while the application is trying to remove messages or modify the messages,
            the program data can become corrupt. Critical sections ensure that only one
            process gets sole access to data for a short time.

            posted on 2007-12-18 21:25 lovedday 閱讀(162) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            伊人伊成久久人综合网777| 国产美女久久久| 亚洲а∨天堂久久精品9966| 久久精品成人欧美大片| 久久亚洲国产成人精品无码区| 污污内射久久一区二区欧美日韩| 伊人久久亚洲综合影院| 午夜不卡久久精品无码免费| 久久99热狠狠色精品一区| 久久久久综合中文字幕| 亚洲午夜无码久久久久| www.久久热.com| 亚洲&#228;v永久无码精品天堂久久| 亚洲欧洲精品成人久久奇米网| 久久精品国产亚洲av高清漫画| 97精品国产97久久久久久免费| 一级A毛片免费观看久久精品| 精品久久久久久久无码| 久久久久国产精品麻豆AR影院| 久久综合狠狠综合久久| 国产成人精品久久一区二区三区av | 国产精品亚洲美女久久久| 超级97碰碰碰碰久久久久最新| 久久亚洲高清观看| 色综合久久久久无码专区| 久久久WWW免费人成精品| 国产麻豆精品久久一二三| 伊人热热久久原色播放www| 狠狠色丁香婷婷综合久久来来去| 欧美黑人又粗又大久久久| 亚洲一级Av无码毛片久久精品| 久久综合丝袜日本网| 777米奇久久最新地址| 99久久精品免费看国产一区二区三区| 88久久精品无码一区二区毛片 | 久久精品国产99国产精品亚洲| 青青国产成人久久91网| 精品国际久久久久999波多野| 中文字幕无码精品亚洲资源网久久| 久久精品国产亚洲AV不卡| 久久综合狠狠色综合伊人|