人人網李成:基于Cocos2d-X的游戲框架設計

fmms 12年前發布 | 32K 次閱讀 人人網

3月 31 日消息,人人網游戲工程師李成在第四屆 Cocoachina 開發者大會發表題為“基于 Cocos2d-X的游戲框架設計”的主題演講。

以下為演講實錄:

大家好!

我是來自人人游戲的李成,我今天演講的題目是“基于 Cocos2d-X的游戲框架設計”,大家有什么好的想法可以跟人人游戲相關的同事交流。

我為什么要講這篇 PPT,我同學在 Cocos2d-X開發的時候會發現網絡上面有大量的例子,但是沒有把技術點連起來作為一個整體經驗的設計。今天大家很多都是講 Cocos2d-X平臺的移植性,我今天講的是怎么針對 Cocos2d-X平臺做游戲類的開發。在前期希望大家有一些更好的設計思想,避免在項目的中后期遇到難以擴展或者是難以復用的問題。我個人經歷過 PC 端類游戲的開發,和 Web 類游戲的開發,所以我感覺端內游戲和頁游傳統游戲的開發經驗完全值得借鑒,運用到移動游戲的開發過程中。

本次演講主要分為三部分:

第一,軟件設計不僅僅是游戲開發,它跟傳統的建筑業有很直接的關系。你可以從兩方面互相汲取一些經驗。在蓋大樓的時候,如果樓踏了就相當于游戲崩潰了,這種兩種情況會直接導致什么結果呢?如果樓踏了很多人就必須重新蓋,相對于程序員來說,就必須重新返工,很多其他項目的人員都一直跟著你加班加點。如果你把游戲做崩潰了,項目沒有成,并且沒有女朋友的話,別人都不愿意跟你,如果有女朋友的話你丈母娘就不愿意,說你把游戲都整崩潰了,還有什么不敢干的。

簡單總結一下,游戲開發跟蓋大樓有一些共同點。一是前期設計規劃很重要;二是基礎設施、基礎模塊的構建很重要;三是擴展性、重用性方面很重要;四是健壯性、安全性很重要;五是從基礎做起從細節做起,拒絕豆腐渣工程。

第二,主要講一下 Cocos2d-X跟 ios 平臺是怎么樣結合在一起的。

先介紹一下 Cocos2d-X引擎開發的優勢,因為 Cocos2d 的 C++ 版本,目前有大量 Cocos2d 的經驗分享,所以如果是 Cocos2d 的 C++ 版本的話,可以把之前的經驗分享過來。C++版本對于我這種非出身的人來說可能是一種福音。支持 ios、Android、Windows 等平臺,跨平臺開發者的福音。它是開源免費、易學易用、龐大的工具鏈支持;早上還有剛才很多同學分享了一些工具。還有強大的技術支持,活躍的技術社區交流平臺,包括我也有 QQ 群,那個 QQ 群經常閃,導致我工作的時候不得以把 QQ 都得關掉。多款的線上游戲應用經驗,如果一個東西沒有被證實過,我們盲目使用做一個項目的話,可能風險是非常大的。Cocos2d-X不斷完善和改進,逐漸增加更多的新技術,比如說跟 HTML5 方面的結合。

介紹一下 Cocos2d-X引擎框架圖,早上我以為作者會講這塊兒,我把這塊兒補上。Cocos2d-X整體框架圖整個引擎有一個導演,在引擎模塊導演有場景的概念,場景上可以掛很多的層,游戲表現都在層上做,在層上可以再加一些特效,再加一些效果,這樣就構成了動態的畫面,再在動態的畫面上做自己的游戲開發邏輯組成一個產品。

下面簡單介紹一下 ios 應用程序的框架,因為這篇 PPT 主要是講 Cocos2d-X跟 ios 框架怎么結合的,所以對于 ios 框架本身是什么的機制非常重要。首先,ios 的應用框架最簡單的主要類就是六個模塊,五有一個整體客戶端,這里面主要是做程序的初始化,還有消息的響應、循環,接下來是 Delegate 是對外圍的擴展,在關鍵點通過回調的方式,讓我們知道現在游戲開始加載,現在游戲進入后臺,這個游戲要關閉了,通過這個可以動態的及時的獲取游戲的運行狀態,做出一些調整。接下來是 UIScreen,就是屏幕大小可以通過這個來獲取;下面是 UIWindow、UIView,這個窗口很直觀,一個游戲至少有一個 UIWindow,會有一個消息響應,會把消息響應放在 UIView 上面,View 也有一個控制器,控制 View 的運行狀態。

