【轉(zhuǎn)】MMO即時戰(zhàn)斗:地圖角色同步管理和防作弊實現(xiàn)

---轉(zhuǎn)自CSDN

一留储、前言

????????無論是端游态秧、頁游董虱、手游如果是采用了MMO即時戰(zhàn)斗游戲模式,基本都會遇到同屏多角色實時移動申鱼、釋放技能愤诱、戰(zhàn)斗等場景,于是自然也需要實現(xiàn)如何管理同屏內(nèi)各種角色的信息同步:例如角色的位置捐友、以及角色身上的裝備淫半、時裝、buffer等狀態(tài)的實時切換匣砖。同步在網(wǎng)絡(luò)游戲中是非常重要的科吭,它保證了每個玩家在屏幕上看到的東西大體是一樣的,解決同步問題的最簡單的方法就是把每個玩家的動作都向其他玩家廣播一遍猴鲫,這里其實就存在一些問題:1向哪些玩家廣播对人,廣播哪些消息;2如果網(wǎng)絡(luò)延遲怎么辦拂共。角色的定義一般包括人物牺弄、怪物、寵物匣缘、NPC等猖闪,由于這各種角色在地圖上基本處于隨時不規(guī)則移動并且各種屬性信息也處于不斷變化中(例如:變身、穿脫裝備肌厨,甚至使用隱身藥水)培慌,所以需要實現(xiàn)地圖的區(qū)塊上各種角色的列表管理、切換地圖柑爸、進出區(qū)塊管理吵护,實時同步角色的位置信息,以及附近角色的屬性信息變化到游戲內(nèi)相應(yīng)的玩家身上表鳍,而且這些信息的同步需要實時馅而,否則基本就失去了即時戰(zhàn)斗的意義。一般會采用長連接的方式譬圣,方便實時推送交互信息瓮恭。同時由于MMO網(wǎng)絡(luò)游戲環(huán)境的復(fù)雜性,管理好角色信息的同時還需要保證游戲的公平性厘熟,防止作弊屯蹦、外掛,例如:判定人物的移動速度異成蹋或者瞬間移動登澜,糾正人物釋放技能的時間間隔等,相信只要在公網(wǎng)運營過的游戲都多少會遇到防作弊的問題飘庄。本文主要結(jié)合參與開發(fā)并在外網(wǎng)運營了幾年的一款MMORPG游戲做討論和分析脑蠕,游戲規(guī)模國內(nèi)最高同時30w在線,同區(qū)最高上w人跪削,相信會有一定的實戰(zhàn)參考意義谴仙,當(dāng)然也有討論和改進的空間,這也是寫這篇文章的主要目的碾盐。

二狞甚、地圖以及角色管理

????????無論是3D還是2D游戲:既然是即時地圖戰(zhàn)斗,那就自然有空間的概念廓旬,于是就產(chǎn)生了地圖哼审,一般游戲內(nèi)玩家最經(jīng)常發(fā)生的交互也是在地圖上面發(fā)生的。mmorpg的地圖一般會有固定的一些屬性:例如:地圖的寬度孕豹、高度涩盾、最大角色數(shù)、地圖上面怪物的AI励背、以及常用的九宮格劃分區(qū)塊大小等等屬性春霍。地圖寬高度用于控制地圖的大小,最大角色數(shù)用于控制地圖的最大承載容量叶眉,防止過載址儒,影響玩家體驗芹枷。例如:圖1對地圖的部分關(guān)鍵屬性進行定義

2.1地圖區(qū)塊劃分

????????通常的游戲玩法:地圖上面的玩家在地圖里面只需要看到視野內(nèi)周圍發(fā)生的事情,并不需要關(guān)心不同地圖莲趣,甚至相同地圖離自己很遠(yuǎn)的地方此刻正在發(fā)生的實時場景鸳慈,即使要關(guān)心,一般也是通過聊天公告等信息同步喧伞,并不需要收看現(xiàn)場直播)走芋。于是,對地圖采用分而治之的方法潘鲫,把每張地圖進行區(qū)塊切分翁逞,定義好區(qū)塊的大小,例如圖1采用正方形的劃分方法溉仑,規(guī)定每個區(qū)塊的邊長為6挖函,一般區(qū)塊的大小不會經(jīng)常進行隨意變動(除非在一些特殊的副本地圖里面,該值如果進行了變化則需要進行特殊處理)這就是地圖區(qū)塊的概念浊竟。于是每個在線玩家在地圖上面都會被定位到屬于自己的區(qū)塊挪圾,而當(dāng)玩家在地圖上面移動,則會在不同的區(qū)塊之間進行來回的切換逐沙。同時哲思,玩家在地圖里面必然需要實時看到周圍地圖發(fā)生的場景,一般采用九宮格的方式吩案,如圖2棚赔,3.:也就是說會實時同步包括玩家所在區(qū)塊在內(nèi)的周邊9個區(qū)塊的角色信息給予相應(yīng)的玩家,理論上玩家只能看到9宮內(nèi)發(fā)生的事情徘郭。

