【開(kāi)發(fā)日志補(bǔ)全計(jì)劃】CarbonUI以及EVE: Incursion 1.6
原作者:CCP Snorlax
原文:http://community.eveonline.com/devblog.asp?a=blog&nbid=2323?
?
我們會(huì)在本次更新中為EVE加入全新的CarbonUI架構(gòu),你可能不會(huì)覺(jué)得它比之前有了很大變化,因?yàn)檫@一次我們主要修正了基礎(chǔ)的代碼,而不是用戶界面本身。去年里,我們對(duì)用戶界面(UI)進(jìn)行了核心化改造(corification),使得今年的修改成為了可能。這是一個(gè)很大的項(xiàng)目,目的是為將來(lái)EVE UI的發(fā)展鋪平道路,你可以在下文中獲知更多信息。我們熱切期望獲得玩家的反饋,大家可以通過(guò)官方論壇等渠道將意見(jiàn)告知我們。
為什么要用CarbonUI呢?
以現(xiàn)在的眼光來(lái)看,EVE的UI以及游戲中負(fù)責(zé)渲染的基礎(chǔ)代碼都已經(jīng)顯得有那么點(diǎn)過(guò)時(shí)了。過(guò)去的UI渲染使用的是Direct3D——基本上是D3D7中的固定函數(shù)渲染,而D3D9雖然也支持這一方法,但是會(huì)遇到瓶頸,使得你被限制在固定函數(shù)所能提供的功能上面——比如說(shuō),沒(méi)有炫麗的著色什么的。
我們一直以來(lái)都想對(duì)EVE的UI進(jìn)行一次徹頭徹尾的大修,原因如下:
1.使它更容易使用
2.使它的外觀更好看
3.使它的性能表現(xiàn)更好
而UI架構(gòu)本身卡住了我們,因?yàn)樗呀?jīng)服役很多年了,顯得十分笨重繁瑣,我們?cè)谠噲D改進(jìn)它的性能表現(xiàn)時(shí)遇到了很多無(wú)解的問(wèn)題。我們一直在向UI里加入新的功能,但是卻沒(méi)有足夠重視架構(gòu)本身。
我們考慮過(guò)幾種方案來(lái)改進(jìn)UI架構(gòu),但最終我們發(fā)現(xiàn)整個(gè)EVE的UI代碼實(shí)在過(guò)于龐大,想要以新的模式重新制作所有的UI是不現(xiàn)實(shí)的。無(wú)論最終我們用什么方法改進(jìn)UI架構(gòu),我們都要使它盡可能少地涉及到UI代碼的重制。
因此,擁有全新的渲染層的CarbonUI是對(duì)現(xiàn)有UI架構(gòu)的一次革命性進(jìn)化。我們努力去盡可能少地改變高級(jí)接口,這樣使用Python的UI程序員就不會(huì)感覺(jué)到有很大的改變——更重要的是,那些20幾萬(wàn)行的UI相關(guān)代碼也還可以正常工作。盡管如此,我們還是修改了許多代碼,有些是為了與新的渲染層相兼容,有些則是因?yàn)槠浔旧砭托枰薷?。結(jié)果,在某種程度上來(lái)講,也沒(méi)剩多少UI文件沒(méi)被修改過(guò)了。
一些關(guān)鍵特性:
?
1.UI場(chǎng)景可以在不同環(huán)境中渲染:
UI物件的貼圖可以被渲染成3D效果,UI同時(shí)也支持其以3D方式呈現(xiàn)并可以在3D場(chǎng)景中與玩家進(jìn)行互動(dòng)。
?

?
上面的截圖展示了一幅UI界面分別以2D及3D渲染后的效果。點(diǎn)擊圖片可以放大。
還可以將UI渲染為以原始的2D方式在3D場(chǎng)景中呈現(xiàn),并加入了層次感和透視效果。