ios 這個框架圖,介紹一下消息的響應,通過消息發送給 UIWindow,再上升到各個 UIView,這是整體框架。整體的運行周期,剛開始有一個初始化,消息注冊這類的事情。如果你被打斷會失去焦點,要做什么呢?就要把音效去掉,否則接電話的時候音效還在播放就不人性化。退出的時候要要是你游戲要退出了,要做資源的保存,游戲的清除。還有幾個存在的狀態,在前臺還是后臺,在這些狀態中要對游戲進行相應的處理,否則的話接電話的時候就非常怪,接電話的時候游戲音效還在播放。

接下來介紹 Cocos2d-X跟 ios 是如何結合的?ios 主要是 View 和 UIWindow,所以一個平臺必須有 View,如果沒有 View 否則就沒有辦法表現任何東西。客戶端最主要的 View 界面是捕捉、風和分發系統 TOUCH 事件。外層的 RootViewTontroller 為其控制器,可通過該客觀器對 EAGLView 進行相關的控制。OpenGL-ES 無進行渲染更新。

介紹引擎的總體更新流程,對游戲開發者來說我們必須游戲是怎么運行的,每個運行狀態是什么。一般來說,我們進行了 UIView 初始化完全后,會通過 Delegate,初始化 EAGL View 會調用引起 CCapplication 的 run()接口。一般的邏輯更新會放到 CCDirector 內部,調入之后才會進行熏染更新。第一步進行邏輯更新,第二步進行客戶端的渲染更新。

第三、游戲客戶端總體架構篇

簡單介紹一下客戶端游戲開發的總體架構,這張圖以分層分模塊的方式介紹游戲開發架構中分哪些東西?我們一般會 Cocos2d-X引擎庫、會有音效的播放庫,如果有自己的基礎公共庫也可以放到上一層。要用到簡單的解析工具,接下來是腳本。客戶端主要的模塊劃分,一般客戶端都需要這么多模塊,比如說輸入輸出的模塊。游戲客戶端一般會面臨大量的數據,包括資源數據、道具數據、音效數據、關卡數據,所以我們提出了數據層,主要是對靜態資源進行統一化的管理,比如說加載、卸載、獲取接口之類的事情。另外,就是日志的模塊,開發過程中,一般要記的日志非常多,如果日志通過一種方式記文件的話,可能效率也不太好。如果上線的話,大量的數據是不需要的,所以我們在日志模塊進行了分類,分開關的方式,可以分幾檔日志,一般調試的日志放到一個文件里面去,錯誤的日志放到一個地方,引發崩潰的日志放到一個地方,這樣在開發的時候是非常方便的,日志是分開的,而不是一團糟,也不方便我們記錄一些問題。在上線的時候可以把這些日志開關關掉以提升性能。

網絡層一般對網絡,這里使用的原生的開發,必須對原生的進行封裝,下面我們會有詳細的講解。在這么多的基礎模塊之上,再做游戲邏輯,再到下一個層,除了游戲邏輯層其他的模塊都可以復用,這是復用性很強的總體框架設計。

客戶端主模塊的設計:首先我們使用單一的 CCScene,因為它可以支持多個 Scene 的跳轉,我們拒絕不必要的花哨表現,以簡化代碼實現。基于幀率的游戲更新處理,比如說客戶端的 MINI 無 Finger 集成自 CCNode,且在初始化 Init 函數中通過 schedule 設置游戲邏輯主更新函數 Tick(),以此確保每次渲染之前,都會首先進行邏輯更新處理。完全基于幀率的定時器調度,所有的定時器處理,完全依賴于游戲幀率,簡單直接。網絡模塊總體設計圖,網絡層分為 UDP 的方式,在網絡程序設計中是很著名的設計模式。大致的意思是將不同塊兒的內存節點,以池的方式放在一個隊列中,這種方式是非常快速跟簡捷的。

原生的 SOCKET 封裝,原生的 socket 編程,簡單直接,代碼可控方便定位問題。Non-Blocking I 無O使用費組塞式 IO 模式,無需開辟網絡線度對象 TCP 來說,簡單的連接線程。Selector 輪訓模式,監聽所有處理。

TCP&UDP 具體的區別不在此多說了,主要說一下對于 TCP 來說,為了解決年糕問題,因為 TCP 是自節流的方式,所以存在年糕問題,對于年糕問題技術代碼控制有一個方式,MemNode 來接收數據。對于 UDP 來說,因為它本身是無序的,會使用 Sequence Number 方式處理雜亂,無序包。

定制內存池管理器:絕大部分的數據包大小限制于 4096bytes;Free-List 內存池技術,NO-MEMCPY;避免頻繁 new/delete。

