GameDesign 板


LINE

最近用C++搭Python開發的2D地圖引擎 做了一些最佳化,有一點心得分享一下 為了讓Python可以存取C++裡的程式 我用的是Boost.Python做binding 畫圖用的是DirectX 9 最初我只把DirectX 9的2D畫圖用C++寫包裝給Python用 地圖的呈現都用純Python寫,結果效能很差 http://static.ez2learn.com/client05.PNG
像這樣的場景FPS只有30,最根本的原因是 地圖引擎在畫磚塊的迴圈很吃重 Python本身的效率差C++的大約在10~100倍之間 同樣的程式,Python的overhead太重 在迴圈中累積多了,再怎樣改善演算d法都不會有太大的幫助 除此之外還有個嚴重的問題,就是Python的GIL 簡單的來說是Python的一個全域鎖 主要是Python的物件都有reference count 因此在multi-thread跑時需要去取得GIL才能碰Python的物件 否則會crash 所以Python的thread實際同時在跑的thread只能有一個 而這個GIL造成在多核心開多thread反而會跑更慢 (因為多thread狂搶GIL) 這文章有講,可以參考看看 http://www.dabeaz.com/python/UnderstandingGIL.pdf 純Python thread是無法增加平行處理的能力 為了解決效率太差的問題,我用C++寫game thread的部份 感謝Boost.Python的簡單好用,事實上我寫的C++ 並沒有特別去為python做什麼調整,都是以C++做為思考在寫的 等到要expose到python時,Boost.Python幾乎都有簡單好用的方法可以用 有些地方要做點特別處理,但不多 而為了必免碰到GIL,C++的類別也都不去碰Python的任何東西 它們都是設計來被使用的,而有時需要callback回Python 這些都用Boost.Signal2來解開藕合 而expose時要注意一下,因為會有來自非Python建的thread 一來是在module開始時要呼叫一下初始化thread BOOST_PYTHON_MODULE(core) { PyEval_InitThreads(); .... } 二來是從C++建的thread callback回python時要取得GIL 不然會crash void do_callback() { AcquireGIL gil; callback(); // callback object in Python } 幾乎一模一樣的程式,用C++重寫後包裝給Python用 這抓圖是地圖上塞了5000個骨髏角色,FPS可以到80 而且還沒做更進一步的最佳化 http://static.ez2learn.com/client16.PNG
這樣把核心封裝給Python操作有個好處 就是當底層的這些都完成後 剩下的高階控制的程式都用Python寫 改起來輕鬆愉快,不用再等編譯 開發效率會快很多 大略就這樣,有人有興趣的話 我有空或許可以再寫一些相關的心得 -- ▂▁ ▄▄▄▄ 程式寫到鬼打牆? ψ 贛! xx▄▄▄▄▄ 快上 http://ghosthitswall.com/ xxx xxxxxxx ▋│xx* xxxxxxx ⊙-⊙ 這該死的BUG!!! Φ ◣ ◢xxx xxxxxxx - ˊ ▃▅▇▅▃  ̄ ̄╩@__ ◣◣◣◣ --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.227.214.207
1F:推 VVll:感謝分享 11/17 14:53
2F:推 art1:eve online後來為了效率也改用c++搭配Python 11/17 16:59
3F:推 chchwy:python開發真的快很多 C++光是等編譯就不知道花掉多少時間 11/17 21:18
4F:推 damody:感謝分享 個人都用lua 不過最近看到anglescript好像不錯 11/17 21:41
5F:→ VVll:C++編譯要快 就是cpu好一點 跟ssd買下去了xd 11/17 21:42
6F:推 damody:SSD+16g ram+i7 超讚 編譯超快 11/17 21:44
7F:推 yoco315:py 包 c++ 超讚的 11/17 22:53
8F:推 NIKE74731:推~ 11/18 00:33
9F:推 su31o4gj83:推~感謝分享~ 11/18 15:25







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:e-shopping站內搜尋

TOP