【开发日志补全计划】CarbonUI以及EVE: Incursion 1.6
原作者:CCP Snorlax
原文:http://community.eveonline.com/devblog.asp?a=blog&nbid=2323
我们会在本次更新中为EVE加入全新的CarbonUI架构,你可能不会觉得它比之前有了很大变化,因为这一次我们主要修正了基础的代码,而不是用户界面本身。去年里,我们对用户界面(UI)进行了核心化改造(corification),使得今年的修改成为了可能。这是一个很大的项目,目的是为将来EVE UI的发展铺平道路,你可以在下文中获知更多信息。我们热切期望获得玩家的反馈,大家可以通过官方论坛等渠道将意见告知我们。
为什么要用CarbonUI呢?
以现在的眼光来看,EVE的UI以及游戏中负责渲染的基础代码都已经显得有那么点过时了。过去的UI渲染使用的是Direct3D——基本上是D3D7中的固定函数渲染,而D3D9虽然也支持这一方法,但是会遇到瓶颈,使得你被限制在固定函数所能提供的功能上面——比如说,没有炫丽的着色什么的。
我们一直以来都想对EVE的UI进行一次彻头彻尾的大修,原因如下:
1.使它更容易使用
2.使它的外观更好看
3.使它的性能表现更好
而UI架构本身卡住了我们,因为它已经服役很多年了,显得十分笨重繁琐,我们在试图改进它的性能表现时遇到了很多无解的问题。我们一直在向UI里加入新的功能,但是却没有足够重视架构本身。
我们考虑过几种方案来改进UI架构,但最终我们发现整个EVE的UI代码实在过于庞大,想要以新的模式重新制作所有的UI是不现实的。无论最终我们用什么方法改进UI架构,我们都要使它尽可能少地涉及到UI代码的重制。
因此,拥有全新的渲染层的CarbonUI是对现有UI架构的一次革命性进化。我们努力去尽可能少地改变高级接口,这样使用Python的UI程序员就不会感觉到有很大的改变——更重要的是,那些20几万行的UI相关代码也还可以正常工作。尽管如此,我们还是修改了许多代码,有些是为了与新的渲染层相兼容,有些则是因为其本身就需要修改。结果,在某种程度上来讲,也没剩多少UI文件没被修改过了。
一些关键特性:
1.UI场景可以在不同环境中渲染:
UI物件的贴图可以被渲染成3D效果,UI同时也支持其以3D方式呈现并可以在3D场景中与玩家进行互动。

上面的截图展示了一幅UI界面分别以2D及3D渲染后的效果。点击图片可以放大。
还可以将UI渲染为以原始的2D方式在3D场景中呈现,并加入了层次感和透视效果。

开发中的UI界面,图为人物在舰长室中与物品互动,建立在CarbonUI的全新功能基础上。点击图片可以放大。
将普通的2D效果渲染为2D覆盖图
1.所有的Python代码和UI物件在这些不同的环境中都是一样的——场景可以从一个环境中实时移到另一个环境中。
2.基于旧的UI架构的性能提升
贴图会被自动收集在一个贴图库中,这样在渲染时就会更有效率,也不用增加UI美工的工作负担了。
裁剪在像素着色器中完成。
变换在顶点着色器中完成。
像素着色器的像素深度太不够透明了,通过一个D3D混合模式可以处理透明混合及饱和相加混合。
最终的结果就是我们极大地减少了其状态变化——通常情况下,整个UI在10个绘图指令之内就可以完成,而不是之前的数百个。
3.定位功能现在完全地同渲染分离开了。
定位系统已用Python编写完毕,变得更容易维护了。
优化渲染不会再破坏定位了。
4.渲染全在着色器中进行,这样我们就有机会用像素着色器做出很酷的东西了。
所有的基本元素都支持简单的效果了,比如阴影、光晕和模糊。


UI设计师正在使用测试工具在基于CarbonUI设计的UI界面上测试特效和动画。
5.新的动画库用Python编写完成,创造动态的UI变得更容易了。
定位
定位是什么意思呢?它其实就是那些UI元素呈现在玩家面前的方式——所有的UI元素在屏幕上都有相应的坐标点,不过UI设计师并不需要把每一个元素都按照它的坐标放在屏幕上。比如说,如果她想在某个窗口的底部正中间位置放置一个按钮,那么这个按钮就具有了“底中部”的定位属性。如果这个窗口的大小发生了变化,那么UI架构会重新计算坐标位置,使得这个按钮总是保持在窗口底部正中间的位置。
用Python取代C++来定位是一把双刃剑。用C++毫无疑问会更快,我们也确实对Python的定位速度有点纠结。但是另一方面,使用C++也意味着我们很难改变或增加某些定位规则,原因有以下两点:
1.UI元素的渲染与定位是紧密相连的,改变定位就有着破坏渲染的风险,反之也一样。
2.对Python的更改进行测试的周期循环要比对C++的短得多。
与试图对定位的Python代码进行优化以使其运行的更快相比,我们找到了更好的方法,用更少的力气就能达到同样的效果。过去,定位会在UI层级中的每一个架构中实现,而现在,我们对结果进行缓冲,只在相关的属性发生更改时进行定位。
定位与渲染的分离会使每一部分的优化变得更容易了。
我为什么要关心这个?
2003年,EVE面世的时候,它的UI 看起来和市面上其他一些游戏相差无几,如今时光流逝,而我们的UI却没有随之进化。尽管CarbonUI工程浩大且艰难,但它 对我们的意义不言而喻,有了它,我们可以超越现有技术的限制而实现我们的想法。当我们在正式服务器上应用CarbonUI之后,玩家也许并不会看出什么变化,但是我可以向你们保证,我们的UI设计师在把他们那些疯狂的想法告诉身边的程序员时,听到的多是“好的,没问题”,这意味着我们的游戏有了更多的可能性,会变得更棒的。
它会有怎样的表现?
在将来的开发日志中,我们会带来更多的细节,告诉玩家CarbonUI到底会带来怎样不同的游戏体验。