異或加密方式:網絡游戲在服務器有一個非常強的校驗規則,如果有異常服務器就會強制斷開,所以我們要做一些簡單的異或加密。一次異或明文變密文;二次異或就是密文變明文。

僅指游戲數據層:非 ios 常規開發中的數據層,特制游戲內的靜態數據層。

客戶端通常需要大量的靜態資源:圖片資源&音效資源,窗口布局文件;其他游戲策劃數據。

拒絕扁平化文件存儲,一個文件放一個文件的方式,我們要拒絕這種方式。推薦使用 SQLite,在移動平臺上推薦使用輕量級的數據庫。對靜態數據進行統一讀寫,提高 IO 讀取效率。

統一管理:建立統一的加載,更新和卸載登記制;方便游戲邏輯管理和監控。因為我們可以監控每一個模塊,是不是內存超了,服務器保存的內存是不是過大,時時刻刻對內存有一個監控。

數據模塊示意圖:上面每一個具體的數據管理器都會從 DB 開發,這上面生成了很多音效、關卡、道具等各個數據的管理器。

UI 布局示意圖:在客戶端里面最底層做一個 Layer,做重力感應的事件,對這些事件進行統一管理派發。在根窗口上再做游戲界面布局,比如說現在有一個游戲布局文件,這也是一個 Layer,在這之上有多個子 Layer,有控制區域和面板,組成樹型結構,構成了整個游戲的 UI 布局。

下面簡單介紹一下 UI 系統模塊:

窗口布局組:相同功能 UI 組建合并為一個布局 Layout,統一化管理:初始化/加載/更新/事件響應/卸載操作;基于消息事件的處理方式,方便腳本拓展;采用外部配置處理/支持動態化配置。

獨立的根窗口(UILayer):系統最底層的窗口層,所有 Layout 的父窗口,游戲內唯一的監聽 Touch,Accelerometer 事件的 CCLayer,采用用戶輸入,統一化處理。

腳本拓展:Lua 語言拓展,將具體邏輯和游戲框架分離,加強健壯性。

UI 布局配置化文件示意圖:現在開始 UI 的布局,下面有一個 Window,創建一個 Layer,在游戲中會創建一個 CCLayer,名字叫什么,顏色、位置、大小之類的事情。在這個之上要做一個 Tab,在上面也可以初始化。如果做知識腳本處理的話,這個地方可以寫清楚對什么事件執行什么處理。

游戲 UI 系統模塊:關于模態窗口,修改源代碼,在 CCNode 中增加優先級的概念,接著增加父窗口的優先級。所有添加的 UI 組建,需要明確設定是否繼承父節點的優先級,以此形成一個優先級響應隊列,從而實現模態窗口的功能,借助系統 UIView,實現單獨的 View 界面,附加在 EAGLView 之上。

相關優化:所有 Layout 延遲加載,不使用時馬上卸載,釋放內存,合并需要的圖片資源。

游戲音效模塊:這個是大家比較熱心的模塊,我推薦使用 FmodEx,成熟高效,接口簡單統一,無需考試平臺化差異;功能強大,支持 3D 音效,靜音、暫停、音量大小等設置完全滿足日常的音樂開發;當然需要購買。引用計數:相同的音效僅需要公用一份資源數據;及時清除不需要的音效資源,減少內存占用。

人性化設置:增加人性化的設置面板,提升用戶感受;提供動態開啟/關閉,設置音量等功能;按照用途,劃分音效類型,單獨管理;通過 Application Delegate,程序獲得焦點時播放音效,失去時靜音。關于音效資源,音效文件盡可能的小,降低內存占用。

消息事件管理模塊:整個客戶端基于消息事件驅動;實現和調度分離,最大程序降低耦合。

調試器管理器模塊:XCODE 自帶的調試器工具不夠用;需要針對渲染、網絡、邏輯數據進行更細化的監控;兩者結合,宏觀微觀,兩手一起抓。

日志模塊:日志分等級,分輸入方式,完全可配置;不同類型日志,按照等級分開記錄。

還需要什么?消息推送:借用本地和遠程的消息推送機制,提高產品年合度;借助“社會工程”調動玩家積極性;什么叫“社會工程”呢?做殺毒軟件和做木馬的人對這種東西非常理解,比如說我昨天我郵箱還收到社會工程的引導,說什么孤獨少女寂寞加好友有一個鏈接,用這種挑逗性的東西引導你,你一點你的電腦就掛了。移動產品的 UI 界面設計,移動產品的 UI 界面盡量簡單直接,個性化操作。移動產品的特性:考慮移動產品的特性和人們的使用習慣等,有針對性的設計。

我的演講到此結束。謝謝大家。

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!