2.2地圖管理

????????劃分好了地圖區(qū)塊之后靠益,地圖的管理至少還要包括:a阻擋的信息:包括靜態(tài)阻擋和動態(tài)阻擋:角色移動的同時需要考慮地圖區(qū)塊里面的阻擋信息(例如:來自角色阻擋、來自地圖固定建筑的阻擋等)b角色管理:需要管理地圖上面角色實時信息残揉,并且維護各個區(qū)塊的最新角色實時列表信息:用于九宮格內(nèi)玩家信息的同步胧后。對于進入地圖固定區(qū)塊的玩家需要實時同步自己的信息給予附近的玩家,告訴他們有角色進入視野了抱环,相反也要同步區(qū)塊周圍的角色信息給該玩家壳快,同時,對于離開地圖區(qū)塊的玩家镇草,需要同步信息告訴附近的玩家離開視野的消息眶痰,保證下一幀該角色不會再出現(xiàn)在該區(qū)塊上。而處在同個9宮格內(nèi)的玩家梯啤,也需要互相同步屬性信息竖伯,保證看到的是最新的角色屬性變化位置信息等;并且地圖上面的NPC、怪物等角色自動刷新也需要地圖邏輯來處理七婴,例如怪物死亡之后,需要處理怪物退出游戲世界祟偷,一般還要讓怪物經(jīng)過一段時間自動復(fù)活,重新加入地圖打厘,另外還有地圖上面怪物的AI修肠,會在另外一篇文章單獨討論。

????????具體角色在地圖上面管理代碼的實現(xiàn):針對所有角色我們首先采用定時刷新的機制婚惫,在所有的角色身上綁定定時器,例如:在GamePlayer,GameMonster,GameNpc定時觸發(fā)刷新機制:根據(jù)玩家實時所在的地圖比較前后所在的區(qū)塊是否一致魂爪,如果不一致先舷,自然就需要處理附近玩家有角色進出視野的信息。例如:角色A定時觸發(fā)了刷新機制滓侍,發(fā)現(xiàn)已經(jīng)從地圖亞特蘭蒂斯區(qū)塊99進入到了亞特蘭蒂斯98區(qū)塊蒋川,這時,自然就要重新計算玩家的九宮格區(qū)塊變化撩笆,通知相關(guān)有區(qū)塊信息變化上面的地圖角色位置信息:并且需要實時維護一份每個區(qū)塊每張地圖上面的角色列表捺球,這樣做的目的:作為地圖管理者,有必要知道當(dāng)前我的地圖上到底都有誰夕冲,常用于玩家附近的聊天氮兵,玩家同地圖的聊天,并且根據(jù)玩法一般還有地圖刷怪通知該地圖所有玩家的信息等需求歹鱼。另外泣栈,單獨針對玩家的位置信息管理,則還跟游戲的特定玩法有關(guān)系弥姻,例如可以飛地圖的游戲南片,則當(dāng)玩家實時切換地圖之后,則會直接觸發(fā)進出區(qū)塊視野的信息庭敦,而并不需要等到定時器觸發(fā)來更新角色位置信息疼进,還有玩家重新登錄或者退出游戲,自然而然也要實時處理相應(yīng)的位置同步信息秧廉;還有玩家換裝伞广、使用技能、上下坐騎等都即時發(fā)消息通知九宮格內(nèi)的玩家同步屬性信息

三疼电、人物的移動

????????對于mmorpg赔癌,玩家的移動幾乎無時不在,并且相對于怪物的移動澜沟,寵物的移動等灾票,玩家的移動更加核心,更加復(fù)雜不可控茫虽。特別是在大規(guī)模團戰(zhàn)中刊苍,玩家會經(jīng)常移動既们,于是需要管理好地圖上玩家的移動,如果管理不好正什,則會出現(xiàn)大規(guī)模的外掛等啥纸,嚴(yán)重影響游戲的公平性,對于整個游戲也幾乎是毀滅性的打擊

3.1人物移動實現(xiàn)方法

