嚴(yán)以律己,寬以待人. 三思而后行. GMail/GTalk: yanglinbo#google.com; MSN/Email: tx7do#yahoo.com.cn; QQ: 3 0 3 3 9 6 9 2 0 .
由于我們偉大的策劃要求在游戲腳本中支持system.wait_second(20) 這樣的功能,于是確定實(shí)現(xiàn)的方法成了一個(gè)需要解決的問題。眾多前輩指出,使用LUA Coroutine可以達(dá)到我們的要求,可是我在LUA這塊可以說是一竅不通,只好硬著頭皮強(qiáng)上了。
聽說《游戲編程精粹5》有一篇文章不錯(cuò),我就把文章看了一遍,把光盤上的代碼弄下來Compile,嘿,果然不錯(cuò)。
問題就這么輕松的解決了?NO!
我繼續(xù)試驗(yàn),從原代碼的3個(gè)Coroutine增加到100個(gè),程序馬上就掛了,有各種奇怪的錯(cuò)誤,什么stack overflow等等……
最關(guān)鍵的是,由lua_newthread出來的state奇怪的消失了。原來的創(chuàng)建代碼如下:
這里隱含著一個(gè)嚴(yán)重的Bug,lua_pushlightuserdata其實(shí)是一個(gè)很RAW的API,換句話說,它并不知道你push的是什么。表面上看來,threadState被放在了表里面,也就有了引用不會(huì)被自動(dòng)回收,實(shí)際上表里面存的只是一個(gè)RAW c pointer!當(dāng)LUA覺得需要GC的時(shí)候,可憐的threadState就被回收了,于是整個(gè)程序就crash了。
改起來很簡單:
原書代碼中還有幾處類似的錯(cuò)誤,還有導(dǎo)致stack不平衡的代碼,大家看《游戲編程精粹5》的時(shí)候,不可不信,不可全信啊。
另外,Coroutine好用,但是不是沒有代價(jià)的,每次lua_newthread出來一個(gè)新的thread state,需要大約4K的內(nèi)存消耗??蛻舳松蠜]什么,在服務(wù)器端這是個(gè)需要權(quán)衡的地方。
posted on 2008-10-28 07:42 楊粼波 閱讀(2564) 評(píng)論(2) 編輯 收藏 引用
淚流滿面,我也遇到同樣的問題,也是懷疑被垃圾回收了,搜了下,哈哈,幸運(yùn)。 回復(fù) 更多評(píng)論
我用了樓主的代碼好像直接就崩潰了 回復(fù) 更多評(píng)論
Powered by: C++博客 Copyright © 楊粼波