导航菜单
首页 » 八卦小道 » 正文

乌兰巴托的夜-模拟游戏怎么优化?《医院方案》开发者共享

【Gamelook专稿,转载请注明出处】

Gamelook报导/运营模拟游戏是当下比较抢手的独立游戏品类,其间一些著作还加入了让玩家发明内容的方式,比方Oxymoron Games在去年底发行的《医院方案(Project Hospital)》,就在Steam渠道取得了80%以上的好评。

这是一款制造运营类游戏,玩家们在游戏里能够一起成为一流的医师、有志向的建筑师和成功的管理者,你能够规划归于你自己的医院,调整每一个细节或许运用预置模型直接行医。为了运营医院,你要联络不同的保险公司取得更多带有特别医疗条件的患者,履行查看、实验室测验,并运用各种设备处理各种确诊难题,送患者住院,用手术和其他医治手法协助患者康复。那么,作为独立团队,怎么处理这样一款杂乱的游戏呢?Oxymoron工作室一起创始人Jan Benes最近在博客中共享了他们的一些优化技巧和心得,想要做制造运营类游戏的同行们能够参阅:

《医院方案》有着该品类游戏的一切经典特征:玩家们发明的动态内容、许多活泼的人物和物体以及可拓宽的UI体系。想要在不同设备上完美运转这款游戏,需求许多的尽力,而且也对错闻名事例“凌迟”(a death by a thousand cuts,即每件事都不丧命,但累积起来却能够形成严重后果)的最佳事例,所以需求许多细节进程,处理许多特别问题,也需求在东西上投入许多时刻。

功用指标:咱们真正要完成的是什么?

在研制的初期,咱们设定了想要支撑的场景,到达的功用以及硬件需求等方针。

咱们的方针是能够至少100个全动画人物同屏展现,最高同屏可展现300个人物,做一个100X100图块地图,最高四层。而且期望,哪怕是在集成显卡上,也能在最高帧率下完成1080P作用,这自身并不难完成,由于CPU才是最主要的要素,尤其是跟着亿元的增加。现代的集成显卡现已比较强壮,只要到2560X1440分辨率的时分才会显得费劲。

关于简易模组支撑,游戏里大多数据是敞开的,这就意味着为了一些打包文件而献身了部分功用,但这好像不会有太大的影响,仅有的问题或许便是加载时刻更长些。

图形

由于《医院方案》是一款经典的2D三维不透明游戏,你能够幻想一切东西都是从后往前烘托的,在Unity引擎里,每一个图形物体都需求设置正确的Z值(或许说是到摄像头的间隔)。在或许的状况下,不互动的物体会被放到不同的层面,比方不同楼层与物体和人物都是独立的。

在笔直烘托的场景中,一切的几何图形都是用C#动态发明的,所以需求重建的几何图形频率是两个最重要部分的其间之一,第二个部分便是制造调用(Draw Call)次数。

Draw Call

不论物体有多么简略,单个物体的制造都要占用一帧,这是最主要的约束之一,尤其是在低端设备上(再加上Unity自身也有额定占用),最显着的处理方案便是尽或许在一次制造调用中批处理更多的图形物体,但这么做会带来一些风趣的成果,比方能够批处理的物体和摄像头的间隔相同,所以其他图形也能够在前面或许后边被恰当地烘托。

这儿罗列一些数字:在一个96X96地图上,,理论上你能够放置9216个物体,这或许需求9216次draw call,批处理之后,调用次数下降到了192次。

但是,在实际条件下,这会变得更杂乱一些,由于只要相同纹路的物体才干被批处理,所以成果并没有那么达观,不过,这种办法仍然是可行的。

大多数的批处理都是手动操作的,这样能够操控成果,咱们仍是用Unity的动态批处理作为“终究手法”处理方案,但这种办法有利也有弊,它确实能够下降调用次数,但每帧都会多占用功用,而且有些状况下不行猜测。比方两个与摄像头等距堆叠的精灵图会以不同次序被烘托在不同帧,这就会发生颤动,而手动批处理是不会有这种状况的。

多楼层

让玩家莫不知璃心们能够制造多层建筑增加了许多的杂乱性,但却能够对功用带来惊人的协助。在活泼楼层,只要人物和兵器需求动画和烘托,医院内活泼楼层上下一切的东西都能够被躲藏。

着色器