????????通常對于游戲內(nèi)玩家的移動有幾種處理方法:1客戶端只通知服務(wù)器要移動的位置婴氮,但并不需要經(jīng)過后臺的驗證就直接開始移動了斯棒,通常服務(wù)器需要對最終客戶端移動的位置進行校驗,如果沒有該步檢測主经,那外掛就可以為所欲為了2客戶端每一次移動都需要通過服務(wù)器的驗證荣暮,然后再進行移動,該方法在網(wǎng)絡(luò)延遲的情況下罩驻,會變得比較不流暢穗酥,給玩家?guī)砗懿凰母杏X。方法1同樣存在問題:同步的誤差惠遏,特別是在網(wǎng)絡(luò)延遲特別嚴(yán)重的時候:比如有一個玩家A向服務(wù)器發(fā)了條指令砾跃,說我現(xiàn)在在P1點,要去P2點节吮。指令發(fā)出的時間是T0抽高,服務(wù)器收到指令的時間是T1,然后向周圍的玩家廣播這條消息透绩,消息的內(nèi)容是“玩家A從P1到P2”有一個在A附近的玩家B厨内,收到服務(wù)器的這則廣播的消息的時間是T2,然后開始在客戶端上畫圖渺贤,A從P1到P2點雏胃。這個時候就存在一個不同步的問題,玩家A和玩家B的屏幕上顯示的畫面相差了T2-T1的時間志鞍,要解決該問題瞭亮,參考了之前的一篇文章,大致的內(nèi)容如下:“有個解決方案:預(yù)測拉扯固棚,首先要定義一個值叫:預(yù)測誤差统翩。然后需要在服務(wù)器端每個玩家連接的類里面加一項屬性,叫l(wèi)atency此洲,然后在玩家登陸的時候厂汗,對客戶端的時間和服務(wù)器的時間進行比較,得出來的差值保存在latency里面呜师。還是上面的那個例子娶桦,服務(wù)器廣播消息的時候,就根據(jù)要廣播對象的latency,計算出一個客戶端的CurrentTime衷畦,然后在消息頭里面包含這個CurrentTime栗涂,然后再進行廣播。并且同時在玩家A的客戶端本地建立一個隊列祈争,保存該條消息斤程,直到獲得服務(wù)器驗證就從未被驗證的消息隊列里面將該消息刪除,如果驗證失敗菩混,則會被拉扯回P1點忿墅。然后當(dāng)玩家B收到了服務(wù)器發(fā)過來的消息“玩家A從P1到P2”這個時候就檢查消息里面服務(wù)器發(fā)出的時間和本地時間做比較,如果大于定義的預(yù)測誤差沮峡,就算出在T2這個時間疚脐,玩家A的屏幕上走到的地點P3,然后把玩家B屏幕上的玩家A直接拉扯到P3帖烘,再繼續(xù)走下去亮曹,這樣就能保證同步橄杨。更進一步秘症,為了保證客戶端運行起來更加smooth,我并不推薦直接把玩家拉扯過去式矫,而是算出P3偏后的一點P4乡摹,然后用(P4-P1)/T(P4-P3)來算出一個很快的速度S,然后讓玩家A用速度S快速移動到P4采转,這樣的處理方法是比較合理的聪廉,這種解決方案的原形在國際上被稱為(Full plesiochronous)系馆,當(dāng)然夺巩,該原形被我篡改了很多來適應(yīng)網(wǎng)絡(luò)游戲的同步,所以而變成所謂的:預(yù)測拉扯”

方法1實現(xiàn):進行人物移動管理旨袒,需要定義以下相應(yīng)的移動消息:具體的消息定義如下

(a)MSG_PLAYERMOVINGPOSTOSERVER //客戶端向服務(wù)器端發(fā)送移動中玩家位置改變

(b)MSG_PLAYERMOVINGPOSANDDIRTOSERVER, //移動中玩家位置和朝向改變

(c)MSG_PLAYERPOSTOSERVER,//原地不動玩家的位置消息

(d)MSG_PLAYERPOSANDDIRTOSERVER,//原地不動玩家的位置和朝向消息

????????消息a和b負(fù)責(zé)向服務(wù)器同步人物需要移動到的目標(biāo)位置和朝向信息察绷,服務(wù)器需要對該位置信息進行阻擋干签、狀態(tài)判斷等合法性檢測通過后,則同步角色位置信息到9宮格內(nèi)的其它角色拆撼,相反如果失敗例如移動到阻擋里面容劳,則需要通知客戶端糾正位置。消息c和d則同時用于前后臺校驗玩家的位置信息闸度,例如角色一定時間內(nèi)移動后最終停下來的位置竭贩。

