在進(jìn)行項(xiàng)目架構(gòu)階段,游戲框架可以解決一部分問(wèn)題。剩下的架構(gòu)問(wèn)題還需要根據(jù)不同的項(xiàng)目解決??傊螒蚩蚣苁怯螒蚣軜?gòu)的一部分。

關(guān)于錘子和釘子:

??最近又拿起了《代碼大全》和《暗時(shí)間》,想起來(lái)《暗時(shí)間》的作者維護(hù)了一個(gè)個(gè)人博客,就去逛一逛。

??這幾天一直琢磨一句話(huà):手里拿著錘子看什么都像釘子。于是翻到了博客錘子和釘子。我的這個(gè)行為很好的闡述了什么叫:手里拿著錘子看什么都想釘子- -。

??看完之后深度自省了一下- -

??文章很有趣,推薦大家讀下。

??對(duì)于框架,用錘子和釘子來(lái)比喻不太恰當(dāng),框架就像一把劍,而項(xiàng)目就是錘子。

??框架需要經(jīng)過(guò)項(xiàng)目的千錘百煉,才會(huì)越來(lái)越鋒利(當(dāng)然我的意思不是為了寫(xiě)框架而寫(xiě)框架,框架是副產(chǎn)品,真正鋒利的是自己)。

??對(duì)于這句話(huà):手里拿著錘子看什么都像釘子。我的觀點(diǎn)是:如果以前沒(méi)使用過(guò)這把錘子,當(dāng)你使用這把錘子的時(shí)候,就會(huì)給你帶來(lái)新的視野,新的角度去思考問(wèn)題。

??比如以前自己開(kāi)發(fā)游戲都沒(méi)有框架這種概念的,寫(xiě)代碼都是重新造個(gè)小輪子,輪子很不好用,當(dāng)時(shí)視野又小又不知道有其他替代的解決方案,當(dāng)聽(tīng)到游戲框架這個(gè)詞的時(shí)候才開(kāi)始去思考關(guān)于框架的問(wèn)題,當(dāng)開(kāi)始著手搭建自己的框架時(shí),才會(huì)開(kāi)始注意到以前沒(méi)注意到的東西。

??所以,開(kāi)始打造自己的框架吧!

關(guān)于架構(gòu):

??首先推薦一篇關(guān)于架構(gòu)的好文:10年感觸:架構(gòu)是什么?——消滅架構(gòu)!,文中作者很通俗地解釋了什么是架構(gòu):

   架構(gòu)是一個(gè)約定,一個(gè)規(guī)則,一個(gè)大家都懂得遵守的共識(shí)。那這是什么樣的約定、什么樣的規(guī)則、什么樣的共識(shí)呢?
   我以包為例,我經(jīng)常出差,雙肩背包里裝了不少東西。筆記本電腦、電源、2個(gè)上網(wǎng)卡、鼠標(biāo)、USB線(xiàn)、一盒大的名片、一盒小的名片、口香糖、Mini-DisplayPort轉(zhuǎn)VGA接口、U盤(pán)、幾根筆、小螺絲刀、洗漱用品、干凈衣服、襪子、香水、老婆給我?guī)У哪樃啵ㄋ游易罱?,臉有點(diǎn)黃)、錢(qián)包、Token卡、耳機(jī)、紙巾、USB線(xiàn)、U盤(pán)等。這個(gè)包有很多格子,最外面的格子我放常用的,比如筆、紙、一盒小的名片等;中間的格子一般放的是衣服、襪子、洗漱用品、香水等;靠背的那個(gè)大格子放了筆記本電腦,和筆記本電腦相近的小格子放的是兩個(gè)上網(wǎng)卡、Mini-DisplayPort轉(zhuǎn)VGA接口、大盒名片、記事本,和筆記本電腦相近的大格子放的是電源、鼠標(biāo)、口香糖等。
  我閉著眼睛都可以將我的東西從包里掏出來(lái),閉著眼睛都可以將東西塞到包里!但是,非常不幸的是,一旦我老婆整理過(guò)我的包,那我就很慘了,老是因?yàn)檎也坏綎|西而變得抓狂!更不幸的,要是我那個(gè)不到兩歲的“小可愛(ài)”翻過(guò),就更不得了了。
    這個(gè)包就是我放所有物品的“架構(gòu)”,每一個(gè)東西放置的位置就是我的“約定、規(guī)則、共識(shí)”。倘若我老婆也知道我的“架構(gòu)”、我的“約定、規(guī)則、共識(shí)”,那么不管她怎么動(dòng)我的包,我都照樣能夠輕易的拿東西或者放東西。進(jìn)一步,如果我的同事也知道我的“架構(gòu)”,知道我的“約定、規(guī)則、共識(shí)”,那么他們什么時(shí)候動(dòng)我的包,我也毫無(wú)所知!

