文章轉(zhuǎn)載 | 紫龍上海CTO王琦:我們對(duì)游戲工業(yè)化的探索

2月13日,2022年度中國(guó)游戲產(chǎn)業(yè)年會(huì)在廣州召開(kāi)。本次大會(huì)以“奮進(jìn)十年路,再搏新征程”為主題,并圍繞游戲出海、國(guó)風(fēng)游戲、游戲工業(yè)化等話題,深入開(kāi)展了16場(chǎng)分論壇討論。
當(dāng)天下午,在以“國(guó)際觀察——游戲制作工業(yè)化升級(jí)趨勢(shì)主題論壇”上,紫龍游戲上海研發(fā)中心首席技術(shù)官王琦,現(xiàn)場(chǎng)發(fā)表題為《我們對(duì)工業(yè)化的摸索——拋磚引玉》的主題演講。

以下是演講實(shí)錄:
王琦:我們其實(shí)是一支非常強(qiáng)的團(tuán)隊(duì),從PC時(shí)代一直開(kāi)發(fā)到現(xiàn)在,核心成員始終在一起合作。這么長(zhǎng)時(shí)間以來(lái),我們積累下了一些自己關(guān)于工業(yè)化方面的摸索和實(shí)踐。
首先,我們團(tuán)隊(duì)的理念是缺陷驅(qū)動(dòng)——當(dāng)發(fā)生了一個(gè)問(wèn)題,我們會(huì)嘗試去理解這個(gè)問(wèn)題如何產(chǎn)生的,然后再去思考如何解決這個(gè)問(wèn)題。那么面向工業(yè)化:工業(yè)化到底是要解決什么問(wèn)題呢?

在我們的視角里,首先是工作結(jié)果的交付一致性較差。比如做一個(gè)角色模型,不同的美術(shù)工作人員產(chǎn)出的面數(shù)差異、或者是貼圖材質(zhì)差異,都代表了它的一致性比較差。
另一方面,工業(yè)化的反面其實(shí)是作坊化,這會(huì)導(dǎo)致工作過(guò)程的一致性較差,從而帶來(lái)產(chǎn)出效率較低,以及信息傳遞的缺失、低效和失真。比如策劃向美術(shù)傳遞信息的時(shí)候,如果產(chǎn)生了一些失真,使得有些信息沒(méi)有傳遞到,就會(huì)導(dǎo)致最后產(chǎn)出結(jié)果一定會(huì)產(chǎn)生反復(fù)和迭代,這對(duì)于成本來(lái)說(shuō)都是浪費(fèi)。
同時(shí)在傳統(tǒng)作坊工作方式下,流程通常來(lái)說(shuō)很難保持非常高的一致性。不同工作人員工藝的不一致,一定會(huì)導(dǎo)致最終呈現(xiàn)的結(jié)果出現(xiàn)差異,并帶來(lái)質(zhì)量方面的參差。
基于上述內(nèi)容,我們其實(shí)很難去定義,開(kāi)發(fā)過(guò)程中某一個(gè)任務(wù)是否被完成,以及它被完成的界定準(zhǔn)則和參數(shù)到底是什么。所以會(huì)導(dǎo)致我們無(wú)法描述這個(gè)任務(wù)應(yīng)該在什么時(shí)候完成,以及完成后還會(huì)不會(huì)迭代。
因此,開(kāi)發(fā)過(guò)程的管理信息會(huì)變得非?;靵y,同時(shí)導(dǎo)致開(kāi)發(fā)過(guò)程的可控性變得極差,最終結(jié)果就是時(shí)間、成本失控,交付質(zhì)量不理想。
而我們視角下的游戲開(kāi)發(fā)工業(yè)化由哪些方面構(gòu)成?第一,是要保證工作過(guò)程和結(jié)果的正確性和一致性;第二,在這個(gè)基礎(chǔ)之上需要保證工作過(guò)程和結(jié)果輸出的效率。
為了保證一致性,我們有兩個(gè)方面:第一是開(kāi)發(fā)過(guò)程管理規(guī)范,相比傳統(tǒng)的軟件開(kāi)發(fā)大家應(yīng)該比較熟悉,畢竟傳統(tǒng)開(kāi)發(fā)會(huì)非常注重項(xiàng)目管理機(jī)制和規(guī)則。第二個(gè)是針對(duì)游戲行業(yè)本身,我們會(huì)存在具體的工件制作工業(yè)流程的規(guī)范。在部分規(guī)范的情況下,我們是能夠靠人力去保證它的一致性。
通常來(lái)講,規(guī)范定得越細(xì),檢查得越嚴(yán)格的話,工作效率整體會(huì)下降。這就需要靠一些開(kāi)發(fā)過(guò)程管理的數(shù)據(jù)化和工具鏈,以及制作工藝流程環(huán)境下的數(shù)據(jù)化和工具,來(lái)使效率得到一個(gè)合理的提升。