四、防作弊

????????常用的前后端消息加密莺禁,以及客戶端加殼的機制幾乎已經(jīng)是通用的做法留量,所以這里不做重復(fù),而且再高明的加密或者加殼幾乎都有被破解的可能,但這些機制依然要堅持使用肪获,至少可以提高作弊的成本寝凌,可以延長游戲的壽命,下面再描述我們目前除了消息加密和加殼之外采用的方法

限制客戶端發(fā)送移動消息的頻率:一般游戲內(nèi)玩家并不需要進行太過于頻繁的移動孝赫,就算需要頻繁的移動客戶端也可以對移動進行合并處理再上報移動位置信息较木,所以對于頻繁的移動消息完全可以當(dāng)做非法請求不處理。目的用于防止外掛封包頻繁的發(fā)送移動消息青柄,進行非法的快速移動(例如運營中發(fā)現(xiàn)玩家使用變速齒輪等插件伐债,用于搶掉落寶箱等場景,會有玩家進行瞬移到寶箱附近拿走物品致开,這時候守門的人就崩潰了峰锁,嚴(yán)重影響了游戲的公平性)

移動距離檢測:記錄客戶端每次發(fā)送移動消息的服務(wù)器時間間隔,根據(jù)人物的正常移動速度双戳,算出合法的移動范圍(一般需要加上一定的誤差虹蒋,由于網(wǎng)絡(luò)的延遲等原因,不可能做到100%精確)飒货,如果發(fā)現(xiàn)不正常的移動速度魄衅,一般先采用和平的方法,讓該移動消息失效塘辅。目的用于防止外掛封包發(fā)送不符合人物移動速度的位移信息

消息時間校驗:使用外掛的玩家晃虫,例如變速齒輪等插件,而且變速齒輪可以調(diào)整倍數(shù)扣墩,所以一般可以嘗試出游戲的檢測頻率哲银,因此必須采取手段防止玩家使用該插件。分析出變速齒輪的原理呻惕,一般是通過修改API函數(shù)GETTICKCOUNT和TIMEGETTIME荆责,騙過了游戲和程序的定時器導(dǎo)致游戲和程序速度被改變。服務(wù)端發(fā)送時間種子到客戶端.客戶端做個差值.舉個例子:服務(wù)端發(fā)來的種子是timeGetTime()=2000亚脆,客戶端本地取時間是timeGetTime()=1000那么差值就是1000客戶端所有的協(xié)議中增加時間字clienttime=timeGetTime()+1000到服務(wù)端做院。服務(wù)端取當(dāng)前時間對這個時間做個容錯校驗.容錯范圍需要你自己調(diào)節(jié).一般最好設(shè)大點.不然容易誤判.

五、運營中遇到的問題和優(yōu)化空間

5.1服務(wù)器性能瓶頸

????????即時戰(zhàn)斗類游戲一般都會設(shè)計有跨服戰(zhàn)型酥、國戰(zhàn)等這樣的玩法山憨,會遇到某時段同屏角色數(shù)非常多的特殊場景,這時候大量的角色戰(zhàn)斗中移動和釋放技能弥喉,上下坐騎郁竟、必然會造成消息量暴增,服務(wù)器壓力驟增由境。以線上運營的游戲為例棚亩,解決辦法:

????????首先蓖议,對峰值期間的消息進行統(tǒng)計分析,對頻繁發(fā)送并且流量大的消息進行重點監(jiān)測讥蟆,例如:分析出來大量角色移動進入?yún)^(qū)塊勒虾,同步角色信息包括人物身上的時裝,坐騎瘸彤,寵物修然、裝備等,會有一個峰值质况。但游戲中一般大規(guī)模團戰(zhàn)的地圖中愕宋,玩家一般最先關(guān)心的是敵人的動向位置信息,反而對人物的坐騎结榄,時裝中贝,裝備等信息可以延后,于是可以對某些特殊的場景例如國戰(zhàn)地圖臼朗,跨服戰(zhàn)地圖進行特殊的刷新機制進行優(yōu)化邻寿,當(dāng)區(qū)塊內(nèi)角色數(shù)到達(dá)一定數(shù)量后,同步信息只同步人物位置视哑,模型等信息绣否,減少消息的流量

