※ 本文為 TSW.bbs. 轉寄自 ptt.cc 更新時間: 2012-12-15 10:35:22
看板 Soft_Job
作者 標題 Re: [請益] 該如何獨立完成一個遊戲?
時間 Wed Nov 28 21:49:32 2012
※ 引述《ianlin45 (Ian)》之銘言:
: 個人想設計一個小遊戲
: 做為茶餘飯後的休閒娛樂
: 沒有商業考量 單純自爽
: 比較喜歡模擬城市類的經營遊戲
: 很喜歡cities xl那種隨意拉道路的設計
: (弧度、高架或隧道都可自由規劃)
: 該使用何種工具、何種語言達成
: 有沒有推薦的書籍或網站等學習資源?
: 另外美工方面我想使用免費或低廉的素材庫就好
: (這方面的意見也歡迎)
: 畢竟一個人力量有限
: 還是想把時間花在系統本身的設計
: 歡迎各種建議 謝謝
: (預設環境還是先從windows7開始)
: (其實linux也無不可, 好像open source的東西比較多, 也容易移植)
最近剛好在做一套土製MMORPG
http://dreamonline.tw/
也是一個人在做,一點經驗可以分享
首先是工具挑選,基本上為了開發效率考量
大多專業遊戲都是用C/C++或再退一點Java寫的 (像Minecraft)
但是缺點是開發效率很慢
特別是自己一個人寫,光是compile就吃掉不少時間
為了加速開發,動態語言還是比較適合
可以先用動態語言寫好正確的邏輯
再用C/C++來加速那些慢的部份
以我這個例子來說,我是先用C++寫Boost.Python包裝DirectX 3D
給Python用,只包含基本的繪圖部份
等到一些基礎羅輯寫好,發現Python的效能還是太慢
一些吃重的迴圈,演算法再怎麼改也沒用
C++和Python效能差約10倍以上 (但反過來說開發效率也是一樣差很大
所以我把先前Python寫的那部份,幾乎一樣地用C++重寫了一次
然後一樣包給Python使用,解決了效率的問題
所以自己一人,你可以先用像是Python把遊戲寫對
有必要再來最佳化,這樣最快
但切記,Python要寫要平鋪直述
該用design pattern就要用
不要用一些很動態的奇技淫巧
這樣改寫C++時才不會很難改
要開始開發,首先要解決的是畫圖
如果是做2D可以選 Pygame
http://www.pygame.org/news.html
3D可以選 Ogre
http://www.ogre3d.org/
http://www.pythonogre.com/
或是你也可以自己去封裝DirectX或OpenGL
也有別人包好的
http://pyopengl.sourceforge.net/
http://directpython11.sourceforge.net/
還有如果是3D
你可能還得讀一些基本的線性代數
不然可能很多東西都看不懂
2D就還好,雖然也會用到,但基本的貼圖會用就能玩很多東西
接著是頭痛的美術圖片問題
我以前也苦腦很久,程式寫出來
卻連測試用的圖片都沒有
還得自己畫很醜,一格一格動畫來測
後來發現這網站 - OpenGameArt
http://opengameart.org/
裡面一堆免費素材可以用,像我圖都從裡面出來的
大略就這樣
--
↑ ▁▁▂▆▂▁▁ ││▄▄▄▄▄▄▄││ 程式寫到鬼打牆?
h 肝◤◤ ▉▉⊙ ⊙▍◥◥││xxx xxxxxxx ││ ◢ ◣
t │ 工▎ ◤皿◥ ▋││xx* xxxxxxx ││ ∴∴ ⊙-⊙ 這該死的BUG!!!
x Φ 程◣◣ ◣ ◢ ◤◤││xxx xxxxxxx ││入入○○- 皿 ○○ ˊ
9 │ 師 ◣▃▅▇▅▃◢◢  ̄ ̄╩@╮◤ ▊__ ◣◣◣◣◣
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.227.209.211
→ ianlin45 …
推 :推~~很棒的心得分享2F 11/28 22:38
推 :推3F 11/28 22:48
推 :推4F 11/29 00:03
推 :感謝您的經驗分享!!!5F 11/29 00:11
推 :PUSH~6F 11/29 06:51
推 :推7F 11/29 09:27
推 :推~8F 11/29 09:52
推 :推超強神人now.in之母9F 11/30 16:07
推 :推10F 11/30 16:13
推 :python和c++效能差到10倍那邊,有samble code可以看嗎?11F 11/30 20:33
→ :我蠻想知道什麼樣的code會造成如此巨大的差異,感謝
→ : p
用我跑過的profile來說明→ :我蠻想知道什麼樣的code會造成如此巨大的差異,感謝
→ : p
http://static.ez2learn.com/dreamonline_profile.png
10倍是保守估計,C++最佳化開下去的話可以差到百倍
主要是跑次數非常多的迴圈
而且這些迴圈都是用純Python去寫出來的
像這種都會非常慢,像可以看見
draw@sprite.py 它其實就只是儲存sprite資訊
然後呼叫texture的draw去畫圖而已
說穿了,它只是一個像
def draw(
self,
x, y,
center_x=0, center_y=0,
...
):
# calculate
self.texture.draw(...)
這樣的函數,但是每次呼叫其實背後dict的建立
光這些,就可以看見draw@sprite.py和draw@texture.py
所花費的時間居然差了1秒 (總共跑10秒之久)
其它很多東西也都是這樣,因為動態的特性,必然要付出額外的成本
那些成本就是造成10~100倍的差別
舉個例子
int i = 0;
i++;
這個 i++ 在 C++ 通常只需要一、兩個ASM指令
i = 0
i += 1
在python裡可能要數十到上百個asm
再看另一個例子,很多時後乘上 2的次方會用位移來做比較快 (compiler沒最佳化的話)
unsigned int n = 1;
n <<= 4;
這樣也是一兩個指令打死
n = 1
n <<= 4
但Python這樣它物件那些五四三的還是得照跑,所以其實不會比直接寫乘法快多少
記億體配置也是一個問題,Python有內建memory pool
大小小於或等於 256 bytes的物件會用memory pool建
雖然說比直接new或malloc快很多,但是還是很慢
用C++寫可以利用stack的優勢
左邊這塊是畫圖的花費,而看右邊那大塊,是地圖畫磚塊的迴圈
可以看到render_layer@map_render就花掉大部份時間
我已經盡力去做最佳化了,但是改善沒多少
所以用C++去把那左右這兩塊重寫就快非常非常多
FPS從原本20~30到重寫後可以到900左右
程式的邏輯幾乎一模一樣
不過我還做了其它的調整,像是thread
因為Python有GIL,一個全域鎖
主要是要保護reference counter
所以Python的thread其實同時只能一個在跑
為了讓它跑快點,我用boost::thread拉出另一條來跑畫圖
程式碼的話,可以參考我以前用javascript寫的HTML5的版 map renderer
http://kaka-demo.ez2learn.com/
主要邏輯是差不多的,只是我的Python/C++版更加複雜了一點 (還有多圖層和物件等等)
簡而言之就是挺吃重的複雜迴圈就是了
※ 編輯: StubbornLin 來自: 61.227.209.45 (12/01 09:07)
推 :好文感謝分享14F 12/01 23:44
推 :推15F 12/02 12:24
推 :先推再看,感謝16F 12/02 23:16
--
※ 同主題文章:
11-28 00:49 ■ [請益] 該如何獨立完成一個遊戲?
● 11-28 21:49 ■ Re: [請益] 該如何獨立完成一個遊戲?
11-28 22:47 ■ Re: [請益] 該如何獨立完成一個遊戲?
※ 看板: e39a562r 文章推薦值: 0 目前人氣: 0 累積人氣: 464
回列表(←)
分享