這里我們分解一下開(kāi)發(fā)過(guò)程管理規(guī)范。首先,它是以通常意義上的軟件項(xiàng)目過(guò)程管理為基礎(chǔ)。像我們以前做傳統(tǒng)軟件,也會(huì)用到一些項(xiàng)目管理的軟件,比如說(shuō)微軟的Project這些東西。
第二,最開(kāi)始要解決的一個(gè)基本問(wèn)題,是信息流和決策流的管理。整個(gè)開(kāi)發(fā)過(guò)程的管理,它的人員組織結(jié)構(gòu)應(yīng)該是會(huì)形成一個(gè)樹(shù)狀結(jié)構(gòu),就像軍隊(duì)指揮打仗一樣。
如果沒(méi)有形成一個(gè)很好的樹(shù)狀結(jié)構(gòu),你的信息流不是在樹(shù)上面通過(guò)根節(jié)點(diǎn)才能流向葉子節(jié)點(diǎn)的話,比如在執(zhí)行環(huán)節(jié),策劃會(huì)直接和執(zhí)行層面的程序和美術(shù)溝通。這個(gè)有可能會(huì)導(dǎo)致你的Leader不知道,因此他們對(duì)于這些信息是否和原有體系自洽,并沒(méi)有做出判斷。而且在他們不知道的情況下,后續(xù)QA流程肯定也被斷開(kāi)的,這都是問(wèn)題,所以我們需要把信息流和決策流的管理做好。
第三,開(kāi)發(fā)過(guò)程管理規(guī)范和工業(yè)化的關(guān)系,前面其實(shí)已經(jīng)提到了。開(kāi)發(fā)規(guī)范其實(shí)并不依賴(lài)工業(yè)化存在,在我們沒(méi)有涉及到工業(yè)化概念的時(shí)候,就已經(jīng)在用簡(jiǎn)單的規(guī)范在操作。同時(shí),工業(yè)化一定會(huì)帶來(lái)一些流程線的制作成本,針對(duì)這些新的流程建設(shè),我們需要對(duì)原有的開(kāi)發(fā)規(guī)范進(jìn)行一些適配和調(diào)整。
再者,我們即使在有規(guī)劃的參與情況下,其實(shí)隨著項(xiàng)目過(guò)程的發(fā)展,以及同一套工業(yè)化流程線在不同項(xiàng)目中的應(yīng)用,具體的開(kāi)發(fā)規(guī)范其實(shí)還需要做調(diào)整。這里特別需要去避免:一般來(lái)說(shuō),我們執(zhí)行開(kāi)發(fā)規(guī)范的具體執(zhí)行人都是PM團(tuán)隊(duì),但PM團(tuán)隊(duì)經(jīng)常有時(shí)候會(huì)有一些任務(wù)導(dǎo)向的傾向。就是說(shuō)規(guī)范里規(guī)定了我有abc,上面流程做了那就算沒(méi)責(zé)任了,盡到了自己義務(wù)。
但事實(shí)上,我們其實(shí)需要相互灌輸:做這個(gè)規(guī)范、做某一個(gè)條例的目標(biāo)是什么?它是為了實(shí)現(xiàn)什么樣的目的?那在具體的某個(gè)環(huán)境中,如果沒(méi)有達(dá)成相應(yīng)的目的,我們是不是應(yīng)該去分析一下,到底是執(zhí)行環(huán)境出了問(wèn)題還是說(shuō)規(guī)范有問(wèn)題。
然后第四個(gè),就是開(kāi)發(fā)過(guò)程管理需要數(shù)據(jù)化。數(shù)據(jù)化其實(shí)是工業(yè)化的基礎(chǔ),如果我們不能用數(shù)據(jù)化的方式去描述整個(gè)開(kāi)發(fā)過(guò)程,就沒(méi)有辦法以數(shù)據(jù)化的方式去定義每個(gè)任務(wù),以及每個(gè)任務(wù)的分類(lèi)是什么。
在我們的工具里面其實(shí)給每一個(gè)任務(wù)打了很多標(biāo)簽,它有功能范疇方面的標(biāo)簽,比如是某某系統(tǒng)的、是屬于戰(zhàn)斗還是屬于技能的;還有一個(gè)就是它在崗位上的標(biāo)簽,因?yàn)槲覀冏瞿硞€(gè)功能范疇的任務(wù)經(jīng)常會(huì)流轉(zhuǎn)很多崗位,而這個(gè)任務(wù)到底是屬于哪個(gè)崗位,就需要把整個(gè)開(kāi)發(fā)過(guò)程元數(shù)據(jù)化,去定義它。
最后一項(xiàng),就是我們?nèi)绾伪U仙厦孢@些來(lái)執(zhí)行。其實(shí)我們會(huì)在開(kāi)發(fā)規(guī)范上去定義立項(xiàng)的各個(gè)階段,每一個(gè)版本要達(dá)成的目標(biāo)是什么、它要驗(yàn)證什么?在達(dá)成了某個(gè)目標(biāo)后才能繼續(xù)往下走。這其實(shí)是為了在前期盡量減少成本,解決一些未知問(wèn)題,后面會(huì)更詳細(xì)地去解釋這個(gè)問(wèn)題。

