我对架构设计的理解
Posted 海洋_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我对架构设计的理解相关的知识,希望对你有一定的参考价值。
游戏架构设计是一个老生长谈的话题,以前给多个游戏公司培训过,随着时间的积累,对游戏架构设计的理解又多了一些,在此给读者分享一下我对于架构设计的理解。
游戏架构设计是基于引擎的基础上的二次封装,目的是便于游戏开发者能够专注于逻辑的编写,便于多人协同开发,便于功能的扩展等等。不论使用什么引擎,只要掌握了思想,就能解决问题。
我先把我们的设计思想介绍一下,我们的架构设计总体来说是基于组件的模块化设计,举个例子,一个角色要移动,要战斗,要释放技能,我们只需要把移动组件,战斗组件,不同的技能组件加到角上身上就可以了,其他的诸如管理类也是以组件的形式加载到内存中,每个组件都是一个View,我们在设计时,对象上的脚本挂接的非常少,几乎不挂接任何脚本,这样是为了保证资源更新不影响逻辑的编写。下面我们逐一介绍架构设计的实现想法,主要分三步:
第一步:通过观察者模式监听消息,这个消息包括网络消息,各种资源加载消息等等,这个主要是与引擎相关的,对于逻辑层来说,只需要拿到对应的消息处理即可。
第二步:更新游戏对象相关的个体了,在这一步里面,我们可以使用FSM有限状态机,行为树等等,当然也包括玩家的虚拟遥感或者键盘,鼠标等等输入设备。
第三步:逻辑交互层,包括客户端与服务器进行交互,还有对象与场景中的NPC交互等等,这些操作主要是在逻辑层中进行的,比如客户端链接服务器需要链接IP地址和端口号。另外,还有游戏中角色网络同步交互,角色同步更新回到了第二步更新个体了。
以上三步也是一个循环的过程,这样整个游戏架构就形成了一个闭环。下面再介绍实现上述思想需要注意的问题:
-
内存管理
这个不论是引擎还是架构设计必须要解决的问题,内存问题解决不好,后期内存泄漏,内存碎片等等都会出现,会导致游戏崩溃,卡顿等问题,所以内存这块必须要用心设计。内存设计可以直接采用Dictionary,List,但是并不灵活,比如,我们的数据采用的是不同的结构体数据或者可变的数据,尤其是网络传输的数据,Dictionary和List就很难满足了,我们还可以采用自定义结构体。 -
资源的加载
资源加载会涉及到多种资源,比如重复的资源加载,角色和骨骼动画加载,大的场景资源加载,琐碎的资源加载比如角色头上的血条等等。这些资源的处理方式是不同的,比如重复资源可以采用对象池的方式,角色头上的血条可以采用对象池与自定义网格结合的方式,角色身上的骨骼可以采用共享的骨骼动画方式,最后是大的场景资源在加载时要保证足够大的内存,防止琐碎内存过多导致加载大资源时卡顿。 -
渲染
渲染的好坏决定了游戏的品质,渲染包括很多:模型的材质渲染,特效渲染,后处理渲染,地形渲染以及一些特殊效果的渲染。先说说模型的材质渲染,模型的贴图渲染有很多种,PBR,NPR,V-RAY等等,后处理渲染,包括,HDR,PSM,景深,Bloom,Blur,体素渲染等等,地形渲染主要是对地表的贴图渲染。我们对模型的渲染要注意材质贴图的大小。 -
AI
AI算法包括AI寻路和行为树,AI寻路一般会采用A*算法,包括客户端和服务器都可以采用,AI行为树主要用于个体的行为更新。 -
架构设计
我们会采用组件模式,MVC,FSM,State,Observe,Factory,Singleton等等就可以设计实现我们需要的框架。
总结
架构设计思想很重要,编写代码运用任何语言都可以实现。热更新方案市面上都有现成的方案,可以拿过来直接使用。以Unity为例,C#有很多的语言特性:Attribute,Delegate, Action,Func,Reflection等。熟练运用它们我们实现架构设计没有任何问题。其实所谓的架构设计,需要满足多人协作模块开发,架构功能易于扩展等等即可。
以上是关于我对架构设计的理解的主要内容,如果未能解决你的问题,请参考以下文章