《医院方案》运用了相对简略的定制化着色器,只要色彩替换等少量乌兰巴托的夜-模拟游戏怎么优化?《医院方案》开发者共享功用,比方人物着色器能够最多替换5种色彩(在着色器代码中运用condition),而且这种做法的价值相对贵重,不过,由于人物所占屏幕的空间不大,所以一般不会带来太大问题。这么做也对错常值得的,由于不约束人物的衣服色彩也给游戏环境和玩家人物带来了多样性。

咱们还快速学会了防止设置着色器参数,而且尽量运用极点色。

纹路质量

一个比较风趣的信息是,咱们在《医院方案》里没有运用任何的纹路紧缩,在矢量图形中特定纹路紧缩之后看起来的作用很差。

为了给内存低于1GB的设备节省GPU功用,咱们主动把游戏内纹路分辨率折半(UI界面不变),所以游戏内纹路的质量是比较低的,而UI纹路坚持了本来的分辨率。

优化CPU功用:多线程

尽管Unity的脚本逻辑基本上是单线程的,但你一直能够挑选直接用C#运转多线程。在游戏逻辑方面,这或许不是一个好办法,但在某些方式的使命体系(Job System)里,一般有乌兰巴托的夜-模拟游戏怎么优化?《医院方案》开发者共享一些非临界时刻使命能够从独自线程运转中获益,在咱们的事例中,咱们为两种功用运用了多线程:

寻路使命,尤其是大地图和布局欠安的环境,寻路往往需求数百毫秒,因而这个使命十分合适从主线程剥离出来,平行使命的数量需求考虑电脑硬件上的线程数量。

光照地图也是经过独自线程更新的,但一次只更新一层楼,这并不是一个重要的体系,而且房间里的主动灯光会跟着缓慢更新而淡出。

动画制造

咱们在研制很前期的时分就决议运用2D骨骼动画体系,在考虑了其时一切的动画软件之后,咱们终究决议运用我在几年前做的一个简略体系(其时是业余爱好项目),来满足《医院方案》里的特别需求,基本上便是简略的支撑人物改变的Spine动画。和用C#运转Spine相同,很显着这种办法比运用原生代码的价值更高,所以在研制期间咱们做了屡次优化,走运的是结构(rig)都十分简略,每个人物大概有20个骨骼。

比较无厘头的现实:当拜访单个骨骼的转化时,最重要的一点是从地图查找切换至数组中的简略索引。

除了不给摄像头之外的人物做动画之外,另一个技巧便是藏在主UI窗口背面的人物也不需求做动画,不幸的是,由于运用了半透明UI,咱们在终究版别中没能运用该技巧。

缓存

在或许的条件下,只要当影响数值的改变时,咱们才会测验运转更为严苛的核算,最好的比方或许是房间和电梯,当玩家们放置一个电梯或许墙体的时分,咱们会运转泛洪填充算法,它能够符号电梯和房间能够运用哪些图块,这在随后会加快寻路,而且能够用于向玩家展现哪个房间现在是不行用的。

涣散、推迟的更新

某些乌兰巴托的夜-模拟游戏怎么优化?《医院方案》开发者共享状况下隔段时刻运转特定更新是有意义的,咱们运用的办法有以下几个:

有些更新只需求在每帧在人物的一部分运转,比方患者一半的举动脚本只在比较古怪的帧更新,另一半则在一般帧更新(一起动画和动作都能够流通运转)。

在特定状况下,尤其是人物约束但需求调用比较许多代码时,更新只在特定时刻内运转,比方每秒一次。

最贵重、有时分也最一般的口令是每个患者的查看评价,这儿需求衡量许多要素,比方一个部门里的哪个职工正在忙、哪个设备现在被预定。这个信息关于一切的患者也是不寻常的,由于他们的主治医师和他们的言语才能也是有影响的。有时分你需求查看的东西有许多,所以更新只在少量帧运转,而且鄙人一帧继续。

定论与心得

优化一款带有许多互动元素的制造模拟游戏是个继续的进程,经过运用Unity里的东西集,而且处理最糟糕的妨碍,成为了我在研制进程中的惯例使命。

尽管游戏研制总有进步的空间,但咱们关于现在的成果是满足的,游戏的运转契合咱们原定的方针,玩家们也常常给游戏做模组,极大超出了原有人物的约束。

或许值得一提的是,即便是和我从前从事过的3A游戏比较,我觉得《医院方案》也是我见过最杂乱的玩法逻辑,所以许多问题是特定项目才呈现的,不过,预留满足的时刻做优化是任何项目都需求做的。

二维码