那工業(yè)化和流水線之間的關(guān)系,在我們的觀點(diǎn)里面,工業(yè)化的本質(zhì)就是建設(shè)流水線,既然是建設(shè)流水線,就會(huì)涉及到一個(gè)成本問(wèn)題,一般來(lái)講成本都是很高的。所以預(yù)算比較小的項(xiàng)目,那就要需要問(wèn)問(wèn)自己值不值得發(fā)動(dòng)它來(lái)做事。
既然它成本高,改動(dòng)它的時(shí)候成本也高,那它就一定會(huì)有某種局限性,即只適應(yīng)于為了我們這個(gè)目標(biāo)特別定制的流水線。所以,流水線模式和游戲創(chuàng)新實(shí)際上是存在天然矛盾的??梢酝ㄟ^(guò)我們項(xiàng)目過(guò)程管理規(guī)范里對(duì)于每個(gè)版本的要求,去緩解這樣一個(gè)矛盾。

這里談到我們搭建流水線的過(guò)程,提到了一個(gè)叫做Alpha0階段。Alpha0階段其實(shí)是一個(gè)版本,這個(gè)版本之前有兩個(gè)重要的版本階段。
第一個(gè)版本階段,是所謂的核心游戲驗(yàn)證階段。在這個(gè)階段中,我們一般很少有美術(shù)來(lái)參與,基本上盡量采用白模和既有的美術(shù)資源來(lái)進(jìn)行核心游戲性和3C的驗(yàn)證。這個(gè)階段過(guò)了以后,我們認(rèn)為達(dá)成了驗(yàn)證目標(biāo),就會(huì)進(jìn)入第二個(gè)階段。
第二個(gè)階段,是美術(shù)的原型階段,我們需要確定美術(shù)風(fēng)格,去給美術(shù)的每一種工件制定它的標(biāo)準(zhǔn)?;跇?biāo)準(zhǔn),就會(huì)說(shuō)明這個(gè)美術(shù)工件的復(fù)雜度,標(biāo)志著它的生產(chǎn)成本。能夠衡量游戲中對(duì)于這種復(fù)雜度資產(chǎn)需要的量是多少,也就是美術(shù)內(nèi)容風(fēng)格的制定、定標(biāo)和定量。這幾件事是進(jìn)入Alpha0階段的前提。
那在Alpha0階段中要解決的問(wèn)題,第一是為構(gòu)成游戲的每個(gè)“零件”制定最終要求和規(guī)范、以及定量,然后再為每個(gè)“零件”制定工序環(huán)節(jié)和每個(gè)環(huán)節(jié)上的檢查規(guī)范,并制定是哪個(gè)崗位的人來(lái)做這個(gè)事情。這個(gè)問(wèn)題,后面會(huì)再詳細(xì)解釋。

這里拿了幾個(gè)我們內(nèi)部工件制作的圖解,給大家貢獻(xiàn)例子。
在UI系統(tǒng)制作上面,首先我們會(huì)畫(huà)一張流程圖,來(lái)定義對(duì)于制作某一個(gè)美術(shù)或內(nèi)容的資產(chǎn),我們要把它分解為哪些步驟?其實(shí)這個(gè)步驟已經(jīng)分解得非常細(xì)了。藍(lán)色方框的部分最終會(huì)體現(xiàn)在你的工單系統(tǒng)里,會(huì)變成某一個(gè)人身上的一個(gè)Task,會(huì)去定到人、定到時(shí)間、定到時(shí)長(zhǎng)?;疑牟糠只旧蠈儆谝恍┓侨蝿?wù)性的環(huán)節(jié),比如某種溝通、或者某種會(huì)議。這個(gè)圖上已經(jīng)包含了制作流程中很多check的步驟,以及一些迭代、整合、調(diào)試的步驟。
另一邊和這個(gè)流程圖配套的,就是我們針對(duì)每一個(gè)環(huán)節(jié)的規(guī)范,這個(gè)規(guī)范也是遵從于我們?nèi)毕蒡?qū)動(dòng)的開(kāi)發(fā)。當(dāng)我們發(fā)現(xiàn)某個(gè)地方出現(xiàn)問(wèn)題的時(shí)候,需要去為它擬定一條新規(guī)范,添加到原有的體系當(dāng)中。當(dāng)我們不斷地去做這種事情,就會(huì)使得你的規(guī)范越來(lái)越完善。比如UI規(guī)定了字體應(yīng)該怎么用,你的按鈕控件使用的一些規(guī)定是什么。

