在顶级游戏开发的过程中需要怎样的编程实力?
做游戲技術主要講究的是套路,以及對套路的掌握程度。比如說你要搞個體積光,那么從用mesh+uv動畫,到volumetric scattering你都得知道,而且要知道這些方案的優缺點,以及具體的實現細節,比如camera會不會到體積光里邊之類的,這種細節的了解會讓你更加有信心做出各種技術決策。
所以3a級游戲的大神技術也是對各種領域的套路玩得比較溜,這里我也分享一些做游戲20來年自己領悟出的一些套路吧。
美術用工具輸出的3d模型,材質一定要做一個導出插件,否則做出來和進引擎效果不一樣,就只能做做手游這種無光照的手繪貼圖質量的產品了。
動畫要想不滑步,就只能用animation driven的方法,這個需要跟策劃做好深度的溝通,得讓策劃知道移動不是說配置一個速度就可以了,得去找動畫師一起調整移動的動畫。
動態天氣的困難不是制作上的困難,是可以用lightmap的物件會少很多,性能不一定扛得住,這個要在項目初期一定得和制作團隊溝通清楚。
球類游戲要達到非常自然的動畫,一方面動畫肯定是要動捕的,另一方面更重要的是搭建一套動畫選擇機制,然后根據運動中的球類位置來選擇最合適的動畫來匹配,再加上小部分的ik。
頭上冒字和冒血這種hud就應該用hud的標準方法來制作,切記不能涂省事用ui的方法,對性能效率會有非常大的影響。
音頻對最終品質影響很大,一般遵循46原則,即圖像資源在最終包中占6成,音頻資源占4成。給音頻設計師配置一個獨立的程序來達成音頻的設計需求。
狀態機最好是用可視化的方法來實現,游戲中80%的bug都是和狀態沒切對有關,有個可視化的狀態機對于找bug非常方便。
control是最需要狀態機化設計的(不同的情況下按同樣的按鍵達成不同的邏輯)
做面部表情,如果不是捕捉就用骨骼簡單搭搭就好,如果是捕捉,制作成本會變得非常的高(制作各種morphing target)
對最終畫面影響最大的是鏡頭效果,所以盡量節省渲染時間留給鏡頭特效。一般影響最大的是校色,如果硬件平臺允許盡量給美術提供帶深度校色的工具。
有比較寬廣視野的游戲,室外可以用一些很取巧的方法來模擬mie scattering和rayleigh scattering,加上哪怕是假的對畫面的提升也是巨大的。
對于不同的數據采用不同的配置方法,不要什么數據都用excel,對于有可視化需求的配置,比如ui或者角色身上需要裝配一些武器的,提供可視化的工具。對于需要描述父子關系的例如技能樹解鎖之類的用json或者xml來描述,對于純數字邏輯的就用csv就好了。
場景的材質如果制作normal map對于你們團隊比較復雜,多加一層detail map也能對效果獲得較大的提升。
角色的材質,如果性能有限或者說制作成本無法承受的話specular map比normal map的效果要好。
如果角色會近距離看臉,臉部的眼睛一定要單獨拿出來處理,臉可以糊,眼睛一定不能糊。
腳步聲的標準做法是在地面上放一層低模做和腳的碰撞檢測(腳步聲如果追求真實,最少得有3個以上的樣本隨機)
如果要提升動畫效果,考慮主角的前臂加上twist骨骼,左肩和右肩不要從脖子上搭建骨骼,要從胸口開始(做head lookat的時候效果會更好)
衣服的標準做法是通過貼圖來控制哪些頂點受skin和物理影響的權重比,那張貼圖還可以用一個通道來控制流汗的時候哪些地方的smothness要提高。
搭建一個運行時數據庫,并且游戲中經常需要訪問的數據都放入數據庫,可以類似redis那樣非常簡單的提供一個set和get就行了,運行時數據庫可以幫助你找到絕大多數bug。
制作ai盡量使用行為樹,并且花時間一定要讓策劃具備編輯和調式行為樹的能力。
頂點色可以各種花式使用,無論是用來bake ao還是決定detail map的權重,都可以用很低廉的代價來獲得非常棒的效果。
動畫不是在任何時候都可以blend的,要想效果好,牢記:左腳落地的時候只能blend到左腳落地開始的動畫,右腳同上。
做上下樓梯的locomotion的時候,用橢球碰撞體會非常簡單的獲得還不錯的效果。
如果畫面會經常快速的運動,可以加入一個vector based motionblur,效果會出奇的好。
要想場景生動,一定要使用decal,一個方便美術的decal工具可以讓美術一天之內讓整個場景提升幾個檔次。
暫時想到這些,不說了,休息好了繼續干活。
~~~~~繼續更新一波套路
解決alpha透貼排序的標準方法是兩次繪制,第一次在不透明隊列里渲染一次alpha test(cutout),打開zwrite,第二次在transparent隊列里開alpha blend不開zwrite,ztest lessequal渲染就能還原美術在maya里看到的效果。
彈簧是個非常好用的物理組件,其虎克系數可以有效的模擬力的衰減來做出很多感人的效果,從乳搖,臀搖,尾巴,頭發馬尾,布料,臉上被重拳擊中的肌肉變化都可以看到彈簧的身影。
adobe fuse cc + mixamo可以非常快速的搭建模型和動畫來幫助策劃找到劇情的場景的感覺。
腳下ik從程序來講是很方便實現的,大多數引擎都有ik功能,但是工作流程我發現很多公司都沒有正確使用。正確的流程是對輸出的動畫有一個左右腳高低的分析工具,逐動畫生成每個腳步離水平面的高度曲線,然后運行時根據腳步的高低來決定ik和skin的權重。
鏡頭的設置很重要,最好給美術一個和相機鏡頭類似的算法來反過來計算fovx和fovy,我看到很多產品的fov都是一水的60之類的。
對于類似鐵絲網或者其他半透物體的mipmap的標準做法是先自動生成mipmap,然后要美術手動的來降低不同lod貼圖的alpha,換句話說近處看有鐵絲網,遠看就只有框中間近乎全透了來降低鋸齒感。
dx10以上的平臺上特效的shader加一句根據當前depth和已經繪制的depth的差來控制alpha可以實現簡單且效果不錯的軟粒子效果。
頭發的物理效果可以參考衣服的做法,發根受skin影響多,發梢受物理多一些即可。(額前劉海受物理要關掉重力)
如果實時sss負擔太重,可以簡單的把模型厚度信息烘培在頂點色的某個通道上,然后只需三兩行代碼就可以讓皮膚有sss效果。
看到好多項目用雙面材質只是在shader中簡單加一句cull none,這個是完全錯誤的實現。正確的做法是需要把三角形索引信息走vs傳遞進來,然后判斷是否順逆時針,對于反面需要把法線反轉才能獲得正確的渲染結果。
先更新到這。
完了,感覺思緒開始打開了,又更新一些,怕一會會忘。
動畫驅動的模式下,轉向最少需要8個動畫,原地左轉90,右轉90,左轉180,右轉180,移動同樣四個,然后根據控制器的輸入來決定混合的權重,一般神海這種級別的產品光locomotion牽扯到的動畫會在40-50個這種量級。
對于衣物和皮膚,detail normal十分重要,可以瞬間讓你的衣服能看出針織的材質。
處理聲音的時候,遠處的聲音混響需要程序來手動提升,近處降低混響,對臨場感增加很多。
聲音如果樣本有限,也一定要做隨機,哪怕就一個腳步聲樣本,播放的時候也應該隨機pitch和volume。
給策劃提供一個調整動畫曲線的工具,橫軸是動畫時間,縱軸是動畫播放的速度,策劃通過這個工具可以調整出情緒非常飽滿的動畫效果(例如:攻擊前搖動畫速度變慢,攻擊過程加速之類的)這個需要和動畫師溝通清楚,要求他們只需要k好幾個相關pose即可。
卡通渲染的時候有一步是非常關鍵也是很多公司都忽略的,就是手動調整模型法線,這一步得在美術工具內完成,通常是定義toon shading的光方向之后,通過調整法線來讓一些部位有“看起來”較為舒服的受光,主要是鼻子,腋下和兩個胯這三個位置。
游戲加載的正確做法是,在出包的時候對各資源的單位加載時間進行預計算(適合配置固定的主機游戲)。之后在運行時加載的時候,根據每一幀cpu的可用空閑時間來決定當前幀可以加載的資源類型和數量。
渲染陰影的時候,很多人都會忽略繪制陰影那個pass的優化,以前做上一代游戲機的時候所有會有實時陰影的模型都會做一個低模和專門的材質(如果有透貼陰影的需求)。
對于寫實類型的游戲,decals的正確制作方法是拿相機去拍,比如地上的水漬,墻上的裂痕,車上的劃痕之類的,開閃光燈拍照,然后回來在ps里面摳出來。
有很多arpg的游戲中都有霸體的設計,霸體中不會受擊,其實這個的正確做法是動畫新增一個受擊層,在播放霸體動畫的同時輕微的blend一個受擊動畫,打擊感會舒服很多。
午飯時間!
反響不錯啊,再來一波=)
寫實風格的貼圖,推薦盡量使用Substance制作,打包不同目標平臺的時候,可以根據目標平臺的實際硬件情況,決定是Bake出Texture還是用Procedual Texture,其實很多時候會發現很多PBR貼圖除了Google圖片出來修改之外,只有Substance才能比較好的制作出來。
?
有一個關于Animation Driven的系統中,AI的制作問題,主要是因為動畫狀態機自己有自己的行為準則,所以傳統的AI設計思路就變得比較無力,比如說我希望我的NPC每0.3秒攻擊一次,但是攻擊動畫本身就超過0.3秒了,怎么辦?或者說狀態機的邏輯無法響應到0.3秒的攻擊。這個時候需要跟策劃溝通,在Animation Driven的系統下,要完全的分開設計,NPC的大腦是AI,NPC的體格是動畫狀態機,很多時候AI的設計要根據體格的情況來酌情調整。要在行為樹里增加一些檢查身體體格的節點,比如說,我要轉向某個方向,那么在適當的時候需要檢查自己的身體是否真的轉到指定方向了;同時對于大腦向身體發送的指令要分優先級,優先級的實現方法是該指令的有效時長,比如說我的身體在受擊的狀態中,但是我的大腦仍然下命令讓我攻擊一次對方,這條指令優先級存在時間0.2秒,如果受擊狀態在0.2秒內復原了,則該指令身體可以執行一次,如果0.2秒內身體仍然無法攻擊,就丟掉此次指令。
?
Volumetric Cloud/Fog/Light的使用一定要提前和美術進行商量,因為計算過程中牽扯到大量的Depth sampling,所以畫面中多大會存在多大面積的這類效果一定需要嚴格控制,否則到了后期不得不移除這些效果的時候會讓整個產品瞬間降低一個檔次。
?
在一些中低端設備上可以用一些簡單的壓縮算法來把RGB + Luminance除以一個除數來壓縮到32bits的顏色空間中來獲得非常劃算的HDR效果,相比較RGBM,用除數可以免費獲得“假”正確的alpha blend效果。這一條無需和美術溝通,直接上就行。(移動平臺可用,效果很好)
?
關于差值,差值計算最大的問題是需要和策劃溝通清楚,越是符合現實生活運動規則的,只能使用物理的方法進行差值,物理的方法是沒有辦法精確的保障差值的最終位置和時間,但是卻可以獲得完美的差值效果。這里有一個非常小的tips來實現物理差值:一個物體從旋轉R0,位置P0,差值到旋轉R1,位置P1,需要差值的時候,在物體上掛一個彈簧,彈簧的另外一端掛在位置P1上,另外物體的運動規則增加兩條:1,每幀運動轉角不能超過XX度;2,物體的實際運動位置是當前朝向 * 力矩;即可,差值出來效果棒棒噠,無論是飛個火球還是跟蹤導彈都可以用這個。
?
美術資源的優化,這件事情比較好的方法是要嚴格的關注,但是盡量不要過早的修改這些問題,因為開發的過程中始終要留一些空間用來提升畫面效果,所以過早的修改掉性能瓶頸,可能會導致到最后不得不放棄已經集成進版本的一些效果,非常不劃算。所以等大家都對畫面比較滿意了之后,再進行一輪性能優化,結果還能再增加一些效果,對于美術大兄弟們來說就變成一件很好的事情了。
本來沒打算寫這么多,只是開始寫了個頭,就發現還有很多類似的問題也都可以羅列出來,于是出現這么多雜亂的內容,回頭有時間會仔細整理整理,比如說配個圖什么的,如果有朋友對于一些tips有疑義或者想知道一些詳細的實現細節,歡迎私信單聊。
?
應某同學的要求
更新一波手游的經驗ヽ(??ω?? )ゝ
貼圖進版本的時候做一個alpha通道的剝離,一方面可以比較方便的適配安卓ETC1壓縮格式,另一方面后期要壓包的時候alpha通道可以隨意縮大小,美術基本無感知。
如果是UI資源比較重的游戲可以采取layout和資源分離的方式來獲得大量的性能提升。針對unity引擎來說就是遍歷ui里所有用到的material,把里面的貼圖替換成4*4的空白貼圖,另外建立一個從材質對應貼圖的索引。因為手機是ssd的緣故所以磁盤io讀取貼圖的速度是非常快的,這樣就可以把整個ui的layout都留在內存中不用切場景釋放,不同場景對應加載不同的貼圖做一個運行時的對應即可,加載ui的時間能提升80%。這一步建議新項目中前期使用,后期項目做這種級別的修改不劃算,風險高。
如果是動畫資源比較重的產品,建議使用自定義的動畫格式,采取float16的四元數儲存關鍵幀數據,然后加載時還原引擎需要的動畫數據,以前做wii上的產品,1000個左右的人形動捕數據可以壓縮到23m左右。
經歷過很多手游項目的全屏大圖比較多(推廣圖,loading圖),有的會占到整個貼圖量的30%甚至更多,這時候一定要優化大圖的制作工藝,和美術溝通把背景,文字和前景拆開制作,一方面可以更好的壓縮(方形,2的次冪),另一方面背景圖可以采取比較極端的壓縮參數。
加載的過程中往往最后會卡一下,這個是第一次shader提交到gpu產生編譯消耗的時間,可以通過在屏幕上繪制一個透明的三角形來完成warmup,這一步基本上主流引擎都有接口,如果單幀消耗過高,可以考慮分布在若干幀里完成。
打擊感的一個小trick,擊中的一瞬間把時間tick調成0持續個0.1秒左右,又輕巧效果又好。
搭建UI框架的時候給每頁ui增加一個fadein和fadeout的接口并且管理好狀態機的切換,今后可以很方便策劃或者美術增加ui打開和關閉的動態效果。
?
2018國慶更新
國慶期間玩了一些當下比較流行的游戲產品,感觸還是挺大的,玩法設計都非常的優秀,但是整體的產品的質量差得還是比較遠的,所以這一次我打算更新一期專門講UI開發的套路。
?
在國產游戲中,UI是比較重的一塊,基本上一個項目會有70%-80%的開發量都集中在UI上面,那么有效的提高UI的生產開發效率以及UI的品質,就會讓整個產品無論是成本還是效果上都會提升很大一個檔次。
為每個UI上看得到的控件都封裝一個獨立的類,不要去直接用Button或者AnimationButton這種級別封裝的類,太底層了,至少要封裝到:OKButtonGeneral, CancelButtonGeneral這種級別的類,因為UI往細節上調整無非就是加動畫,加效果,如果不想一個個來搞就從最開始設計UI的時候就先把這些基類建好。
給每個可以交互的控件都要單獨設計一個響應范圍,例如有一個很小的圖片,很難點中,但是把圖片放大了又不太好看,所以最好的方式就是用小圖,但是擴大響應范圍。對應的要開發一個開關,讓策劃人員可以隨時看到每個控件的響應范圍。
UI開發中比較大的痛點就是每次重構或者換風格的時候,有大量的舊資源搞不清楚是否還在使用,刪又不敢刪,之前的美術或者策劃或者程序又離職了,這樣整個項目越開發越臃腫,越不可維護,碰到這種情況千萬不要猶豫,在開始換風格的時候就一定要說明,原有的UI Atlas一個都不能重用,全部用新的,因為做一次atlas的時間是你清理一次資源的1/10的時間和精力,資源的版本管理本來就是技術分內的事情。
給每一頁UI取一個有意義的名字,我就見過好幾個美術策劃程序為一個UI問題爭吵了很長時間,最后發現大家在討論的是不同的東西,UI的命名一定不能重名,否則到了后期,哪個UI在用,從哪邊跳轉過來的都分不清,文檔都沒法寫。
UI的跳轉,不要簡單的切換一下頁面,把之前的隱藏,新的顯示出來這樣。一定是先push一個切換UI的請求,然后UI控制中心要根據當前UI的動畫播放情況,邏輯是否處理完了等等來決定是否切換,而且切換只是把當前頁面指向棧頂元素,因為還要通過pop來處理返回的邏輯。
我以前看過一個程序小朋友開發UI,發現他工作中有接近30%-40%的時間是在處理顯示層級的問題,即誰顯示在誰前面。這里分享一個小技巧,如果你無法想明白究竟誰應該在前,誰應該在后,那就說明這兩個東西本身就應該是同一個東西,寫一個新的類來包含這兩者,比如說有個ITEM的圖標,圖標上面要畫一個高亮選擇光圈,光圈上面還要顯示ITEM的數量,那么說明這三者就應該放到一個統一的類里面去,例如說GlowableCountableItems
UI里面除了圖片之外,其他的控件都應該采用九宮格,或者反過來說,只有碰到你沒有辦法采用九宮格的元素,才考慮不使用九宮格。
做屏幕適配的時候,不要考慮縮放圖片這樣的方法,按照九宮格的原理進行掛靠,如果內容太多,就需要考慮在細節元素上面再掛一個父節點,通過掛靠父節點來完成適配
字體不要亂用,一般一款游戲控制在3種字體以內,不要輕易的給字體加類似粗體/斜體之類的效果,因為最終字體是要畫到貼圖上緩存起來的。用到專門的字體一定要購買一個版權,省的上線以后打官司。
UI的本地化問題遵循的原則是開發一個類似于LocalizableText之類的控件,里面輸入什么文字自動的寫到數據庫里,否則到了后期UI量大了要把文字提取出來都不是件容易的事。
另外一個本地化相關的就是美術字也應該做成特殊的資源,類似LocalizablePictureText這樣的,也是節約后期本地化的時間。這些統稱為LocKit(Localization Kit的簡稱)有了這些基礎設施,之后無論是產品出海到哪個國家都可以比較安心,不慌。
有一些UI效果可以考慮用shader來完成,舉個例子,類傳奇的游戲裝備圖標都會有一圈光圈圍著轉,這個東西用shader可能就是10行之內的事,我看到過最奇葩的實現方法就是創建了10多個小珠子,每一幀計算這10多個小珠子的位置來實現,當時我就驚呆了。
輸入法這個東西要謹慎處理,如果是單機游戲,都可以考慮在彈出輸入法的時候讓游戲暫停,因為你在輸入的時候其實是沒有辦法和游戲進行其他交互的。
很多游戲都有某個窗口彈出來的時候,背景模糊掉之類的需求,這種的正確制作方法是實現一個類叫BackBufferPicture,然后這個類可以配置截圖的參數和屬性,這樣在任何地方都可以很方便的來實現這樣的效果。
同樣也有很多需求是在UI中嵌入3D模型,這個也是要實現一個獨立的類來實現,如果3D模型上還要增加一些UI來對3D模型進行一些說明,則應當用HUD的方式在3D中實現。另外UI中嵌入3D模型很多程序直接用正交投影,這樣出來的效果就會比較奇怪,但是一時又說不上來,記住,任何情況下顯示3D物體都請用透視投影。
釋放UI的時候一定要記得釋放Render To Texture的內存,現在動不動就是2K屏幕,一塊FrameBuffer很耗內存的。
歡迎大家關注公眾號“創小董”我會繼續分享更多更真實的創業經歷、經驗、解決辦法。
總結
以上是生活随笔為你收集整理的在顶级游戏开发的过程中需要怎样的编程实力?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 西门子1200之自由串口
- 下一篇: 解决 Mac-osx Capitan 关