作者StubbornLin (键盘创业家)
看板GameDesign
标题[心得] C++搭Python 高效地图引擎开发
时间Sat Nov 17 14:16:27 2012
最近用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/
h 肝◤ ▉⊙ ⊙▍◥
│xxx xxxxxxx │ ◢
◣
t │ 工▎
◤皿◥ ▋│xx* xxxxxxx │ ∴ ⊙-⊙ 这该死的BUG!!!
x Φ 程◣ ◣ ◢ ◤│xxx xxxxxxx │入○- 皿 ○ ˊ
9 │ 师 ◣
▃▅▇▅▃◢
◢  ̄ ̄╩@╮◤ ▊__ ◣◣◣◣
--
※ 发信站: 批踢踢实业坊(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