下一個(gè)就是機(jī)甲部件制作,要經(jīng)歷一個(gè)什么樣的流程。我們的規(guī)范其實(shí)還包含要使用哪些工具,因?yàn)槲覀冡槍?duì)工具有做很多二次開(kāi)發(fā),因此不能胡亂地遵照你的喜好安排工具安裝,必須按照我們自己規(guī)定的這些東西。包括工具環(huán)境要用什么,機(jī)甲的一些比例范圍,面數(shù)等,都是在這個(gè)規(guī)范里面。

這是場(chǎng)景相關(guān)的制作規(guī)范,這個(gè)只是描述純粹的美術(shù)方面場(chǎng)景,因?yàn)閳?chǎng)景應(yīng)用到游戲當(dāng)中,還會(huì)變成其他的內(nèi)容,這個(gè)規(guī)范在后面大家會(huì)看到。

這個(gè)是場(chǎng)景做完了后,把它應(yīng)用到游戲當(dāng)中的策劃內(nèi)部流轉(zhuǎn)。包含關(guān)卡策劃、文案策劃,一些主策劃驗(yàn)收,數(shù)值策劃填充數(shù)值等過(guò)程的流轉(zhuǎn),以及他們一條條迭代歸納出來(lái)的一些步驟和規(guī)則。

然后是開(kāi)發(fā)過(guò)程管理的數(shù)據(jù)化和工具鏈,我們大概使用的項(xiàng)目管理是Jira或Project。每個(gè)工具都有他自己的特長(zhǎng),比如,Jira比較適合每個(gè)人只關(guān)注自己能看到的任務(wù)條目;Project比較適合讓整個(gè)項(xiàng)目的管理者能夠看到任務(wù)和任務(wù)之間的依賴(lài)關(guān)系、時(shí)間等。
版本管理我們用的是Perforce,也是在做過(guò)反復(fù)調(diào)研后,最終選定的Perforce。它最吸引我們的一個(gè)功能是和Swarm的聯(lián)動(dòng),遷入以后可以自動(dòng)做review環(huán)節(jié)的聯(lián)動(dòng),等一會(huì)我會(huì)詳細(xì)的介紹。
CI環(huán)節(jié),我們用Jenkins和一些自研資源檢查工具。還有一個(gè)就是我們自己開(kāi)發(fā)的消息通知軟件,叫DevMsg,這個(gè)東西是為了解決什么問(wèn)題呢?就是我們經(jīng)常會(huì)遇到的在項(xiàng)目中信息丟失。
比如說(shuō)我開(kāi)了個(gè)分支,要求后面針對(duì)某個(gè)版本的遷入必須在另外一分支上做,這個(gè)時(shí)候往往就有美術(shù)說(shuō)“我不知道”、“你沒(méi)通知我”,他也不看QQ,你也沒(méi)辦法專(zhuān)門(mén)找人去盯著他、問(wèn)他確認(rèn)。最好的方式就做個(gè)軟件,把這個(gè)Messagebox以模態(tài)窗口的方式彈在他臉上,他不點(diǎn)確認(rèn)這個(gè)窗口永遠(yuǎn)不會(huì)消失,徹底消除他們說(shuō)任何“我不知道”的情況。

這個(gè)是Jira和Project的互通。我們整個(gè)開(kāi)發(fā)流程的起點(diǎn),是每個(gè)版本的一個(gè)Excel。在這個(gè)Excel里面去定義了這個(gè)版本的Featurelist,然后各個(gè)組長(zhǎng)會(huì)在Featurelist上進(jìn)行任務(wù)拆分。只拆分這個(gè)任務(wù)節(jié)、某個(gè)Feature要分解成哪幾個(gè)任務(wù)條目,不安排時(shí)間、也不安排人,然后這個(gè)Excel會(huì)被一個(gè)工具導(dǎo)成一個(gè)出最初版本的Project的桿狀圖。
在桿狀圖上,我們能夠非常明顯地得知一個(gè)任務(wù)在時(shí)間上的關(guān)系。當(dāng)我們安排了人之后,我發(fā)現(xiàn)哪個(gè)地方成為長(zhǎng)板,需要把它調(diào)整一下,負(fù)責(zé)人就把任務(wù)調(diào)到其他人身上去,使得每一個(gè)資源的階梯化使用非常清晰明了。從Leader的角度來(lái)看,我們整個(gè)任務(wù)的b型開(kāi)發(fā)流程和故事開(kāi)發(fā)流程會(huì)非常的清晰。
做完這一步以后,我們用自己做的Jira拓展工具導(dǎo)入到Jira里上,會(huì)形成每個(gè)人身上掛的一些工作條目。這些人每天完成工作之后,就把對(duì)應(yīng)的Jira上的工單設(shè)置為已完成。我們每天會(huì)再做一次同步回Project,桿狀圖的完成狀態(tài)也會(huì)跟著更新。
與此同時(shí),我們每天會(huì)在Jira上做一個(gè)自動(dòng)報(bào)表,把所有類(lèi)型的任務(wù)、每一個(gè)大的功能分類(lèi)任務(wù)的完成情況和完成比例,以及拖延情況統(tǒng)計(jì)出來(lái)發(fā)給所有的Leader,讓公司領(lǐng)導(dǎo)也能很明確的了解。同時(shí)我們也會(huì)把同步好了的桿狀圖發(fā)出來(lái),能夠以一個(gè)比較有效率的方式去了解當(dāng)前項(xiàng)目進(jìn)度。