架構(gòu)的典型組成部分:

??以下分類(lèi)來(lái)自《代碼大全》3.5小節(jié)的《架構(gòu)的典型組成部分》,并用我的框架來(lái)做了一遍對(duì)比。

由框架解決的架構(gòu)問(wèn)題:

主要的類(lèi):

??書(shū)上寫(xiě)的是:架構(gòu)應(yīng)該詳細(xì)定義所用的主要的類(lèi)。在我的框架里,提供的主要的的類(lèi)有QFSM(狀態(tài)機(jī)),QMsgDispatcher(消息分發(fā)器)。在未來(lái)還會(huì)提供ResourceManager,GameManager等,現(xiàn)在框架中有一份實(shí)現(xiàn),但是其實(shí)現(xiàn)有些復(fù)雜,不易閱讀和理解,等有比較容易理解的實(shí)現(xiàn)時(shí)候會(huì)對(duì)其寫(xiě)一篇文章,還有一些主要的模塊需要客戶(hù)端自己實(shí)現(xiàn)。

資源管理:

??包括資源加載/卸載,音頻、模型、紋理等,是模塊化管理資源還是統(tǒng)一管理資源?,我的框架目前有一份實(shí)現(xiàn),但不夠易用,未來(lái)會(huì)提供易用版本。

國(guó)際化/本地化:

??很多游戲都會(huì)有海外版,國(guó)內(nèi)版,各個(gè)國(guó)家的版本,如何進(jìn)行切換/翻譯?(我的框架未來(lái)會(huì)提供)。

輸入輸出、錯(cuò)誤處理:

??我的框架未來(lái)會(huì)提供錯(cuò)誤日志。

性能:

??1.如何檢測(cè)?框架應(yīng)該提供相應(yīng)的數(shù)據(jù)。

??2.指標(biāo)如何確定?速度?內(nèi)存?成本?,游戲開(kāi)發(fā)中還有Draw Call,GC等等(我的框架未來(lái)會(huì)提供)。

由客戶(hù)端解決的架構(gòu)問(wèn)題

程序組織:

??包括文件結(jié)構(gòu)應(yīng)該反映文件或文件夾之間的關(guān)系,要思考以什么方式組織比如:先按照模塊分文件結(jié)構(gòu)再按照MVC或者先按照MVC分,然后再按照每個(gè)模塊來(lái)區(qū)分,再推薦一篇好文:Unity3D手游開(kāi)發(fā)實(shí)踐《騰訊桌球》客戶(hù)端開(kāi)發(fā)經(jīng)驗(yàn)總結(jié)(文章略長(zhǎng)),文章的第一小節(jié)就有講到關(guān)于文件組織。

數(shù)據(jù)設(shè)計(jì):

??書(shū)中指的是設(shè)計(jì)數(shù)據(jù)庫(kù)表。在游戲框架中是指提供給客戶(hù)端使用的數(shù)據(jù)結(jié)構(gòu)定義,包括何種結(jié)構(gòu)定義玩家的數(shù)據(jù)信息,策劃表結(jié)構(gòu)的定義等等。好的數(shù)據(jù)結(jié)構(gòu)定義 + 爛的代碼質(zhì)量 >> 壞的數(shù)據(jù)結(jié)構(gòu)定義 + 好的代碼質(zhì)量。

業(yè)務(wù)規(guī)則:

??屬于游戲邏輯范疇,需客戶(hù)端實(shí)現(xiàn)。

用戶(hù)界面設(shè)計(jì):