開(kāi)發(fā)中的UI界面,圖為人物在艦長(zhǎng)室中與物品互動(dòng),建立在CarbonUI的全新功能基礎(chǔ)上。點(diǎn)擊圖片可以放大。
將普通的2D效果渲染為2D覆蓋圖
1.所有的Python代碼和UI物件在這些不同的環(huán)境中都是一樣的——場(chǎng)景可以從一個(gè)環(huán)境中實(shí)時(shí)移到另一個(gè)環(huán)境中。
?
2.基于舊的UI架構(gòu)的性能提升
貼圖會(huì)被自動(dòng)收集在一個(gè)貼圖庫(kù)中,這樣在渲染時(shí)就會(huì)更有效率,也不用增加UI美工的工作負(fù)擔(dān)了。
裁剪在像素著色器中完成。
變換在頂點(diǎn)著色器中完成。
像素著色器的像素深度太不夠透明了,通過(guò)一個(gè)D3D混合模式可以處理透明混合及飽和相加混合。
最終的結(jié)果就是我們極大地減少了其狀態(tài)變化——通常情況下,整個(gè)UI在10個(gè)繪圖指令之內(nèi)就可以完成,而不是之前的數(shù)百個(gè)。
3.定位功能現(xiàn)在完全地同渲染分離開(kāi)了。
定位系統(tǒng)已用Python編寫(xiě)完畢,變得更容易維護(hù)了。
優(yōu)化渲染不會(huì)再破壞定位了。
4.渲染全在著色器中進(jìn)行,這樣我們就有機(jī)會(huì)用像素著色器做出很酷的東西了。
所有的基本元素都支持簡(jiǎn)單的效果了,比如陰影、光暈和模糊。


UI設(shè)計(jì)師正在使用測(cè)試工具在基于CarbonUI設(shè)計(jì)的UI界面上測(cè)試特效和動(dòng)畫(huà)。
5.新的動(dòng)畫(huà)庫(kù)用Python編寫(xiě)完成,創(chuàng)造動(dòng)態(tài)的UI變得更容易了。
定位
定位是什么意思呢?它其實(shí)就是那些UI元素呈現(xiàn)在玩家面前的方式——所有的UI元素在屏幕上都有相應(yīng)的坐標(biāo)點(diǎn),不過(guò)UI設(shè)計(jì)師并不需要把每一個(gè)元素都按照它的坐標(biāo)放在屏幕上。比如說(shuō),如果她想在某個(gè)窗口的底部正中間位置放置一個(gè)按鈕,那么這個(gè)按鈕就具有了“底中部”的定位屬性。如果這個(gè)窗口的大小發(fā)生了變化,那么UI架構(gòu)會(huì)重新計(jì)算坐標(biāo)位置,使得這個(gè)按鈕總是保持在窗口底部正中間的位置。
用Python取代C++來(lái)定位是一把雙刃劍。用C++毫無(wú)疑問(wèn)會(huì)更快,我們也確實(shí)對(duì)Python的定位速度有點(diǎn)糾結(jié)。但是另一方面,使用C++也意味著我們很難改變或增加某些定位規(guī)則,原因有以下兩點(diǎn):
1.UI元素的渲染與定位是緊密相連的,改變定位就有著破壞渲染的風(fēng)險(xiǎn),反之也一樣。
2.對(duì)Python的更改進(jìn)行測(cè)試的周期循環(huán)要比對(duì)C++的短得多。
與試圖對(duì)定位的Python代碼進(jìn)行優(yōu)化以使其運(yùn)行的更快相比,我們找到了更好的方法,用更少的力氣就能達(dá)到同樣的效果。過(guò)去,定位會(huì)在UI層級(jí)中的每一個(gè)架構(gòu)中實(shí)現(xiàn),而現(xiàn)在,我們對(duì)結(jié)果進(jìn)行緩沖,只在相關(guān)的屬性發(fā)生更改時(shí)進(jìn)行定位。
定位與渲染的分離會(huì)使每一部分的優(yōu)化變得更容易了。
我為什么要關(guān)心這個(gè)?
2003年,EVE面世的時(shí)候,它的UI 看起來(lái)和市面上其他一些游戲相差無(wú)幾,如今時(shí)光流逝,而我們的UI卻沒(méi)有隨之進(jìn)化。盡管CarbonUI工程浩大且艱難,但它 對(duì)我們的意義不言而喻,有了它,我們可以超越現(xiàn)有技術(shù)的限制而實(shí)現(xiàn)我們的想法。當(dāng)我們?cè)谡椒?wù)器上應(yīng)用CarbonUI之后,玩家也許并不會(huì)看出什么變化,但是我可以向你們保證,我們的UI設(shè)計(jì)師在把他們那些瘋狂的想法告訴身邊的程序員時(shí),聽(tīng)到的多是“好的,沒(méi)問(wèn)題”,這意味著我們的游戲有了更多的可能性,會(huì)變得更棒的。
它會(huì)有怎樣的表現(xiàn)?
在將來(lái)的開(kāi)發(fā)日志中,我們會(huì)帶來(lái)更多的細(xì)節(jié),告訴玩家CarbonUI到底會(huì)帶來(lái)怎樣不同的游戲體驗(yàn)。