我对架构设计的理解

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jxw167/article/details/86768561

游戏架构设计是一个老生长谈的话题,以前给多个游戏公司培训过,随着时间的积累,对游戏架构设计的理解又多了一些,在此给读者分享一下我对于架构设计的理解。
游戏架构设计是基于引擎的基础上的二次封装,目的是便于游戏开发者能够专注于逻辑的编写,便于多人协同开发,便于功能的扩展等等。不论使用什么引擎,只要掌握了思想,就能解决问题。
我先把我们的设计思想介绍一下,我们的架构设计总体来说是基于组件的模块化设计,举个例子,一个角色要移动,要战斗,要释放技能,我们只需要把移动组件,战斗组件,不同的技能组件加到角上身上就可以了,其他的诸如管理类也是以组件的形式加载到内存中,每个组件都是一个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等。熟练运用它们我们实现架构设计没有任何问题。其实所谓的架构设计,需要满足多人协作模块开发,架构功能易于扩展等等即可。

展开阅读全文

我对网站优化的理解

03-06

学网络搜索引擎优化(SEO)也有一段时间了,网上关于SEO的学习资料很多,看法也众说纷纭,在此我也谈谈我对SEO的粗浅了解。rnSEO通俗的讲,就是使用google或者baidu搜索某个关键词时,使你的网站排在搜索结果前几页的一种技术,或者一种策略。比如搜索“二手汽车”,你就要想办法使你关于二手汽车转让或者销售的网站,尽可能排在搜索结果的前几页,最好是第一页,这就是SEO。rn影响搜索结果排名的因素很多,网站的访问流量是很关键的一个因素,不错的访问量,再加上选择好的关键词,pr值高的网站做外链,网站从目录到内容整体结构的优化,利于搜索引擎爬虫更好的访问网站,这样做以后,我相信你的排名也就不会差到哪里去了。rn下面谈谈具体的SEO优化的技术:rn一、 关键词的选择。rn网上关于关键词选择的内容很多了,这方面就不多说了,强调一点,我觉得选择关键词rn的时候,可以考虑选择“长尾关键词”。具体的内容,大家可以参考www.seowhy.com这个网站很不错,里面的内容也很多,就是采用长尾优化很成功的一个网站。rnrn二、 关于PR值rn在SEO中很多人过于神话了PR值的重要性,我个人觉得这不完全对。在google中诚rn然将PR值做为搜索结果排名的一个因素,但却绝对不是决定因素。举个简单的例子,我所在公司的网站www.cocpdp.com 的PR值是4,其实没有怎么优化,也没有多少外链,只有一个长虹总公司的外链www.changhong.com他的PR值为6。 PR值为4按理来说流量应该不错了,实际上并不是这样,这个网站很久没有更新,google的爬虫也是10天左右才访问一次,所以在搜索与其相关内容时,它并不会很靠前。rnrn三、 关于外链的选择rn外链的选择很重要,尽量选择PR值高的网站,就像前面所讲的一样,一个高PR值的rn网站,可以将链接的网站的PR值也提高。如果你能跟163、sina、yahoo这些牛B的网站外链上,那么恭喜你,你的PR值肯定不用愁了。当然,这些大公司一般不叼咱们这些小虾米,这时候选择链接的网站,就尽量选取同行业或者相关行业的网站做链接,有一点特别注意不要加入那种链接农场,貌似很多网站可以相互链接,但事实上,只要一个网站被搜索引擎发现有作弊的行为,就会殃及池鱼,你的也就有可能被google或者baidu K掉。新站一般不宜快速进行外链,等被搜索引擎收录后,一般2~3个月,进行外链比较合适。这段时间新站的网上排名很不稳定,或者没有排名,这是很正常的,一般被称为沙盒效应(sandbox),持续rn3个月到半年,排名逐渐就开始稳定下来了。rnrn四、 关于网站结构的优化rn网站整体结构的优化也很重要,很多SEOer过多的沉迷于网站关键词的选择,我认为rn这是不对的。很多搜索引擎对keywords、description标签等已经不在很感“性趣”了。网站整体结构的优化才是王道。首先,是URL的优化,一个清楚的,能表明网站特点的URL当然在用户搜索时,能为其加分的,尤其是英文站。当然现在好的URL,基本上剩的不多了,如果有合适的你就赶快注册吧。其次,是页面代码的优化,很多SEO高手都强调过页面尽量少一点flash或者javascript代码,虽然影响了视觉效果,但确大大加快了搜索引擎爬虫索引网站的速度。如果非要用到flash做菜单,也最好在下面采用静态的方式做个导航条。现在的网站大多采用div+css进行布局,嵌杂着大量的js代码,很多专家建议,单页面的大小最好不要超过100KB,是很有道理的,太大了会影响搜索引擎索引速度。如果代码太多,可以采用一些压缩工具,对页面的代码进行一些优化。有一个不错的javascript压缩器叫做packer(http://dean.edwards.name/packer),大家可以看一下,是国外的一个牛人写的,相当的有才。最后,再把网站上的图片的部分也利用起来,那就是ALT标签的作用了,网上关于这一点,已经说的很多了,我就不老生常谈了。rnrn五、 内容好才是王道rn呵呵,这句话有点像P话,也是实话。一个优秀的SEO从业者能使一部分人发现某个rn网站,但却不能保证他再次访问这个网站。一个优秀的网站策划人员或者叫信息架构师的三个目标就是:使用优化技术使用户找到你的网站,在你的网站上找到他所需要了解的内容,是他对你的网站产生兴趣,并可能经常光顾。在这点上很多大的网站都做的很好,像网易的新闻,尤其是评论部分,有一定的言论自由,很多人热衷于此。CSDN、天涯、百度贴吧等等都做的很好,因为他们很好的考虑了用户的体验度。一句话,优秀的内容,大量的原创,经常的更新,网站的排名和PR值也就自然上去了。rnrn六、 分析优秀的竞争对手rn知己知彼,百战不殆。这句话用在SEO行业同样有效果,搜索一个关键词,然后仔细rn分析排在前5位的网站,你肯定会有很多心得。rnrnSEO行业未来的预测rn要想做好SEO,我个人觉得在网站一开始制做的时候,就要综合考量,就要以易推广性、易发现性、易使用为原则,而不要等什么都弄好了,再进行优化,这时候再对网站结构做调整就是很麻烦了。目前SEO这个行业有点混乱,水平也高低不齐,白帽SEO、黑帽SEO或者两者兼而为之。有些SEOer通过为竞争对手制作恶意镜像站,为竞争对手制作恶意的黑帽链接,挤夸对手,抢得排名。所以,我个人觉得随着大家网站优化意识的加强,专业做SEO的人员,以后机会越来越少了,而且搜索引擎也必然要不断的对网站真正的“价值”,对用户的需求,有一个较为可靠的判断。如果搜索引擎的技术没有不断的更新,没有越来越人工智能,那所有的网站可能就只有通过竟价取得优先排名了。rnrn以上内容,全是一家之言,欢迎广大高手对其进行批评指正。rn在下博客地址:blog.csdn.net/huanghaigoodrnrn 论坛

我对抽象的理解

11-27

新人一个,学java两个多月了,说说我对抽象的理解。rn假设电脑系统坏了,那么我们脑中首先想的就是解决方法,这时脑中想的解决方法就是抽象的如:rnclass 装系统rnrn public abstract void 修电脑方法_U盘();rn public abstract void 修电脑方法_光盘();rn public abstract void 修电脑方法_ghost镜像();rnrnrn如上我们想到了三种安装系统的方法,一种是需要系统光盘,一种是需要一个做成启动项的U盘,并且里面有win7的镜像,一种是需要电脑中非系统盘符内写有win7系统的镜像,并且电脑内有一键ghost; 那么我们开始找所需要的装系统工具,目前找到的工具只有一个U盘,U盘内与上述符合,那么开始用U盘装系统。代码如下:rnclass U盘装系统 extends 装系统rnrn public abstract void 修电脑方法_U盘()rn rn 将U盘插入电脑;rn 找到镜像装系统;rn 安装完毕;rn rnrnrn如上所写:我认为抽象放到现实生活就是,发生了一些问题需要你解决,你当时想的解决方法就是抽象到,当你按照你脑中那个方法做的时候就等于将抽象方法实现了,再举个例子:你的电脑坏了需要修理,你心里就想到了解决方法(abstract),然后你就用想到的方法去修理(实现)。rn其实人就是一个抽象与实现的个体,如果发生一件事,你自己能解决就等于你自己把抽象方法实现了。如果自己解决不了就找到其他实现了此类抽象方法的人。rn还拿修电脑说事:rnclass 张三rnrn public void 吃饭;rn public void 喝水;rnrnclass 张三的电脑 rnrn //张三没有这功能所以rn public abstract void 修理();rn rnrnclass 修电脑的 extends 张三的电脑rnrn rn public abstract void 找到毛病修理()rn rn rn 电脑 r=修理();rn rn private 电脑 修理 ()rn rn 修理完毕();rn return 修完的电脑;rn rnrn请大神点评理解的对不对,至于代码小小得了 论坛

理解的对么?

01-05

directshow播放顺序rn我在网上看了些帖子,但是和我理解的存在点疑问,来这里问问。rn我的理解是这样:rn1)rnrnhr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, rn IID_IGraphBuilder, (void **)&pGraph);rn//hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC,rn//IID_IMediaControl, (void **)&pMC);rn//以上两句只是通过不同的方式来来获取FilterGraph 并且 可以通过IID_IGraphBuilder IID_IMediaControl 互相获取对方!也可以获取其他借口只是要遵循下面的规则:rnrnrnhr = pMC->QueryInterface(IID_IGraphBuilder, (void **)&pGraph);rnhr = pGraph->RenderFile(lpszMovie, NULL);//是不是这句要传给filer graph视频 然后只用这句调用完成之后才会 有真正的内容在filer graph(类似于实例化一个对象)rn//然后才可以通过pGraph 获取其他借口 ,对视频的控制才有效果rn//总结是就是pGraph->RenderFile 必须先于pGraph->QueryInterface(IID_IMediaSeeking, (void **)&pMediaSeekiking);rn//pGraph->QueryInterface(IID_IMediaPosition, (void **)&pMediaPos);rn//pGraph->QueryInterface(IID_IVideoWindow, (void **)&pVideoWnd);rn//pGraph->QueryInterface(IID_IBasicVideo, (void **)&pBasicVideo);rn//调用才会有用,打破了这个顺序就会出错。rnrnrnpGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);rnpGraph->QueryInterface(IID_IMediaEventEx, (void **)&pEvent);//pMC->QueryInterface(IID_IMediaEventEx, (void **)&pME); 这两句是一样的rnpGraph->QueryInterface(IID_IMediaSeeking, (void **)&pMediaSeekiking);rnpGraph->QueryInterface(IID_IMediaPosition, (void **)&pMediaPos);rnpGraph->QueryInterface(IID_IVideoWindow, (void **)&pVideoWnd);rnpGraph->QueryInterface(IID_IBasicVideo, (void **)&pBasicVideo);rnrnhr = pControl->Run();rnhr = pEvent->WaitForCompletion(INFINITE, &evCode);//调用这这句会发生阻塞,等待视频播放完成rn//如果我这时候调用pMediaPos->put_CurrentPosition();的会产生中断,处理这个设置当前视频的位置rnrnrnrn忘指正!谢谢rn 论坛

没有更多推荐了,返回首页