這個(gè)是Perforce和Swarm的聯(lián)動(dòng)。當(dāng)我們?cè)赑erforce上去遷入一個(gè)資源或代碼的時(shí)候,我們有一些強(qiáng)制性的要求。就我們通過(guò)二級(jí)開(kāi)發(fā)Perforce去規(guī)定遷入的時(shí)候必須提供哪些信息,其中一個(gè)非常重要的信息就是:你針對(duì)的Jira工單的工單號(hào)是什么?一般來(lái)說(shuō),開(kāi)發(fā)人員是沒(méi)有辦法直接去遷入的,他只能提交一個(gè)review的request,會(huì)在Swarm上去丟給你的Leader。

一般來(lái)說(shuō),這丟給Swarm之后會(huì)觸發(fā)我們一個(gè)制定的CI流程,它會(huì)根據(jù)你的工單的類(lèi)型,這個(gè)就涉及到我們前面那個(gè)元素的作用了。我們得知道這個(gè)工單是為了什么目的、它到底會(huì)涉及哪些資源、我們要做哪些檢查,以及根據(jù)你遷入的資源在我們工程目錄里面的匹配規(guī)則,它到底屬于哪種資源。去做相應(yīng)的檢查后,我們會(huì)把檢查結(jié)果貼到那個(gè)Swarm。
當(dāng)你的Leader去看的時(shí)候,他首先看一下自動(dòng)檢查的結(jié)果,有沒(méi)有一些不合適,或者雖然不太合適但是可以忍受的部分。這個(gè)地方和我們代碼編譯過(guò)程會(huì)有warning和error的部分一樣,但是在某一個(gè)比較正式的版本分支上面,這些就已經(jīng)遷不進(jìn)去了,然后你的Leader看完以后會(huì)決定要打回或者是接受。通過(guò)這種方式,我們能夠最大程度上的去保證每一個(gè)工作環(huán)境上的人提交的東西是合法。

這個(gè)是DevMsg產(chǎn)品。

這是制作工藝流程中,基本上是美術(shù)生產(chǎn)過(guò)程的數(shù)據(jù)化和工具鏈,我們要談到它的特殊性和通用性。
特殊性,意味著每一個(gè)項(xiàng)目的美術(shù)規(guī)格都有差異,風(fēng)格也不一樣,有的寫(xiě)實(shí)、有的是卡通。游戲類(lèi)型不同,跨平臺(tái)的預(yù)算分配也不一樣。我們可能有的游戲需要在特效上多分配,它允許每一幀所消耗特效的GPU時(shí)間會(huì)多一點(diǎn),有的是整個(gè)場(chǎng)景的植被渲染要多一點(diǎn)。這個(gè)東西都是根據(jù)我們中臺(tái)在Alpha0階段去做的一些衡量,和項(xiàng)目組做一些溝通后去反復(fù)測(cè)試,批下來(lái)的標(biāo)準(zhǔn)。很多項(xiàng)目也存在自定義的美術(shù)資源,特別是一些預(yù)制件。在別的游戲中不存在,只在他這里存在,也有自己的一些規(guī)范。
有特殊性,它也有通用性。通用性是為了保證,我們不能單獨(dú)為了一個(gè)項(xiàng)目開(kāi)發(fā)一整套工具鏈和流水線,成本都太高了。在通用性上,我們一般是通過(guò)把整個(gè)功能和要落地的過(guò)程切分很多層次。
首先,我們會(huì)存在跨項(xiàng)目的數(shù)據(jù)規(guī)則框架和工具鏈框架,落實(shí)到具體項(xiàng)目中,我們會(huì)把數(shù)據(jù)規(guī)則框架進(jìn)行一些配置,就是數(shù)據(jù)驅(qū)動(dòng)的規(guī)則模板。比如我們每個(gè)項(xiàng)目都會(huì)去審查某個(gè)資產(chǎn)的面數(shù),面數(shù)的值由項(xiàng)目組自己來(lái)治理。還有工具的組件化部署,你的整個(gè)工具鏈必須是要考慮好組件化,不能直接來(lái)個(gè)“全家桶”,你得允許項(xiàng)目去選擇某些組建來(lái)部署。這個(gè)地方我們也做了一些像騰訊的同事們做的那些部署框架之類(lèi)的,有些環(huán)境下面是我們把部署好的環(huán)境一股腦全遷到收藏庫(kù)里面,其他工作人員直接蓋下來(lái)就是最新的,這樣的話我們更新的時(shí)候也很方便。
后面會(huì)舉兩個(gè)例子來(lái)說(shuō)明,美術(shù)方面的數(shù)據(jù)化和工具鏈。一個(gè)是美術(shù)資源處理流程,就是美術(shù)資源出口資源的導(dǎo)入;還有一個(gè)是材質(zhì)的驗(yàn)證。

