Re: [請益] 該如何獨立完成一個遊戲?

看板Soft_Job作者 (鍵盤創業家)時間11年前 (2012/11/28 21:49), 編輯推噓13(1303)
留言16則, 13人參與, 最新討論串2/2 (看更多)
※ 引述《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

11/28 22:10, , 1F
感謝您的經驗分享
11/28 22:10, 1F

11/28 22:38, , 2F
推~~很棒的心得分享
11/28 22:38, 2F

11/28 22:48, , 3F
11/28 22:48, 3F

11/29 00:03, , 4F
11/29 00:03, 4F

11/29 00:11, , 5F
感謝您的經驗分享!!!
11/29 00:11, 5F

11/29 06:51, , 6F
PUSH~
11/29 06:51, 6F

11/29 09:27, , 7F
11/29 09:27, 7F

11/29 09:52, , 8F
推~
11/29 09:52, 8F

11/30 16:07, , 9F
推超強神人now.in之母
11/30 16:07, 9F

11/30 16:13, , 10F
11/30 16:13, 10F

11/30 20:33, , 11F
python和c++效能差到10倍那邊,有samble code可以看嗎?
11/30 20:33, 11F

11/30 20:34, , 12F
我蠻想知道什麼樣的code會造成如此巨大的差異,感謝
11/30 20:34, 12F

11/30 20:35, , 13F
p
11/30 20:35, 13F
用我跑過的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)

12/01 23:44, , 14F
好文感謝分享
12/01 23:44, 14F

12/02 12:24, , 15F
12/02 12:24, 15F

12/02 23:16, , 16F
先推再看,感謝
12/02 23:16, 16F
文章代碼(AID): #1GjXPlMC (Soft_Job)
文章代碼(AID): #1GjXPlMC (Soft_Job)