顯示廣告
隱藏 ✕
※ 本文為 TSW.bbs. 轉寄自 ptt.cc 更新時間: 2012-12-15 10:35:22
看板 Soft_Job
作者 StubbornLin (鍵盤創業家)
標題 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/
裡面一堆免費素材可以用,像我圖都從裡面出來的

大略就這樣

--
          ▁▂▁   ▄▄▄▄▄▄│   程式寫到鬼打牆?
ψ      贛! xx▄▄▄▄▄│   快上 http://ghosthitswall.com/
        xxx xxxxxxx │        
  ▎      xx* xxxxxxx ∴  ⊙-⊙   這該死的BUG!!!
 Φ  ◣    ◣ ◢   xxx xxxxxxx ○- ˊ
   ▃▅▇▅▃   ̄ ̄╩@__ ◣◣◣

--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.227.209.211
ianlin45 
ianlin45:感謝您的經驗分享1F 11/28 22:10
viper9709:推~~很棒的心得分享2F 11/28 22:38
BlazarArc:推3F 11/28 22:48
LaPass:推4F 11/29 00:03
hakkacandy:感謝您的經驗分享!!!5F 11/29 00:11
Ting1024:PUSH~6F 11/29 06:51
ck574b027:推7F 11/29 09:27
asleisureto:推~8F 11/29 09:52
larrywhy:推超強神人now.in之母9F 11/30 16:07
ken1325:推10F 11/30 16:13
cobrasgo:python和c++效能差到10倍那邊,有samble code可以看嗎?11F 11/30 20:33
cobrasgo:我蠻想知道什麼樣的code會造成如此巨大的差異,感謝
cobrasgo:                                  p
用我跑過的profile來說明

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)
dogtsing:好文感謝分享14F 12/01 23:44
nfsong:推15F 12/02 12:24
cobrasgo:先推再看,感謝16F 12/02 23:16

--
※ 看板: e39a562r 文章推薦值: 0 目前人氣: 0 累積人氣: 464 
分享網址: 複製 已複製
guest
x)推文 r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