????????其次,為了防止高峰時期服務(wù)器處理消息量過大黎炉,待處理消息隊列以及發(fā)送隊列擁擠枝秤,造成雪崩醋拧。對消息進行分級別定義慷嗜,定義消息的時候進行消息級別定義,目前分為低丹壕、中庆械、高三種消息類型,并且限制每種類型在等待處理的消息隊列中的最大個數(shù)菌赖,每種消息類型在隊列中大于特定的值缭乘,則直接丟棄,不處理琉用。例如:服務(wù)器ping消息堕绩,人物跳躍等則可以定義為優(yōu)先級低的消息,同理對于服務(wù)器需要發(fā)送出去的消息包也進行分級

5.2刷錢刷經(jīng)驗

????????一般外網(wǎng)運營一段時間的游戲很多都會遇到刷錢刷經(jīng)驗的bug邑时,也許一些沒有交易系統(tǒng)或者休閑類的游戲不會遇到奴紧,不過反正我們遇到了,就算沒遇到做好預(yù)防措施也是必要的晶丘。解決方案是:請數(shù)值策劃定制好根據(jù)游戲玩法角色對應(yīng)一天最多能獲得多少經(jīng)驗和金幣黍氮,由服務(wù)器進行合法性檢測唐含,如果超過了閥值則必須采取處理措施。我們模仿了現(xiàn)實社會沫浆,給游戲設(shè)計了一張監(jiān)獄地圖捷枯,監(jiān)獄顧名思義就是給犯法的人準(zhǔn)備的,游戲里面發(fā)現(xiàn)有作弊专执,或者刷錢刷經(jīng)驗等的行為都會自動被傳送到該地圖淮捆,該地圖沒有傳送點,只能一直呆在里面不能打怪升級也不能交易等諸多限制本股,進入該地圖的玩家只有等坐牢時間到期了或者通過客服申訴成功争剿,才會被傳送出該地圖

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市痊末,隨后出現(xiàn)的幾起案子蚕苇,更是在濱河造成了極大的恐慌,老刑警劉巖凿叠,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涩笤,死亡現(xiàn)場離奇詭異,居然都是意外死亡盒件,警方通過查閱死者的電腦和手機蹬碧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炒刁,“玉大人恩沽,你說我怎么就攤上這事∠枋迹” “怎么了罗心?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長城瞎。 經(jīng)常有香客問我渤闷,道長,這世上最難降的妖魔是什么脖镀? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任飒箭,我火速辦了婚禮,結(jié)果婚禮上蜒灰,老公的妹妹穿的比我還像新娘弦蹂。我一直安慰自己,他們只是感情好强窖,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布凸椿。 她就那樣靜靜地躺著,像睡著了一般毕骡。 火紅的嫁衣襯著肌膚如雪削饵。 梳的紋絲不亂的頭發(fā)上岩瘦,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音窿撬,去河邊找鬼启昧。 笑死,一個胖子當(dāng)著我的面吹牛劈伴,可吹牛的內(nèi)容都是我干的密末。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼跛璧,長吁一口氣:“原來是場噩夢啊……” “哼严里!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起追城,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤刹碾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后座柱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迷帜,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年色洞,在試婚紗的時候發(fā)現(xiàn)自己被綠了戏锹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡火诸,死狀恐怖锦针,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情置蜀,我是刑警寧澤奈搜,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站盾碗,受9級特大地震影響媚污,放射性物質(zhì)發(fā)生泄漏舀瓢。R本人自食惡果不足惜廷雅,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望京髓。 院中可真熱鬧航缀,春花似錦、人聲如沸堰怨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽备图。三九已至灿巧,卻和暖如春赶袄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抠藕。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工饿肺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盾似。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓敬辣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親零院。 傳聞我的和親對象是個殘疾皇子溉跃,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容

  • GameRes游資網(wǎng)發(fā)布, 文 /韋易笑 手游頁游和端游的服務(wù)端本質(zhì)上沒區(qū)別告抄,區(qū)別的是游戲類型撰茎。 類型1:卡牌、跑...
    colourstar閱讀 1,575評論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理打洼,服務(wù)發(fā)現(xiàn)乾吻,斷路器,智...
    卡卡羅2017閱讀 134,704評論 18 139
  • 文章是我轉(zhuǎn)載的拟蜻,沒找到原作者地址绎签。 介紹 作為一個程序,你想過網(wǎng)絡(luò)多人對戰(zhàn)游戲是怎么做出來的嗎酝锅? 從外行的角度來看...
    齊葩閱讀 2,269評論 0 14
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,303評論 25 707
  • 感覺眼睛有點點不對诡必,明天再畫一幅底稿。怕上色毀所有 后面的是重新畫好的搔扁,麻煩老師幫忙看看哪個好點爸舒,謝謝
    悠悠何文閱讀 716評論 3 0