• <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 閱讀(167) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            久久99精品久久久久久噜噜| 国产精品久久成人影院| 亚洲国产二区三区久久| 久久精品人人做人人爽电影| 久久综合成人网| 日韩人妻无码精品久久久不卡| 99久久这里只有精品| 久久综合九色欧美综合狠狠 | 99久久这里只精品国产免费| 精品国产青草久久久久福利| 精品视频久久久久| 久久久久久亚洲AV无码专区| 久久精品夜色噜噜亚洲A∨| 国产精品免费福利久久| 久久综合亚洲色HEZYO社区| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 亚洲国产精品嫩草影院久久 | 国产亚洲精久久久久久无码AV| 久久精品国产亚洲av麻豆小说 | 久久国产高潮流白浆免费观看| 国产香蕉久久精品综合网| 99久久国产综合精品成人影院| 亚洲国产精品久久久天堂| 香港aa三级久久三级老师2021国产三级精品三级在 | 久久精品成人免费观看97| 国产99久久精品一区二区| 奇米影视7777久久精品| 狠狠综合久久综合88亚洲 | 亚洲精品视频久久久| 丰满少妇人妻久久久久久4| 久久精品国产久精国产思思| 久久99久久99精品免视看动漫| 久久无码专区国产精品发布| 一本色综合久久| 一本色道久久88综合日韩精品 | 久久国产热这里只有精品| 青草影院天堂男人久久| 久久国产精品无码一区二区三区| 中文字幕亚洲综合久久菠萝蜜| 香蕉久久夜色精品国产2020| 日韩精品久久无码中文字幕|