第39章 引擎的降维优化(1/2)
十一月底,寒流南下了。深圳的气温一夜之间跌到十度以下,创新大厦的中央空调开了暖风,但五楼东侧的玻璃房里还是冷——不是温度低,是人心冷。
屏幕上是一个刚跑起来的“山海”原型。画面很简陋:一片低多边形的草原,几棵纸片般的树,一个粗糙的3d角色站在中央。角色穿著基础布衣,手里拿著一把木剑。按下wasd,角色移动,动作僵硬,帧率显示:15 fps。
“这就是极限了。”阿坤的声音很疲惫,带著一种接近崩溃的平静,“在集显上,同屏十个角色,帧率就掉到15以下。如果是战场,一百人同屏,会卡成ppt。而2003年,中国70%的网吧电脑,用的都是英特尔845g集显,显存共享系统內存,性能是现在测试机的十分之一。”
测试机是浩宇刚採购的“高配”:奔腾4 2.4ghz,512mb內存,geforce fx 5200独立显卡,128mb显存。这在2003年已经是顶尖配置,但跑“山海”原型依然勉强。而真实的用户环境,是赛扬1.7ghz,256mb內存,英特尔845g集显——性能差五倍不止。
玻璃房里坐了十二个人,没人说话。只有机箱风扇的嗡嗡声,和窗外寒风的呼啸声。空气里有种绝望的气味,像手术台上医生宣布“我们已经尽力了”。
陈默盯著屏幕上那个粗糙的角色,手指在桌下紧紧攥著。他画了三个月的原画,设计了几十种怪物,构想了宏大的世界观。但现在,这些可能都出不来——因为机器跑不动。
赵永打破沉默:“能不能再降画质?把多边形数砍一半,贴图解析度降到256x256,关掉所有光影特效。”
“砍了,也救不活集显。”阿坤调出性能分析报告,“瓶颈在填充率。集显的像素填充率只有200mt/s,我们的场景即使降到最低画质,填充需求也要500mt/s。这是硬体天花板,不是优化能解决的。”
“那……放弃集显用户?”王磊试探著问,“只针对独显用户开发?但那样我们会丟掉70%的市场。”
“丟掉70%,剩下的30%里,还有一半是geforce 4 mx这种入门独显,性能比集显好不了多少。”阿坤摇头,“林浩,『山海』可能……做不了。至少,做不成3d mmo。也许我们可以退回2.5d,像《奇蹟mu》那样,固定视角,简化场景。”
所有人看向林浩。他坐在角落的椅子上,一直没说话,只是盯著屏幕,盯著那个帧率数字:15。眼神很空,像在看很远的地方。
然后他站起来,走到白板前。拿起笔,写下一行字:“2003年硬体性能约束下的3d渲染解决方案”。
“我们走错方向了。”他说,声音很平静,但每个字都像钉子敲进木头,“我们一直在想『怎么让3d跑得更快』,但真正的方向应该是『怎么让玩家觉得这是3d,而实际上不是』。”
阿坤皱眉:“什么意思?”
“意思是,我们要做『偽3d』。”林浩转过身,看著玻璃房里的人,“不是真3d,是看起来像3d,用2d的技巧模擬3d的效果。2003年的硬体跑不动真3d,但跑2d绰绰有余。《血战天下》万人同屏都不卡,因为2d渲染开销小。如果我们能用2d的技术,做出3d的体验呢?”
“不可能。”阿坤脱口而出,“3d的核心是透视、光照、深度。2d怎么模擬?”
“预渲染。”林浩在白板上画图,“把3d场景预先渲染成2d图片,分层存储。运行时,根据玩家视角,动態拼接这些2d层,製造出3d的透视感。光照也用预烘焙——把光影信息算好,存在贴图里。角色还是3d模型,但场景是2d图片。这样,90%的渲染开销省掉了。”
玻璃房里死寂。然后阿坤猛地站起来,椅子腿刮擦地板发出刺耳的声音。
“这是欺骗!”他声音提高了,“预渲染的2d场景不能旋转视角,不能动態光照,不能破坏地形!这算什么3d?这是过场动画!”
“但玩家要的不是真3d,是3d的『感觉』。”林浩看著他,眼神很锐利,“阿坤,你玩过《最终幻想7》吗?”
阿坤愣住。
“1997年的游戏,ps1平台,性能还不如现在的集显。但它用了预渲染背景加3d角色的技术,让玩家觉得那是3d世界。玩家不能旋转视角,但他们会忘记这一点,因为他们被故事、战斗、探索吸引了。”林浩顿了顿,“我们要做的,是升级版。用动態图层实现『偽旋转』,用多层叠加实现『偽深度』,用精灵动画实现『偽光影』。技术上,这是2d。体验上,这是3d。”
陈默眼睛亮了:“就像……皮影戏?用多层剪纸,前后移动,製造立体感?”
“对。”林浩点头,“场景分五层:远景(山、云)、中景(建筑、树木)、近景(路面、杂物)、角色层、特效层。每层是2d图片,但可以独立移动、缩放、淡入淡出。玩家移动时,各层以不同速度滚动,產生视差,感觉像在3d空间里移动。角色是3d模型,但在2d层之间行走,就像在舞台上。”
阿坤不说话了。他走回座位,调出代码编辑器,手指在键盘上快速敲击。他在算。算渲染开销,算內存占用,算可行性。十分钟后,他抬头,眼神复杂。
“理论上……可行。预渲染的场景图,一张1024x1024的png,压缩后只有200kb。一个地图用十张,也就2mb。內存占用是现在3d场景的十分之一。渲染只需要画2d精灵,集显完全能跑满60帧。”他顿了顿,“但……动態光影怎么办?破坏地形怎么办?天气系统怎么办?”
“光影用多层叠加。”林浩在白板上画,“比如,一个山洞场景,我们预渲染三套:白天版、夜晚版、火把版。运行时根据游戏內时间,动態切换。或者更精细点,用『光照蒙版』——一张黑白图,白色区域亮,黑色区域暗,运行时叠加在场景图上,模擬光影变化。”
“破坏地形……做不了。但我们可以用『事件触发替换』。比如一堵墙被炸毁,我们准备两套场景图:有墙版和无墙版。触发爆炸事件后,无缝切换到无墙版。玩家会觉得墙被炸了,实际上只是换了张图。”
“天气系统同理。雨、雪、雾,都是单独一层半透明贴图,叠加在场景上。粒子效果用2d精灵模擬。”
阿坤听著,手指在桌上轻轻敲著,像在脑子里运行这些方案。他不得不承认,林浩说的每一点,技术上都能实现。而且实现成本,比真3d低一个数量级。
“但角色是3d模型,在2d场景里走,不会穿帮吗?”赵永问。
“用『深度缓衝图』。”林浩说,“预渲染场景时,同时生成一张『深度图』,记录每个像素的深度值。角色移动时,根据深度图决定谁在前谁在后。这样,角色可以走到树后,可以被建筑遮挡,看起来就像在3d空间里。”
阿坤长长地、缓缓地吐出一口气。他看著林浩,眼神里有种近乎敬畏的困惑。
本章未完,点击下一页继续阅读。