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灯, 水草

请输入看板名称,例如:Tech_Job站内搜寻

TOP