這個(gè)是美術(shù)資產(chǎn)的導(dǎo)入。首先,美術(shù)資產(chǎn)生產(chǎn)完了以后,第一件事是要導(dǎo)出。在導(dǎo)出的時(shí)候,就會(huì)利用我們做的二次開(kāi)發(fā)的一些工具,來(lái)檢查這個(gè)資產(chǎn)。比如一些命名規(guī)則、層級(jí)結(jié)構(gòu),頂點(diǎn)數(shù)據(jù)有沒(méi)有廢數(shù)據(jù),在一些變數(shù)參數(shù)上面有沒(méi)有符合我們的要求……裸資源導(dǎo)出了以后,第二步就是導(dǎo)入。
在那個(gè)裸資源導(dǎo)入引擎的時(shí)候,我們?cè)谝胬锩孀龅亩伍_(kāi)發(fā)會(huì)對(duì)資源進(jìn)行二次處理。比如貼圖的跨平臺(tái)壓縮設(shè)置,針對(duì)不同的規(guī)格質(zhì)量要求的包的貼圖的設(shè)置。比如《鋼嵐》項(xiàng)目,他機(jī)器人我們導(dǎo)進(jìn)來(lái)的裸資源其實(shí)是一套的機(jī)甲部件,在滿(mǎn)足一定的那個(gè)命名規(guī)則的前提下,我們會(huì)讓程序那個(gè)自動(dòng)去做一些預(yù)制件的生成。就直接把它組裝成最后程序會(huì)調(diào)用的一些東西。
然后這些資源進(jìn)入了系統(tǒng)之后,比如我們?cè)趫?chǎng)景里面把這些資源放上去了后,我們會(huì)做一些profiling的工具來(lái)去做初步驗(yàn)證,這些東西組合在一起是否符合要求,這些profiling工具后面我們會(huì)再詳細(xì)介紹一下。
引擎當(dāng)中的生產(chǎn)過(guò)程完成了之后,我們上傳的時(shí)候就會(huì)去做CI檢測(cè),以及保證進(jìn)入source control資源的合法性,這個(gè)前面已經(jīng)說(shuō)過(guò)了。

這里再談材質(zhì)一致性的問(wèn)題。我們以前會(huì)遇到的一個(gè)問(wèn)題是什么呢?比如在一個(gè)游戲當(dāng)中,兩個(gè)不同的場(chǎng)景可能一個(gè)是晴天,一個(gè)是陰天,不同的美術(shù)、哪怕是同一個(gè)美術(shù)有時(shí)候也會(huì)犯這樣的錯(cuò)誤:他為了達(dá)成最后美術(shù)畫(huà)面的呈現(xiàn)效果,有的地方是靠調(diào)建筑物的材質(zhì)和顏色來(lái)達(dá)成,有的地方是靠調(diào)光的達(dá)成……就非常的不一致。當(dāng)你想去做一些全局的后期處理時(shí),這件事情就立馬凸顯出現(xiàn)。然后你想返過(guò)去搞,成本又很高。
所以在處理這種問(wèn)題的時(shí)候,一個(gè)前提是要去搞清楚最后畫(huà)面像素的顏色,在光照著色渲染上面到底分哪幾個(gè)步驟,每個(gè)步驟的貢獻(xiàn)到底是什么?以此來(lái)針對(duì)每個(gè)步驟進(jìn)行計(jì)算機(jī)制的對(duì)齊,以及最終貢獻(xiàn)結(jié)果的對(duì)齊。
比如PBR的渲染,我們首先要確定的是物理早期模型。再就是光照環(huán)境的一個(gè)確認(rèn)HDRI天光的拍攝和矯正,物理光照和曝光,然后再是GI烘焙。還有一個(gè)GroundTruth是我們自己定義的,他的作用是什么呢?比如你要驗(yàn)證材質(zhì)模型,必須要有個(gè)標(biāo)準(zhǔn)場(chǎng)景,這個(gè)標(biāo)準(zhǔn)光照?qǐng)鼍拔覀內(nèi)绾伪WC正確呢?我們首先把它渲一遍,然后我們?cè)儆米约汗鈻呕匿秩痉绞皆侔阉忠槐椋俦容^每一個(gè)部分的顏色差異是否在可接受程度內(nèi)。如果ok,說(shuō)明我們這個(gè)光柵化的東西已經(jīng)達(dá)到了目標(biāo)要求,當(dāng)然這個(gè)東西只適合做PBR渲染。
然后基于這個(gè)標(biāo)準(zhǔn)光照環(huán)境,我們可以把其他后續(xù)增加的材質(zhì)放進(jìn)來(lái)。因?yàn)椴邉潟?huì)去定義,這個(gè)材質(zhì)我們想看這個(gè)時(shí)候沒(méi)有那個(gè)時(shí)候光滑,這個(gè)時(shí)候會(huì)比那個(gè)時(shí)候也是深一點(diǎn)。那我們?cè)跇?biāo)準(zhǔn)光的環(huán)境中,就會(huì)先放一些標(biāo)準(zhǔn)的資產(chǎn),如一排石頭、一排技術(shù)桶之類(lèi)的。這樣的話,你就會(huì)把新生產(chǎn)出來(lái)的材質(zhì)放到里面去做比較,看看在他的那個(gè)維度上面是否屬于一個(gè)正確的位置,就能確定你的東西做對(duì)了。

