Cocos2d-X游戏引擎是什么软件控制环路体系结构风格格?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&1207人阅读
Cocos2D-x 3.0(18)
Cocos2d-X(64)
  触控科技近日发布了Cocos2d-x3.0RC版本,主打开放、原生、创新路线。作为全球三大游戏引擎之一,Cocos2d-x吸引了国内外一批优秀的开发者和游戏作品,包括《放开那三国》、《刀塔传奇》、《BadLand》、《勇者斗恶龙》、《Dragon City》、《Line Play》等。新版本的Cocos2d-x引擎在跨平台游戏开发、打造完整的工具链、包含完整开发流程方面,做了更进一步的尝试。为了更全面地了解Cocos2d-x 3.0的性能特性,《程序员》日前对触控科技副总裁、Cocos2d-x游戏引擎作者王哲进行了专访。
Cocos2d-x 3.0的性能优化
《程序员》:较之上一个版本,Cocos2d-x 3.0在哪些方面做了改进?
王哲:在Cocos2d-x 3.0中,我们着重改进一些很基础的工作,从之前发布的Alpha版本来看,大家最关心的主要围绕以下三点:性能、兼容性(尤其是Android手机的兼容性)、CPU和内存消耗。在性能方面,我们优化最好的是自动技术、当一个游戏场景大出手机屏幕很多时,引擎会自动帮你把屏幕之外的东西给剔除掉,这使大场景游戏的流畅度有2~8倍的提升。另一个是模拟合并,从技术支持的反馈来看,有50%的开发者不懂得如何使用这个功能,而在3.0中,该功能可以自己判断是否开启,并且性能已非常接近与手动调试。在提升兼容性方面,我们测试了200款Android机型,较之2.2版本的85.71%,3.0版本的兼容性达到了90.71%,而在国外,一些引擎的兼容性只能达到三分之一左右。至于CPU和内存消耗,3.0比2.2版本的启动时间缩短了25%,CPU的平均占用率也降低了36%。
《程序员》:除了性能上的优化外,在具体的功能上你们做了哪些工作?
王哲:我们首先从新的渲染器着手。Cocos2d-x的核心结构就是场景结构树,它由一个根节点延伸出许多子节点。(如图1所示)
如果根节点向右移动200个像素,它的子节点也会跟着旋转200个像素。这种设计的局限性在于,由于Draw节点和Visit节点非常紧密,要访问某个节点就必须先画这个节点,由此造成批量渲染功能难以实现。而且如果想跨平台,就需要所有节点都支持新平台。我们建立了一个新的组件,它里面有一个渲染队列,每个节点都会发布它的渲染指令,这样,我们就可以分解Draw命令,Visit访问节点,实现批量渲染,并且所有OpenGL都会集中在渲染器里,因此,实现跨平台非常容易。
第二是新的API,Cocos2d-x的代码中会看到一些Sprite C的用法,但它和C&#43;&#43;是不同的语言,于是,我们将它改成了更符合C&#43;&#43;程序员使用习惯的方式。例如,我们把2.0中使用的CCSprite改成了Sprite,用不同的命名空间来为Sprite命名。
《程序员》:有哪些修改和功能是来自开发者的反馈?
王哲:Critical Bug肯定是最先要解决的,此外还有平台不兼容,以及3.0中的XCode最新版本,有些开发者直接编译时挂掉了,这些问题肯定要优先解决。其他的还包括易用性,比如开发环境、Custom Draw以及Coding IDE等,这些功能都是大量开发者反馈需要的,所以我们就做出来了。
《程序员》:Cocos3d-x与Unity 3D引擎的主要区别是什么?
王哲:2D引擎发展到现在,表面上看其实都差不多,3D引擎也类&#20284;,最后拼得还是性能、效率,以及是否能用它做出比较炫的画面效果。Cocos3d-x发展到今天,至少做出了像《捕鱼达人3》这样比较炫酷的游戏,有这样一款产品来验证它。可以说,在稳定性、高性能这些方面,我们已经做的很好了,但在易用性上,说实话,差距还是挺大的,毕竟编辑器这些是Unity 3D的优势,但框架方面我们做得更好。
《程序员》:在技术实践中,有哪些团队对Cocos2d-x引擎的理解和操作堪称范例?
王哲:确实有一些,比如像《忘仙》和《君王2》,他们改掉了一些东西,比如在TextureCache里增加警戒线,达到某个警戒线就触发一个回调,在回调里面释放掉一些资源,通过这种方式来保证它的内存不会爆,不过这对于一般休闲类游戏的作用不大,我没有添加这个功能主要是不想增加引擎的复杂度。另一个是《刀塔传奇》,他们的技术人员很有意思,他们如果直接用Flash Dragon Bone&#26684;式导出,引擎可以直接解析。但他们觉得不爽,就自己写了一个Flash插件,把Flash里的骨骼动画导出到2DX里解析出来。所以,这款游戏里的动作打斗场景都是他们自己做的一套。
增强培训,与开发者共赢
《程序员》:你们与开发者通过怎样的方式进行交流?
王哲:我们的Issue System是开放的,开发者认为哪里不好,可以直接提交任务,我们每天都会有人去查看,如果某个问题提出的人多的话,我们会马上分配开发团队去做,这是一种很好的交流方式。此外,CocoaChina上有几万个帖子,我们也长期有专人维护,对开发者提出的问题进行统计,针对高频问题我们会马上修改。
《程序员》:除了外语教材外,你们在海外推广和对海外用户的技术支持方面还有哪些举措?
王哲:在推广方面我们做的不多,只会定期公布一些用Ccocos2d-x引擎开发的热门游戏的名单。在对海外用户的支持方面,目前,Cocos2d-x的教材已包含:中、日、韩、英、西五种语言。在接触方面,应该还是跟日韩的开发者接触多一点(因为游戏风&#26684;和地理位置与中国都比较接近),比如2013年11月在韩国举办的开发者沙龙等。此外,日本有一个自发Cocos2d-x学习社区叫“知友会”,他们会定期组织一些活动。2013年12月我和林顺在参加了他们组织的线下沙龙并做分享。另外,他们还会帮我们把社区里的文档翻译成日语,以便更好地帮助本土开发者。
《程序员》:目前,你们已经与一些高校合作,使Cocos2d-x的开发作为学分课程,那么,课程的设置及合作模式是什么样的?
王哲:整个课程设置的核心围绕着Cocos系列工具,包括Cocos2d-x和CocoStudio等。但在前期调研时发现,很多学生不仅想学习知识,还非常关注行业动态、开发流程,甚至游戏运营等问题。基于此,我们共设置了9门课程,从游戏的开发概论、行业数据分析、游戏策划、美术,一直到游戏运营。每个部分按单元来划分,每个单元32个课时。另外,我们还与学校合作,建立了实训基地,让学生可以实际体验游戏开发的全过程,如果有人想创业,我们也会提供技术和资金上的支持。最后,在师资方面,目前大部分课程是由触控的工程师负责授课。我们正在加强对高校的老师的培训,帮助他们掌握最新的开发知识。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1600753次
积分:17040
积分:17040
排名:第394名
转载:1256篇
译文:24篇
评论:25条
(10)(2)(2)(7)(3)(1)(3)(1)(1)(1)(1)(1)(2)(1)(7)(4)(36)(121)(25)(2)(5)(13)(62)(2)(6)(2)(17)(14)(26)(23)(9)(17)(105)(61)(29)(32)(44)(99)(82)(14)(47)(57)(78)(102)(50)(60)用 swift 写游戏和用 cocos2d 之类的引擎有什么区别? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
已注册用户请 &
Game Engines
Sponsored by
国内领先的实时后端云野狗 API 可用于开发即时聊天、网络游戏、实时定位等实时场景传输快!响应快!入门快!
Promoted by
用 swift 写游戏和用 cocos2d 之类的引擎有什么区别?
10:42:24 +08:00 · 4140 次点击
我想做一款类似 2048 或者像素鸟那样的小游戏
cocos2d-x 和 unity 都是不错的跨平台游戏引擎
但是我试用过之后发现, 如果是小游戏的话, 用这两种引擎得不偿失, 各种坑.
那如果我用原生 swift 写游戏会遇到哪些困难呢?会比用现成的引擎麻烦很多吗?
26 回复 &| &直到
09:57:07 +08:00
& & 10:43:58 +08:00
& & 10:45:06 +08:00 via iPhone
最大缺点是你写的游戏只能在 iOS/OS X 运行,抛弃了 Android 。 如果不是为了尝试玩玩的话,建议还是用跨平台框架
& & 10:51:23 +08:00
@ 比如 cocos2d-x 连画条斜线都是各种锯齿, 还没有抗锯齿的方法, 还有各种其他兼容性问题, 各种小 bug, unity 我学不下去, 各种拖拽连线感觉思路跳的太厉害
& & 12:42:07 +08:00
用 libgdx :)
& & 14:09:29 +08:00
现在有一些英文电子书教写小游戏都是你说的那种类型,
Unity 如果写小游戏还是会更容易些,
你可能还是不习惯,推荐《 Unity 游戏设计与实现
南梦宫一线程序员的开发实例》有电子版的¥ 39.9
你可以下载其中的资料 《 Unity 游戏设计与实现-随书下载资料.zip 》 ( 285Mb ),试玩一下里面的几个小游戏看看,都是书中的实例,很有日本人的游戏风格, 这本书我觉得在 Unity 教材里面算是最好的,现在骗钱的废品书也是不少的,特别是一些培训机构出的书,本身就不是行业的从业者,还出来误人子弟,随书实例都惨不忍睹。。。
& & 15:04:36 +08:00
@ 感谢分享. 你对 cocos2d-x 有经验吗?
& & 15:42:58 +08:00
@ 我对 cocos2d-x 还没有经验, 看项目需要,今后可能需要学习。
& & 15:46:31 +08:00
@ 4 月份参加了 Unite Beijing 2015 ,之后一直没时间写游戏试试,主要是太忙。
如果有时间,我还是首选 Unity ,其次 Unreal ,之后才会考虑 cocos2dx 。
为何首选 Unity :
1. 自己对 C# 的熟悉程度远大于 C++
2. Unity 用户群大,著名的《炉石传说》都用它
3. 推广做的不错,书籍相对多一些
4. 偶像 @ 也是 Unity 开发者
& & 16:49:28 +08:00
@ 你忽略了 Unity Pro License 很贵的这个现实- -...
& & 17:46:45 +08:00
@ 然而用 Personal License 我还没做出来过东西 =。=
记得有人说过(貌似是你?),对于 Personal License , Unity 的启动界面过后再来几秒自己的启动界面就好了。。
& & 18:22:14 +08:00
已经用 swift 做游戏将近半年时间。
建议你首先考虑游戏是否跨平台,如果你真心确定就做 iOS 和 OS X 平台的游戏再继续看,否则直接选别的引擎去吧。
然后说 swift 做游戏的事。据我所知用 swift 做游戏基本只有只有如下选择:
1. Cocos2d-objc :
,之前叫 cocos2d-iPhone , swift 发布的时候改名过 cocos2d-swift , cocos2d-x 的灵感来源。现在由于前途未卜又改名成 cocos2d-objc 了...引擎由 Objective-C 实现,与 swift 的结合使用亲测没有大问题。有自己的图形编辑界面 SpriteBuilder ,前身是 CocosBuilder 。
优点:如果你使用过 CocosBuilder 和 cocos2d-x 的话,应该还是比较好上手的。功能还算强大。
缺点:前途未卜。之前一段时间在 Apportable 的帮助下进行了安卓的支持,后来 Apportable 撤出了,这个引擎可以说已经没有什么竞争力了(当然 SpriteBuilder 这个编辑器我个人还是很喜欢的),它的 forum 上也激烈讨论了这个引擎何去何从的问题。现在的状况就是很多底层使用的 API 已经比较过时了,然后寥寥数人还在焦头烂额的勉强维护着。所以制作过程中遇到引擎 bug 可能得自己修复。
还有就是在 swift 中使用 objc 框架时代码补全明显比纯 swift 慢很多,真的是很多,直接影响到了写代码的节奏,不知道是我没调教好的原因还是什么。
文档么,没有非常完善但基础的部分也够用了,毕竟是开源的啥东西弄不明白自己看源码好了。
2. 苹果自己的 SpriteKit 、 SceneKit ,这个不介绍了, WWDC 说的挺全乎的。做 2D 游戏的话就用 SpriteKit , 3D 游戏就用 SceneKit 。这两个框架之间还可以相互使用,就是说你可以 SpriteKit 中加一个 node 显示 SceneKit 的东西,也可在 SceneKit 中使用 SpriteKit 的东西制作 UI 。
优点:正品有保障。没有 cocos2d-objc 的代码补全延时。文档完整度没的说。
缺点:不开源。有些东西文档没说清楚的只能自己去试。
编辑器, Xcode 6 加入场景编辑, Xcode 7 加入了动画编辑,基本的拖拖拽拽没啥问题,但是你要想做点真正能用的东西,用起来那叫一个别扭。
作为游戏框架感觉还不够完善,比如最基本的按钮啊,视差效果啊, TiledMap 啊,这些都需要你自己去实现。
以上两个是仅我所知的 swift 下的游戏引擎。要我说,没有无坑的引擎,至少我到现在没有遇到过,但同样,也基本没有不能解决的坑。实在都不满意的话自己去做引擎好了, swift 的话你可以使用 Metal ( iOS8+, OS X 10.11+)或者 OpenGL ES 3 ( iOS7+)。就是只怕到时候会遇到更多的坑。我也曾经有一段时间陷入想找到一个完美舒服的工具去做游戏的困境中,后来我才发现,没有工具是完美的,但这都不影响你把你自己的游戏做的完美。硬着头皮把游戏做完的时候,你就不会再在意工具给你的那点别扭了。
& & 18:34:22 +08:00
@ 感谢你如此全面的回答. 你做的什么游戏能告诉我名字吗?
& & 19:21:16 +08:00
@ 也是小体量的项目,目前还没做完..
& & 19:23:02 +08:00
@ 我也在做一个小游戏, 进度 70%, 预计这个月上线 IOS, cocos2d-js 做的
& & 19:24:36 +08:00
@ 很好哇 独立开发者么?
& & 19:54:50 +08:00
没引擎要怎么弄?卤煮是要自己搞个出来么?保重啊。
& & 19:56:11 +08:00
@ 小游戏而已
& & 20:04:57 +08:00
给我发个联系方式吧, 没事可以聊聊.
& & 21:49:38 +08:00
没有工具是完美的,但这都不影响你把你自己的游戏做的完美 +1024
每每遇到困难,就只需要这样鼓励一样自己。“你都从 cocos2d-x 2.0 撑到 3.3 了,还有什么困难克服不了的。”
& & 22:06:09 +08:00 via Android
朋友他们公司 cocos2d-x 做的游戏都开始躺着赚钱了……
& & 22:08:17 +08:00
@ 这个羡慕不来, 个人怎么能和公司比
& & 22:32:20 +08:00
“如果是小游戏的话”
在我的印象里, cocos 就是做“小游戏”的。
Unity 在移动端貌似也是做“小游戏”的。
& & 10:22:23 +08:00
@ 发了吗? 好像还没收到
& & 15:08:32 +08:00 via Smartisan T1
@ 我就是来捧个场,赶紧的发包
& & 22:14:05 +08:00 via Android
@ 创业公司,程序也就两三个……
& & 09:57:07 +08:00 via Android
& · & 1370 人在线 & 最高记录 2399 & · &
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.7.5 · 50ms · UTC 14:54 · PVG 22:54 · LAX 07:54 · JFK 10:54? Do have faith in what you're doing.【图文】第7章-软件体系结构风格与设计模式_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
第7章-软件体系结构风格与设计模式
上传于||文档简介
&&《&#8203;软&#8203;件&#8203;设&#8203;计&#8203;与&#8203;体&#8203;系&#8203;结&#8203;构&#8203;》&#8203; &#8203;齐&#8203;治&#8203;昌&#8203;主&#8203;编&#8203;配&#8203;套&#8203;P&#8203;P&#8203;T
大小:4.17MB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢posts - 928,&
comments - 125,&
trackbacks - 0
文 / 李成,郑鑫
移动互联网浪潮正在彻底改变人们日常的生活习惯和生活方式。相应的,基于移动终端和感应交互的游戏,也为人们带来了全新的游戏体验。本文,我们将结合目前流行的cocos2d-x引擎,使用C++语言,基于iOS平台,和大家分享iPhone、iPad上游戏客户端的构架与实现。
游戏架构与实现
目前,很多基于cocos2d-x的代码基本上仅是对引擎功能的使用,完全不能按照游戏项目的标准来参考。作为游戏项目代码,不仅需要实现游戏的诸多功能,还需要从架构层面,从模块设计的角度来思考和设计,使代码具有更好的复用性和拓展性。
对于游戏客户端,按照功能模块的区别可分为:引擎封装层模块、游戏数据管理模块、应用程序配置模块、日志记录模块、网络管理模块、消息事件机制模块、输入输出控制模块、音效管理模块、UI系统模块、逻辑系统处理模块、调试器控制模块等。针对不同类型的游戏,通常只需要单独实现最上层的游戏逻辑系统,而剩余的模块完全可以复用。下面将详细讲解各个模块的职能与实现(暂不包含游戏逻辑系统)。
引擎封装模块(EngineSystem)
为了减少客户端代码对cocos2d-x引擎的依赖程度和降低耦合度,我们建立了引擎封装层模块,将引擎必要的初始化、逻辑更新、渲染和资源管理等操作全部交给引擎封装层处理,使客户端的其他模块不需要过于依赖引擎层。同时,为了避免客户端代码中频繁、直接地调用平台相关的诸多功能,我们还将一些平台相关的功能全部封装在引擎封装层模块内。
cocos2d-x功能很多很强大,但在开发时,需要根据项目需要有条件选择引擎功能(当然,cocos2d-x本身设计实现的很好)。例如,在引擎封装层内部,我们仅使用了一个CCScene对象,在设计之初就刻意避免处理多个CCScene之间的初始化、跳转、销毁、更新等操作,极大地简化了逻辑层代码,降低了复杂度,且到目前为止,在表现效果上没有什么影响。
数据管理模块(DBSystem)
在开发过程中经常会存储和读取大量的静/动态数据,对比我们针对这部分设计了DBSystem模块,专门进行游戏数据层的管理。每种类型的游戏数据都会派生出一个具体的类,如音效数据管理器、图片数据管理器等。这些数据管理器都在DBSystem内部统一进行初始化、更新和销毁,并各自使用单例模式。外层使用时,直接通过其类进行数据读取即可,无须关心其初始化、逻辑更新、销毁等操作。同时,为了时刻对游戏的静态数据进行监控,所有的数据模块都暴露了获取其所包含数据的接口,这样我们就可以在游戏中随时获取数据层的信息,方便进行统计和监控。
应用配置系统(VariableSystem)
开发者一般需要对应用属性进行可配置化处理:一方面可以方便开发者快速开启/屏蔽某些功能;另一方面能更人性化地支持用户偏好设置。目前,我们根据类型的不同,建立了账号、网络、日志三种配置文件,分别对游戏账号、游戏功能信息、游戏网络配置信息、游戏日志配置信息进行动态设置,全部使用XML进行数据存储和读取。
在开发中通常需要保存大量临时数据,这些数据往往被放在各个模块内部,如果其他模块需要使用,就造成两个模块间强行依赖,增加了耦合度。所以,我们将所有临时需要的数据统一定位为内存配置数据,放在我们的应用配置系统中,其和账号、网络、日志配置文件的区别在于:基于文件配置的属性数据都需要在程序退出时强行写回文件,而基于内存配置的属性数据无须保存。
音效控制模块(SoundSystem)
iOS平台并没有十分完善的音效引擎,而一般自行实现的音效库都难以进行拓展和支持跨平台,所以我们直接选取流行的FmodEx引擎,进行游戏音效的播放和管理。同时,结合FmodEx提供的强大接口,可以很方便地实现声音大小设置、暂停、循环、3D音效等操作,完全满足一般游戏的需求。
在游戏中,一般都需要频繁的播放多个音效,为了提高效率并节省内存,我们在逻辑层对每一个音效文件都使用了引用计数技术,对同一种音效文件仅需通过计数的方式维持一份实例即可,同时播放的多个相同音效,实际上都是使用同样的一份实例而已,无须单独创建音效实例;另外,通过引用计数,很好地解决了音效资源回收的问题,当音效资源计数为零时,即表示其可以被回收,对应的资源,占用的内存也将被释放。
日志系统模块(LoggerSystem)
为了方便在开发、运营期对出现的问题及时进行定位和排查,对游戏中关键的处理流程都需要进行日志记录。在客户端,我们仿照Log4J的方式,实现了分级(Trace级、Info级、Error级等)、分文件、分输出方式的强大日志管理。游戏的日志模块,结合了应用配置系统,完全实现了动态化配置,通过对日志配置文件进行设置修改,开发者可以很方便地设置日志的开启等级、输出方式、大小拆分、输出名称等。另外,对于客户端日志模块,无须过多考虑其性能问题,所以我们的日志模块,完全是简单地在主线程里进行文件写入,没有多开线程进行文件操作。
消息事件系统模块(EventSystem)
考虑到客户端框架总体的拓展性,我们完全使用事件驱动模型(Event-driven)来设计和开发,将客户端中事件的触发时机和具体处理逻辑彻底分隔开。游戏的各个模块,仅需要注册、监听和实现其关心的消息事件,而无须关心事件何时被触发,降低了总体耦合度。目前游戏中所有UI面板的隐藏/显示、事件响应、音效的播放/停止、游戏流程的切换、游戏角色状态迁移等,完全通过事件驱动方式开发;同时这种基于事件的处理方式,为项目使用动态脚本拓展提供了支持:脚本层省去对逻辑代码的大量直接调用,通过消息事件完成脚本层和逻辑层的交互调度,大大简化了开发的复杂度。
UI系统(GUISystem)
cocos2d、cocos2d-x这两种引擎本身并没有提供太多UI控件,仅提供了按钮、进度条等基础控件,如果想使用更多的UI控件,需要开发者借鉴或使用其他成熟的GUI引擎,如CEGUI等。
在我们的UI系统中,充分借鉴了CEGUI的设计思想。整体上,将游戏中有关联的UI控件集中到一个个单独的CCLayer上,组成多个独立的Layout,也就是我们在代码中定义的IWindow类。每一个IWindow类,都包含其自身的根面板(CCLayer)和众多依附在其上的子UI控件。通过IWindow,我们实现了对所有UI布局Layout进行统一的接口调用和处理,如初始化加载、消息注册与响应、隐藏/显示、销毁等。
虽然我们在之前的多个项目开发中提倡将窗口的逻辑实现全部交给动态语言(Python&Lua)来实现,但对于某一些UI功能,并不适合使用脚本来进行逻辑拓展。
对于这类难度比较大、复杂度特别高的UI处理,使用原生的C++开发可能更为合适,所以,在UI系统中,针对这两种不同的需求,我们对IWindow进行了拓展:对需要使用脚本来拓展逻辑的Layout,派生出UIWindowByScript类,其内部主要通过消息事件机制将对应窗口的初始化、加载、逻辑更新、事件处理、销毁等操作传递给对应的脚本逻辑处理;对于需要使用C++来进行处理的Layout,直接根据功能需要,从IWindow上派生出各个具体的实现类。
目前的UI布局还未完全通过外部配置文件动态实现,我们将借鉴CEGUI的处理方式,将所有UI的布局信息、控件属性与事件响应处理等全部使用外层配置文件实现,从而将这些静态信息和程序分隔开,达到动态配置的目的。
网络管理模块(NetSystem)
考虑到传统类型游戏和即时竞技类游戏的差异性,在设计网络模块之初,我们就同时支持了UDP和TCP两种通信方式。
为了支持UDP通信方式,我们使用监听器模型,在客户端中设计了UDPAcceptor管理器,专门进行UDP通信方式的初始化、操作和销毁。同时,考虑到UDP通信方式的特殊性,在UDPAcceptor内部,我们对收到的数据进行了杂乱包的过滤,并且使用序列号技术(Sequence Number),实现了UDP数据包先后顺序的管理和纠正,确保最终交给逻辑层处理的数据包,都是完整可靠有序的。对于TCP通信方式,我们使用连接器模型,在客户端中封装了TCPConnector管理器。为了解决粘包、拼接、临时数据拷贝等问题,我们在内部设计了特殊的MemNode存储结构,将读取的数据全部存储到MemNode里,其内部根据当前数据的读、写指针位置来进行有效数据定位,确保最终交给上层逻辑使用的数据包,都是完整独立的数据。
网络模块面临着频繁的数据接受和发送,如果不进行控制,频繁的new/delete对性能会有一定影响。因此,我们在网络系统内部使用链表式内存池技术,对接收和发送的数据包都通过该内存池进行统一分配、回收和管理,从根本上解决了频繁的new/delete。另外,在NetSystem内部,使用网络编程中传统的Selector模式进行网络连接的监听、轮询、读取和发送。目前市面上很多游戏对网络模块都是单开线程进行处理,而在我们考虑到多线程同步、数据串行化等问题,所以尽量避免了多线程的方式,使用非阻塞式I/O,全部在逻辑主线程里面进行网络控制管理。
输入控制系统(InputSystem)
因为cocos2d-x本身提供的UI控件都有其自身的输入响应机制,所以我们很难直接修改游戏的输入控制系统。此处我们讨论的输入控制系统,主要就是针对CCLayer进行的Touch和Accelerate事件控制与管理。
在游戏中,为了对Touch和Accelerate事件进行统一的管理和处理,在整个客户端的窗口上,我们特意设计了一个最底层的UILayer(也就是所有UI布局Layout的根窗口)。整个游戏中,仅这个根窗口的CCLayer监听了Touch和Accelerate事件,其内部对两种事件进行捕获和处理,然后将对应的事件,存储在内部的输入消息队列中,通过消息事件,通知当前各个游戏管理器调度和处理。
调试器系统(DebugerSystem)
在游戏过程中,需要时刻对游戏内的各项性能指标进行监控,判断各个模块、各个环节是否存在着重大的性能问题。因此,我们在客户端中,彻底将调试、监控作为一个核心模块来设计开发,目前主要分为网络模块调试器(NetDebuger)、渲染模块调试器(RenderDebuger)、逻辑模块调试器(LogicDebuger)三大模块(可根据需要动态增加)。对于NetDebuger,主要监控当前网络上下行数据量、接受和发送的数据包个数、网络接受和发送的耗时信息等,并通过曲线图展示;对于RenderDebuger,主要用于监控当前客户端渲染的具体信息,例如DIP数量、像素填充率、渲染顶点数量等,开发者可以通过这些渲染引擎判断当前渲染是否存在性能问题;对于LogicDebuger ,管理和统计所有逻辑对象个数、大小、逻辑处理耗时等。我们在实际开发中,通过自行开发的游戏逻辑层调试器系统,结合XCODE本身提供的强大监控工具,可以非常完善仔细地监控各个模块的详细数据、内存、处理耗时等信息,完全满足一般的开发监控需求。
引擎改进与公共代码库游戏中的UI面板,难免会使用到模态窗口,但cocos2d-x引擎并没有提供类似的功能,为了避免在逻辑层编写大量冗余代码来实现该功能,我们需要对cocos2d-x引擎进行必要的修改:在cocos2d-x消息事件处理(CCTouchDispatcher)内部,存在一个事件响应队列,对于所有关心Touch事件的对象,按照优先级从小到大排序,优先级越小,则越优先调度。所以,如果我们需要实现模态窗口的功能,需要自己管理所有UI控件的消息响应级别,并且按照控件之间的父子依赖关系,实现一个类似树的优先级结构,每次需要实现模态窗口时,只要确保其对应的事件优先级在最顶层,并且在处理完消息之后,屏蔽掉该消息,避免继续传递到下面的窗口。
考虑到不同开发者对操作系统、底层接口等熟悉程度不同,为了降低开发成本,我们开发了一套基于iOS平台的基础代码库cobra_ios,其内部封装了开发中常用的各种接口:整套完善的线程安全容器,如数组、单链表、双向循环列表、队列、二叉树等;各种线程控制模型和串行化接口、各种内存管理技术、数据解包器DPacket和数据组包器EPacket等。在开发中,所有开发者都统一使用该基础库,使用相同的接口处理,方便开发且提升效率。
cocos2d-x VS. Cocoa
前文提到,cocos2d-x引擎本身没有提供太多UI控件,除开发者自行实现外,我们还可以使用iOS标准的UI控件。熟悉Win32、MFC的朋友都知道,Win32标准控件很难与DirectX结合,因为两者是完全相同的渲染机制,但在iOS平台,cocos2d-x与Cocoa自带的UI控件完全兼容,并可以相互调用,例如在游戏登录界面,我们就可以使用Cocoa自带的NSTextField控件来实现账号和密码输入框。因此,对于游戏开发者来说,学好Cocoa很有必要。
由于iOS平台不支持以动态链接库的方式使用第三方库,所以我们不可能选择Boost+Python的方式进行脚本拓展,不过我们还可以选择Lua等其他可行性比较高的动态语言。&工欲善其事,必先利其器&,对于中大型项目,除开发客户端外,一般还需要单独开发编辑器进行关卡、场景等编辑处理。对于编辑器的开发,由于引擎cocos2d-x本身完全跨平台,所以我们完全可以使用自己熟悉的语言和平台来开发,选择使用Cocoa、MFC、C#等熟悉的语言,只要确保所有最终的关卡场景数据可被跨平台读取即可。
移动时代,游戏的操作方式,已不仅仅限于传统的鼠标键盘模式,随着触摸、摄像、语音、重力感应等更多操作形式的普及,也为游戏带来了前所未有的机遇和挑战。
作者李成,网名关中刀客,曾参与制作过多款端类MMO、Web Game等游戏项目,目前热衷于移动设备的游戏制作。
作者郑欣,游戏客户端程序员,参与制作多款游戏项目,曾供职于GameLoft北京手游部门、盛大游戏老牌游戏工作室,现任职于腾讯游戏,负责拓展国际业务。
阅读(...) 评论()}

我要回帖

更多关于 软件体系结构风格例子 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信