• <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>

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            LUA Coroutine

            轉(zhuǎn)載自:http://hyperiris.spaces.live.com/blog/cns!D9CFE2DC046098F8!587.entry
            作者:hyperiris

            由于我們偉大的策劃要求在游戲腳本中支持system.wait_second(20) 這樣的功能,于是確定實(shí)現(xiàn)的方法成了一個(gè)需要解決的問(wèn)題。眾多前輩指出,使用LUA Coroutine可以達(dá)到我們的要求,可是我在LUA這塊可以說(shuō)是一竅不通,只好硬著頭皮強(qiáng)上了。

            聽(tīng)說(shuō)《游戲編程精粹5》有一篇文章不錯(cuò),我就把文章看了一遍,把光盤(pán)上的代碼弄下來(lái)Compile,嘿,果然不錯(cuò)。

            問(wèn)題就這么輕松的解決了?NO!

            我繼續(xù)試驗(yàn),從原代碼的3個(gè)Coroutine增加到100個(gè),程序馬上就掛了,有各種奇怪的錯(cuò)誤,什么stack overflow等等……

            最關(guān)鍵的是,由lua_newthread出來(lái)的state奇怪的消失了。原來(lái)的創(chuàng)建代碼如下:

            LUASCRIPT::LUASCRIPT( LUAMANAGER*     mgr)
            {
                manager             
            = mgr;
                state               
            = LSS_NOTLOADED;
                time             
            = 0;
                strcpy(lastErrorString, 
            "No error.\n"); 

                
            // create a thread/state for this object
                threadState = lua_newthread(manager->masterState);
                
            // save a pointer to the thread manager object in the global table
                
            // using the new thread's vm pointer as a key
                lua_pushlightuserdata(manager->masterState, threadState);
                lua_pushlightuserdata(manager
            ->masterState, this );
                lua_settable(manager
            ->masterState, LUA_GLOBALSINDEX );
            }
             


            這里隱含著一個(gè)嚴(yán)重的Bug,lua_pushlightuserdata其實(shí)是一個(gè)很RAW的API,換句話說(shuō),它并不知道你push的是什么。表面上看來(lái),threadState被放在了表里面,也就有了引用不會(huì)被自動(dòng)回收,實(shí)際上表里面存的只是一個(gè)RAW c pointer!當(dāng)LUA覺(jué)得需要GC的時(shí)候,可憐的threadState就被回收了,于是整個(gè)程序就crash了。

            改起來(lái)很簡(jiǎn)單:

                //lua_pushlightuserdata(manager->masterState, threadState);
                lua_pushthread(threadState);  //換成這個(gè)
                lua_pushlightuserdata(manager->masterState, this );
                lua_settable(manager
            ->masterState, LUA_GLOBALSINDEX ); 

            原書(shū)代碼中還有幾處類似的錯(cuò)誤,還有導(dǎo)致stack不平衡的代碼,大家看《游戲編程精粹5》的時(shí)候,不可不信,不可全信啊。

            另外,Coroutine好用,但是不是沒(méi)有代價(jià)的,每次lua_newthread出來(lái)一個(gè)新的thread state,需要大約4K的內(nèi)存消耗。客戶端上沒(méi)什么,在服務(wù)器端這是個(gè)需要權(quán)衡的地方。

            posted on 2008-10-28 07:42 楊粼波 閱讀(2576) 評(píng)論(2)  編輯 收藏 引用

            評(píng)論

            # re: LUA Coroutine[未登錄](méi) 2010-11-09 10:55 pass86

            淚流滿面,我也遇到同樣的問(wèn)題,也是懷疑被垃圾回收了,搜了下,哈哈,幸運(yùn)。  回復(fù)  更多評(píng)論   

            # re: LUA Coroutine 2011-09-23 11:05 觀察者

            我用了樓主的代碼好像直接就崩潰了  回復(fù)  更多評(píng)論   


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            日韩欧美亚洲综合久久影院Ds| 人妻无码αv中文字幕久久琪琪布| 人妻精品久久无码专区精东影业 | 伊人久久大香线蕉综合Av| 久久久精品国产sm调教网站| 久久精品国产91久久麻豆自制 | 国内精品久久久久国产盗摄| 久久WWW免费人成一看片| 精品亚洲综合久久中文字幕| 一本大道久久东京热无码AV| 久久久综合九色合综国产| 18禁黄久久久AAA片| 国产亚洲精午夜久久久久久| 午夜欧美精品久久久久久久| 久久99精品久久久久久齐齐| 久久99精品综合国产首页| 久久精品aⅴ无码中文字字幕不卡 久久精品成人欧美大片 | 精品久久久久久久| 人妻少妇久久中文字幕 | 国产亚洲色婷婷久久99精品91| 国内精品久久久久久99蜜桃| 久久亚洲熟女cc98cm| 精品免费久久久久国产一区 | 91精品观看91久久久久久| 精品永久久福利一区二区| 欧美午夜精品久久久久免费视 | 天天爽天天爽天天片a久久网| 久久影院综合精品| 亚洲国产精品无码成人片久久| 中文字幕久久亚洲一区| 思思久久99热免费精品6| 久久久久久久久久免免费精品| 99久久精品免费观看国产| 青青国产成人久久91网| 99久久国产主播综合精品| 国产激情久久久久影院老熟女| 色综合久久中文综合网| 精品乱码久久久久久夜夜嗨| 亚洲国产高清精品线久久| 一级女性全黄久久生活片免费 | 久久天天躁狠狠躁夜夜av浪潮|