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

            牽著老婆滿街逛

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

            LUA Coroutine

            轉載自:http://hyperiris.spaces.live.com/blog/cns!D9CFE2DC046098F8!587.entry
            作者:hyperiris

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

            聽說《游戲編程精粹5》有一篇文章不錯,我就把文章看了一遍,把光盤上的代碼弄下來Compile,嘿,果然不錯。

            問題就這么輕松的解決了?NO!

            我繼續試驗,從原代碼的3個Coroutine增加到100個,程序馬上就掛了,有各種奇怪的錯誤,什么stack overflow等等……

            最關鍵的是,由lua_newthread出來的state奇怪的消失了。原來的創建代碼如下:

            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 );
            }
             


            這里隱含著一個嚴重的Bug,lua_pushlightuserdata其實是一個很RAW的API,換句話說,它并不知道你push的是什么。表面上看來,threadState被放在了表里面,也就有了引用不會被自動回收,實際上表里面存的只是一個RAW c pointer!當LUA覺得需要GC的時候,可憐的threadState就被回收了,于是整個程序就crash了。

            改起來很簡單:

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

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

            另外,Coroutine好用,但是不是沒有代價的,每次lua_newthread出來一個新的thread state,需要大約4K的內存消耗。客戶端上沒什么,在服務器端這是個需要權衡的地方。

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

            評論

            # re: LUA Coroutine[未登錄] 2010-11-09 10:55 pass86

            淚流滿面,我也遇到同樣的問題,也是懷疑被垃圾回收了,搜了下,哈哈,幸運。  回復  更多評論   

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

            我用了樓主的代碼好像直接就崩潰了  回復  更多評論   

            香蕉久久久久久狠狠色| 99麻豆久久久国产精品免费 | 久久精品国产一区二区三区日韩| 少妇人妻88久久中文字幕| 国产精品无码久久综合| 99久久精品国产毛片| 亚洲?V乱码久久精品蜜桃 | 国产精品久久久久9999高清| 国产激情久久久久影院| 亚洲乱码中文字幕久久孕妇黑人 | 999久久久免费精品国产| 国内精品久久久久久久久电影网 | 久久这里的只有是精品23| 久久99国产精品尤物| 亚洲精品乱码久久久久久蜜桃 | 青青青伊人色综合久久| 2021最新久久久视精品爱 | 久久综合九色综合精品| 久久强奷乱码老熟女网站| 曰曰摸天天摸人人看久久久| 中文国产成人精品久久不卡| 中文精品久久久久国产网址| 久久人人爽人人爽人人片AV不 | 亚洲国产成人乱码精品女人久久久不卡| 久久综合九色综合网站| 久久这里的只有是精品23| 久久精品国产亚洲Aⅴ香蕉| 久久中文娱乐网| 精品999久久久久久中文字幕| 亚洲精品乱码久久久久久久久久久久 | 中文精品久久久久人妻不卡| 久久九九久精品国产免费直播| av国内精品久久久久影院| 麻豆一区二区99久久久久| 久久人人爽人人爽人人片AV不 | 色偷偷偷久久伊人大杳蕉| 国产99久久久国产精品小说| 深夜久久AAAAA级毛片免费看| 久久无码AV中文出轨人妻| 久久性生大片免费观看性| 久久天天躁狠狠躁夜夜不卡|