??用戶(hù)界面組件之間如何通信,如何管理?用戶(hù)界面和業(yè)務(wù)規(guī)則還有數(shù)據(jù)之間如何通信?通信方面已提供消息分發(fā)器(QMsgDispatcher)。

安全性:

??資源如何加密,如何防破解,防反編譯,安全數(shù)據(jù)檢查,服務(wù)器驗(yàn)證等等。

可伸縮性:

??可伸縮性是指滿(mǎn)足未來(lái)需求的能力,包括程序的可擴(kuò)展性,用戶(hù)量增長(zhǎng)時(shí)系統(tǒng)的策略等等。

互用性:

??如果預(yù)計(jì)這個(gè)系統(tǒng)會(huì)與其他軟件或硬件共享數(shù)據(jù)或資源,架構(gòu)應(yīng)該描述如何完成這一任務(wù)。

容錯(cuò)性:

??舉個(gè)例子:當(dāng)界面跳轉(zhuǎn)時(shí),系統(tǒng)不可以接受輸入(我的框架不提供)。

關(guān)于買(mǎi)還是造的決策:

??Unity可以有很多可以使用的插件、C#庫(kù)可以使用,很多問(wèn)題迎刃而解,(我的框架不會(huì)包含任何插件,項(xiàng)目不同需要的插件也不同)。

核對(duì)表摘自《代碼大全》:

1.程序的整體組織結(jié)構(gòu)是否清晰?是否包含一個(gè)良好的架構(gòu)全局觀(及其理由)?

2.是否明確定義了主要的構(gòu)造塊(包括每個(gè)構(gòu)造塊的職責(zé)范圍及其他構(gòu)造塊接口)?

3.是否明顯涵蓋了"需求"中列出的所有功能(每個(gè)功能對(duì)應(yīng)的架構(gòu)塊不太多也不太少)?

4.是否描述并論證了那些最關(guān)鍵的類(lèi)?

5.是否描述并論證了數(shù)據(jù)設(shè)計(jì)?

6.書(shū)否詳細(xì)定義了數(shù)據(jù)庫(kù)的組織結(jié)構(gòu)和內(nèi)容?

7.是否支出了所用關(guān)鍵的業(yè)務(wù)規(guī)則,并描述其對(duì)系統(tǒng)的影響?

8.是否描述了用戶(hù)界面設(shè)計(jì)的策略?

9.是否將用戶(hù)界面模塊化,使界面的變更不會(huì)影響程序其余部分?

10.是否描述并論證了處理I/O的策略?

11.是否估算了稀缺資源(如線(xiàn)程、數(shù)據(jù)庫(kù)連接、句柄、網(wǎng)絡(luò)帶寬等)的使用量,是否描述并論證了資源管理的策略?

12.是否描述了架構(gòu)的安全需求?

13.架構(gòu)是否為每個(gè)類(lèi)、每個(gè)子系統(tǒng)、或每個(gè)功能域(functionality area)提供空間與實(shí)踐預(yù)算?

14.架構(gòu)是否描述了如何達(dá)到可伸縮性?

15.架構(gòu)是否關(guān)注互操作性?

16.是否描述了國(guó)際化/本地化的策略?

17.是否提供了一套內(nèi)聚的錯(cuò)誤處理策略?

18.是否規(guī)定了容錯(cuò)的辦法(如果需要)?

19.是否正式了系統(tǒng)各個(gè)部分的技術(shù)可行性?

20.是否詳細(xì)描述了過(guò)度工程的方法?

21.是否包含了必要的"買(mǎi) vs 造"的決策?

22.架構(gòu)是否描述了如何加工被復(fù)用的代碼,使之符合其他架構(gòu)的目標(biāo)?

23.是否將架構(gòu)設(shè)計(jì)得能夠使用很可能出現(xiàn)的變更?

24.你,作為一名實(shí)現(xiàn)該系統(tǒng)的程序員,是否對(duì)這個(gè)架構(gòu)感覺(jué)良好?

歡迎討論!

附:我的框架QFramework地址

轉(zhuǎn)載請(qǐng)注明地址:涼鞋的筆記

微信公眾號(hào):liangxiegame

http://www.cnblogs.com/liangxiegame/p/Unity-you-xi-kuang-jia-da-jian-liu-guan-yu-kuang-j.html