這個(gè)是在我們另外一個(gè)項(xiàng)目的非PBR渲染當(dāng)中,是同樣一個(gè)過(guò)程,只不過(guò)它的風(fēng)格不一樣。我們需要確定風(fēng)格化的著色器模型,每個(gè)角色要用一樣。也是要去確定它的光照環(huán)境,角色光、虛擬光照和GI烘培。

這個(gè)是我們剛才說(shuō)的,profiling過(guò)程中會(huì)涉及到的一些檢測(cè)手段。第一排第一張圖是針對(duì)渲染過(guò)程,我們把每一個(gè)渲染層級(jí),或者他在渲染管線上的每一層級(jí)的貢獻(xiàn)能夠單獨(dú)拿出來(lái)去檢查,這樣的話就是對(duì)于TA、美術(shù)來(lái)說(shuō),效率會(huì)比較高。
第二行這個(gè)是來(lái)檢測(cè)我們MipMap的使用,這個(gè)東西很多引擎都已經(jīng)提供了。最后一個(gè)東西比較特殊,是我們自研的一個(gè)東西,它是用來(lái)解決什么問(wèn)題呢?制作人有時(shí)候看到某個(gè)場(chǎng)景,會(huì)說(shuō)這個(gè)場(chǎng)景好像不太好,但美術(shù)問(wèn)他具體哪里不好,他其實(shí)很難說(shuō)出來(lái)的。非美術(shù)人員是很難去回答,他只覺(jué)得那個(gè)場(chǎng)景屏不夠不夠豐富。那美術(shù)問(wèn)他,是不是我多加點(diǎn)加點(diǎn)輪胎、或者加點(diǎn)什么小部件,你會(huì)感覺(jué)更好,有時(shí)候其實(shí)并不是。
那這個(gè)東西的作用是什么呢?你看它上面有幾張小圖,黑的一個(gè)柱狀圖,那是在統(tǒng)計(jì)這張圖里面每一個(gè)像素的亮度分布。一般來(lái)說(shuō),亮度分布越集中,你的畫(huà)面就會(huì)越突兀。它的比較高的部分代表亮度高的那個(gè)像素,從高區(qū)往低區(qū)走的過(guò)程越平滑,說(shuō)明你光照的那個(gè)分布越平滑,那說(shuō)明細(xì)節(jié)越多。當(dāng)然這個(gè)東西不是絕對(duì)的,有一些風(fēng)格化的游戲和攝影過(guò)程中,確實(shí)會(huì)用到非常強(qiáng)的明暗對(duì)比,而且明暗過(guò)度非常突兀,這是他的風(fēng)格。
后面那個(gè)彩色的方框,是在統(tǒng)計(jì)每一個(gè)像素在色域上的分布,來(lái)讓你去檢查是否有撞色、補(bǔ)色。在這些支持的情況下,我們明顯發(fā)現(xiàn):你如果覺(jué)得一個(gè)場(chǎng)景的細(xì)節(jié)度不夠、光照很平的時(shí)候,第一張圖就會(huì)呈現(xiàn)出一個(gè)部分曲線更陡峭的情況;你覺(jué)得有些場(chǎng)景很好,就會(huì)發(fā)現(xiàn)第一張圖它的分布會(huì)稍微平滑一點(diǎn)。
最后一個(gè)話題是工業(yè)化團(tuán)隊(duì)建設(shè)問(wèn)題。我們認(rèn)為再好的裝備也需要人去操作,那什么是最重要的,人才是最重要的。
我們是一個(gè)持續(xù)時(shí)間非常長(zhǎng)的團(tuán)隊(duì),在推進(jìn)工業(yè)化的過(guò)程中,我們其實(shí)有一些特殊的優(yōu)勢(shì),就是自上而下的推進(jìn)。包括我們很多工具鏈該如何做,我們的對(duì)工具鏈的規(guī)劃是什么樣的、我們要達(dá)成什么樣目標(biāo)、每一階段要做什么?這些事基本上是我自己在做。
再談到一點(diǎn)就是灰度推進(jìn),我們沒(méi)有辦法等所有事情都ready以后再去推進(jìn),那個(gè)事情永遠(yuǎn)等不到。我們只能在項(xiàng)目中,讓這個(gè)項(xiàng)目用得少一點(diǎn),那個(gè)項(xiàng)目用得更廣泛一點(diǎn),但是我們得保證一點(diǎn):越往后走的項(xiàng)目應(yīng)用范圍越廣泛。通過(guò)反復(fù)的迭代,我們就會(huì)得到一個(gè)比較好的結(jié)果。
再就是談一下我們中臺(tái)做的事情。我們中臺(tái)完成了服務(wù)器框架、客戶(hù)端框架以及渲染管線,還有開(kāi)發(fā)和配置管理工具鏈的support。當(dāng)然,服務(wù)器框架和客戶(hù)端框架基本上都是我寫(xiě)的,后面其他人維護(hù)的,后來(lái)我們中臺(tái)負(fù)責(zé)人來(lái)搞了渲染管線框架的部分。另外有一個(gè)團(tuán)隊(duì)專(zhuān)門(mén)去負(fù)責(zé)配置管理工具鏈的開(kāi)發(fā)。
最后談到的就是梯隊(duì)建設(shè)的問(wèn)題?,F(xiàn)在游戲開(kāi)發(fā)動(dòng)輒上億的預(yù)算,是非常復(fù)雜的信息管理體系,這些信息管理體系如果需要人去操作的話,需要保證這個(gè)團(tuán)隊(duì)的延續(xù)性,和一個(gè)持續(xù)的自我迭代。我們有一個(gè)操作的方法,即在中臺(tái)設(shè)立一個(gè)所謂的教導(dǎo)隊(duì)。
這個(gè)教導(dǎo)隊(duì)是干什么的呢?他會(huì)重度參與公司的某一個(gè)項(xiàng)目。在這個(gè)項(xiàng)目中去迭代我們的框架代碼、渲染代碼,包括開(kāi)發(fā)管理工具鏈的應(yīng)用。同時(shí),這個(gè)教導(dǎo)隊(duì)的人員來(lái)自我們每一年的校招,挑選的天花板比較高,并且被公司挪用足夠的人去做密集的培養(yǎng)。這些人未來(lái)也是公司成長(zhǎng)的關(guān)鍵,他們會(huì)逐漸成長(zhǎng)為小的力量、大的力量,以及到公司的技術(shù)負(fù)責(zé)人。
這個(gè)培養(yǎng)過(guò)程會(huì)談到價(jià)值觀和方法論,我們認(rèn)為價(jià)值觀是第一位的,方法論只是術(shù),價(jià)值觀才是道。我經(jīng)常會(huì)跟大家說(shuō),開(kāi)發(fā)過(guò)程中“勿以善小而不為,勿以惡小而為之”。
勿以善小而不為,因?yàn)殚_(kāi)發(fā)的過(guò)程太龐雜了,有很多細(xì)節(jié),你如果覺(jué)得某個(gè)修改很小懶得做,那就永遠(yuǎn)不會(huì)產(chǎn)生大的進(jìn)步,必須從一點(diǎn)一滴去做起。而勿以惡小而為之,開(kāi)發(fā)過(guò)程當(dāng)中其實(shí)有很多“惡”,是一點(diǎn)點(diǎn)小的不規(guī)范。這些東西如果不去做管控,后來(lái)的人看到你放低對(duì)自己的要求,這個(gè)事情就會(huì)越來(lái)越大,一直滾到一個(gè)無(wú)法收拾的地步。
還有一個(gè)是積累和傳承。前面也說(shuō)過(guò),我們已經(jīng)長(zhǎng)達(dá)數(shù)十年去做實(shí)習(xí)生的培養(yǎng),現(xiàn)在公司很多開(kāi)發(fā)骨干和管理人員,都是當(dāng)時(shí)早先培養(yǎng)出來(lái)一些人,這是公司內(nèi)部本身就存在的需求。我覺(jué)得我們公司存在的一個(gè)很重要的目標(biāo),就是讓認(rèn)同我們價(jià)值觀的人,能夠有一個(gè)合適的工作環(huán)境。
我們也會(huì)和一些大學(xué)合作,一開(kāi)始從大二大三去建立興趣小組,后來(lái)逐步跟學(xué)校合作,建立實(shí)驗(yàn)室。實(shí)驗(yàn)室也會(huì)有美術(shù)專(zhuān)業(yè)和計(jì)算機(jī)專(zhuān)業(yè)的人參加,我們?nèi)ズ献髯鲰?xiàng)目,并且我們還制定了一些課程,包括各種基礎(chǔ)的內(nèi)容、引擎的使用、編程設(shè)計(jì)方面等等。
這其實(shí)就像種一顆樹(shù),最好的時(shí)候是十年前,其次是現(xiàn)在。只有我們不斷去做這個(gè)事情,這個(gè)行業(yè)才會(huì)有發(fā)展、薪火相傳,能夠做出更好的產(chǎn)品。