想学习游戏引擎架构用哪个开源引擎好?
想学习游戏引擎架构用哪个开源引擎好? 先介绍下背景:最早用cocos2d-iphone写过一点东西,后来转cocos2d-x玩了一段时间,核心引擎部分的代码看看改改;
研究过一段时间KlayGE,之前搞定了其OSX/iOS port,(不过不是很完美,还在继续搞搞),Linux部分也帮忙维护了下,有写过一些读书笔记;
最近玩Unity比较多,在上面实现过一些特技,勉强可以说对渲染部分比较熟吧;
UE4只看了一部分代码,没怎么实际用过;OGRE没用过...
从我个人观点来看,cocos2d-x的代码质量比较一般(嗯你懂我意思就行了...),如果项目需要的话简单看看就行,但是很多地方的写法和设计(譬如历史原因造成)会给你造成误解。。。
KlayGE的代码质量很高,不过问题就如你所说实验性的居多,移动部分优化还得继续做,适合单纯的学习,不过需要你对DX/GL之类的有一定了解,能啃得动一些论文或者GPU GEMS之类的~
Unity的好处是上手容易,但是它是黑箱的,有些东西凭借文档查不到只能连蒙带猜,u5之后有FrameDebugger稍微好点了(据小道消息说,看过引擎代码的都反馈质量不行。。。)
UE4是大工程的典范,代码规范、质量很不错,值得学习~ 就是量太大了,毕竟一堆人做了很久……
OGRE我只知道资料很多……有书什么的= =(不予评价了)
对于题主现在的情况,我个人建议是快速了解下cocos2d-x,看看跨平台封装、GLES之类的基础;然后有精力的话,可以从UE4入手了解一下一个完整的商业引擎架构,一开始不用抠特别细节的东西,了解整体之后对感兴趣的部分再多看看。自己动手造个简单的轮子也是不错的选择啦,边看边改~
如果想对某些知识点或实现加深了解,可以看看龚大的博客 http://www.klayge.org/ 里的一些介绍,及对应KlayGE里的Sample或实现;不过这个就主要是渲染部分了,如果是其他的譬如物理,可能还得看看别的~
顺便安利下小刀大大的引擎 gameKnife · a graphic artisan 量级也挺适合学习的
再ps. 如果你对渲染部分比较感兴趣的话,可以再推荐一些资料
OpenGL/DirectX资料很多,经典的红宝书蓝宝书龙书什么的
Ray Tracing from Ground Up, Physically Based Rendering: From Theory to Implementation 教你写渲染
其他的包括OptiX框架、Mitsuba
(有一些自己都没看……逃 最近正在写引擎相关的代码(我不是引擎部门的,就是特别喜欢引擎,也是我未来的发展方向)。以下两张图,第一张是类似OGRE的,相似度百分之八十吧,第二张是Unreal 4 的,目前只画了百分十三十。
我开始写一个引擎的时候,不知道该怎么下手。书上讲的再好,可打开IDE都不知道第一个class该写谁。纠结了两周,索性就开始抄吧。手边只有上大学时候配好的OGRE,版本是1.72。边抄边画类图,只是抄个框架。从去年五月开始,晚上抄,周末抄,放假也还在抄,到年底,能渲染出那个OGRE的Logo头像,总算完事儿了。最大的感触就是,过年回家还是单身,都不大敢见人了。
过年回来,有小半年的时间生活迷茫,没怎么写。
前两个月又开始,目标是到年底,保持整个框架不变的情况下,使用OpenGL4.3,将底层改为延迟渲染,加延迟光照,基于物理的渲染,PSM,点光源的ShadowMap,SSAO以及基于Reflective Shadow Map全局光照,还不太清楚选哪一种。目前在实现PSM,估计下周完成。
Unreal是工作中使用的开发引擎,自己平时边看边画,结果就出来这么一张图。最近工作上需要看看底层的代码,花一周把Unreal的光照渲染流程大致过了一遍。感觉就是,不懂得时候觉得牛,懂了,觉得牛的有道理。
说点儿感受:
1.没有图形学基础,不管是OGRE还是Unreal的渲染部分,想看懂都是扯淡。
2.如果不打算看渲染部分,那么OGRE不适合,他就是一个渲染引擎。引擎的其他模块不了解,只能臆测一下。Unreal太庞大,了解完Unreal 编辑器各种功能(不是引擎,仅仅是编辑器)就要三个月左右。不跟实际项目,实际可能更长。虽然各种文档也很完备(Unreal官方文档干脆改名叫 如何使用Editor得了),但是这些文档都是蜻蜓点水的提到很表层的类,具体这么大一堆类如何协作的,并没有什么文档。即使你在相应模块有很深功,看起来也很吃力。同时,Unreal对C++做了很多魔改,虽然惊艳,但是想要明白,也是个出力点。
3.个人感觉OGRE延迟渲染版本和Unreal的渲染流程相似,渲染框架差别很大。个人想法是,框架是为了合理的使用流程而搭建的,当这个流程你懂了,才能了解框架是怎么来的,看起来也就异常的简单。
综上,我建议从OGRE入手,至于跟我一样丧心病狂的抄一遍,还是单步调试走一遍,个人爱好而已。看完后,在看Unreal的渲染框架就觉得很顺利。Unreal渲染框架对C++魔改的地方并不多,看着还比较顺利。
至于OGRE和Unreal谁的设计更好,我觉得,对于没写过的人来说,考虑这个问题有点儿早了,即使一帮大牛讨论的再有道理,你听不懂,也插不上嘴。能听懂的,都至少能随手写个引擎出来,最不济也能画张UML图(手动微笑)。
OGRE不可能一无是处,Unreal也不是万能钥匙。选个能驾驭的了的,然后骑驴找马,不论哪个都比走路强。 看题主的提问和经历,猜测应该算是新手入门级别。
如果是在一开始奔着研究学习而不是工作使用的话,建议是从一些比较小的引擎开始,这样可以比较快的理清各个模块的脉络。
我说的是一些,而不是一个,这样你有对比的去各个引擎的架构不同,才能更好的理解引擎架构的设计。
Cocos2dx虽然Bug很多,但也胜在够简单,不推荐深入研究,但也可以一看知道有这么回事。
我记得也有一个WildMagic的,结构也很清晰。
KlayGE渲染部分是很牛,不过毕竟个人精力有限,在工作流上不足,研究最新技术的推荐一看,不过对题主来说还有点太早。
Orge印象中已经有点偏古老了,不过结构确实很清晰。
Unreal,确实非常非常牛,工作流也非常完善,不过确实也非常庞大,一开始看的话非常容易陷进去找不着北,被各种生成代码和宏搞得晕头转向,你要是对自己的C++和图形学非常有自信的话,可以研究。我目前也正在用UE做VR游戏,也正在研究UE,若是有兴趣,也可以顺便看看我的专栏InsideUE4(InsideUE4 - 知乎专栏)
我自己也曾经有空自研一个引擎,一边学习一边自己造一个轮子,最初也只是面向手游的,目前只有2D部分,跟那些知名的完全没法比。不过好坏顺便也可以一看: GitHub - fjz13/Medusa: Cross mobile platform 2D&3D C++ game engine.
想研究引擎架构,就多看一些引擎,别只盯着一个。
想研究图形学,就好好看图形学的书,然后自己做实验。 闲来无事偶尔看到这篇主题,然后看到了Chaos的回答,立马火冒三丈。在知乎我几乎不回贴,偶尔浏览,不过这次实在忍不住要骂人。这么脑残的回答,还有一把人支持,我只能说国内科研风气之差,可见一斑。目测Chaos可能是个大神偶像级人物,后来有人告诉我他是网易端游手游的引擎的开发者,然而,那又如何?我瞬间想起最近火遍朋友圈的恒大许家印带领高管队以一分的优势赢了员工队的笑话。
本人不才,搞图形图像十多年,早期从OGRE入门,一直用OGRE开发项目,后来偶尔用过U3d, 现在常用UE。各种3d渲染几乎都自己从头实现过一遍,例如延迟渲染,SSAO,各种光照,反射,水面,体积光,软阴影,阴影边缘柔化……现在主要从事VR方面的开发,应该对这个话题还是有点发言权的。不开启嘴炮模式,先说一下Chaos的回答有多么的不靠谱。
1、强烈推荐UE。这里,我不否认UE是一个优秀的引擎,但是,不要说刚入门的题主,就算是做图形学三年左右的人,99%都不会能看懂UE。很简单,UE的结构庞大,设计复杂,绝对不是一句轻描淡写的“如果你看不明白,如果你有弄不懂的,有想不通的,慢慢来。”就能解决的。90%以上的3d程序员的天赋,穷一生也不会能看懂UE的源码。当然了,你也可以说我危言耸听,看不起程序员。估计你在高大上的网易待惯了,不会知道这个行业千千万万的图形程序员可能是连个简单的shader都不会写的接口程序员。其次,UE那些复杂的宏定义嵌套,真的是好吗?真的那么容易看懂吗?UE的源码很多是生成源码,很多程序员估计连生成源码都不知道是怎么回事,生成源码有什么好处也不知道,你真的觉得UE适合入门学3d吗?可能对你而言是适合的,但是你这个回答完全是误人子弟。
2、”Ogre是个失败的作品,是一堆半专业队业余从事的零散产品,架构混乱,要改成成品需要花很大的力气。“对于这句话,我只认同最后一句,需要改成产品需要花很大的力气。前面的,我完全不敢苟同。先说产品,不知道国内高大上的网易,出过哪一款碾压火炬之光的产品了吗?还是网易自信到可以碾压火炬之光的团队了,但是生不逢时,所以出不来好产品?对了,列举产品还要看看年代,你总不好意思拿现在的产品来碾压十年前的产品是不是?我孤陋寡闻,真不知道网易除了半桶水的天下系列,还有什么很牛逼的体现出来牛逼引擎的3d游戏。再说代码质量,开源的引擎我看过很多,鬼火是入门级的超级简单的引擎,OSG是还不错的引擎,不过不大适合游戏。龚敏敏的作品代码质量还是可以的,不过人力有限,功能较少。由于我本人用OGRE最多,当然是更喜欢OGRE的架构和代码。以我二十年的代码经历,喷别人的代码,从来都是一件不需要负责任,很容易装逼,很简单的事。说句老实话,我也吐槽过OGRE的一些bug,一些不爽的设计,但是真正轮到自己上,真的就牛逼哄哄,别人都是垃圾了?看看OGRE开发团队人员的资历,看看OSG团队开发人员的资历。OSG团队有一个是国内的王锐,清华毕业,图形搞了多少年,红宝书的译者,你真的觉得这些人都是业余的,代码是架构混乱的?不客气的说一句,国内开发3d引擎的,做图形学的程序员,不算新入门的,90%以上的人写不出OGRE这类引擎质量的代码。这样的代码在你眼里是如此的差劲?现在github这么方便,talk is cheap,show me your code。
3、吐槽别人的东西总是容易的,但是吐槽的时候,请言之有物,而不是一句“垃圾”,“差劲”,“三流”,这样其实跟泼妇骂街没什么区别。我看过很多吐槽OGRE的,平心而论,OGRE就是个渲染架构,很多功能做得也不完善,这是事实。但是,作为一款学习引擎,图形学的3d引擎,绰绰有余。麻烦你下次吐槽的时候言之有物行不?收起你的不必要的傲气,或许你是大神,或许你有过不错的作品,但是从你的回答以及那么多的点赞,我只看到了乌烟瘴气。拜托,要喷请来点实际的,好吗?
------------------------------------------------------------------------------------------------------------------------------------------
华丽丽的分割线,更新于2016.11.14日
看到评论里有人吐槽说言之无物,只有喷,那么还是花点时间讲讲自己的一些体会。讲得不对的地方,大家可以随意喷。这部分大概会随意讲一下,不会太注重组织语言。
先讲一下我对目前一些引擎的看法。我最熟悉的引擎是OGRE跟UE,看过但不太熟悉的引擎有鬼火,OSG,COCOS2d-x,KlayGE。所有这些引擎,被喷最少的是UE,毕竟名气摆在那,很多人心存敬畏,都不敢喷了。从代码质量而言,我认为鬼火是里面最差的,cocos略好一点,KlayGE跟OSG应该是差不多的,OGRE我排得更靠前一点,UE无疑问最好。其实用过UE编辑器的都知道,UE这两年由于迭代太快,编辑器崩溃非常多,但是毕竟名气摆在那。至于UE好在哪里,一般人只是停留在画面好这一层面。我讲一部分我亲身经历的。UE的代码管理,那是相当的高效规范,大概在UE4.5的时候,我自己实现过一个max导入动画到UE,实现动画的各种物理例如摩擦力,加速度,风阻,向心力等等,当初UE自带的Matinee不够给力,长路径编辑之类的,还有早期跟Oculus dk2的接入不是那么的合拍,我就自己实现了。实现过程中发现UE的Animation里面有几个成员变量是多余的,反正就是发现了一些冗余代码,本身这个在大项目里面经常容易存在的东西,就是这么一点小东西,在后续的版本里面迅速修复了,删掉了。这个给我留下了极深的印象。一般公司的项目,代码的维护都不是那么的规范,有些代码谁写的,有什么用,随着时间的推移,会经常性的存在维护问题,这么海量的代码,还能如此高效的运作,是非常不易的事。UE的江湖地位,真的不是浪得虚名,不仅仅停留在“画面好”这一层面。
很多人喷Cocos,我见过无数人喷,然后cocos看着被喷到一文不值,好像学了Cocos会悔一生,看了cocos代码会立马降低自己水平。对这种喷子,我其实是不屑一顾的。首先,我们要确定,Cocos的代码没有像别人喷的那么糟糕。如何确定?很简单,Cocos代码的架构师,也就是带队做Cocos源码的人,年薪有没有百万我不知道,大几十万肯定有,你看看天朝的程序员,有几个收入比他们高的?大多数情况下,收入跟能力是成正比的。如果你要证明你能力比他们高,收入又没有他们高,也很简单,自己把cocos大改一遍,做个分支,上传到Github,如果碾压了Cocos,保管你的收入瞬间提升上去。我们说,喷人有两种喷,一种是消费角度的喷,一种是专业的喷。从消费的角度,例如你不会设计汽车,但是你能喷别人的汽车设计得差,无所谓,可以随意喷。但是专业的喷,如果你能力还不如别人,盲目的喷,就毫无意义了。
因此我的观点:只要是代码质量比你高的,比你牛逼的人的代码,你都可以看,绝对不是非要看顶级的代码。在c++不是那么牛逼的时候,看一些设计不是那么复杂,比较清晰易懂的代码,怎么也有助于水平的提高。刚入门就去看UE的代码,除了逆天的人,几乎可以肯定就是个悲剧。等你能写出cocos这样的代码了,再看水平更高的代码,一步一步来。事实上,国内的程序员,很多人一辈子也写不出cocos这样的代码,年纪大了,转行的,要么是功成身退,财务自由了,要么是逻辑程序员做不下去了,转行了。逻辑程序员转行的,几乎可以肯定写不出cocos这样的代码。
基于这个观点,随便一个比你牛逼的代码,都可以看,看什么随意。OSG代码质量比cocos好不少,搞OpenGL的很少没有看过这个引擎的,OGRE多年来是开源引擎第一,搞图形学入门,很少人没有看过这个引擎的。只能你能达到这类水平,恭喜你,你在业内至少也能混下去了,再考虑进阶。不少人在编码的过程中都会有过迷茫,都会不知道如何提高自己的水平,我经常的回答是:就算你是搞QT的,你在搞QT的时候如果能把QT的源码撸一遍,能随心所欲的修改QT源码达到你想要的目标,做成了QT的专家,你同样能达到不错的成就。反过来,你本身是从某个引擎学习过来的,然后觉得自己水平高了,然后不断的黑这个引擎,这种人我是极度鄙视的。感恩你成长过程中帮助过你的人,这是一种基本的品德,因此我会对比引擎的优劣,但基本不会喷引擎。
图形学怎么入门?知乎上讨论很多,我见过很多,不需要多我一个意见。其实很多人的意见都很中肯:先自己实现一遍软光栅。这句话其实我跟很多人讲过,但是听过的人,十个有九个不会去这么做的。不去做的原因很多,懒惰,不会……不管是什么原因,我都非常的惋惜,因为这真的是非常好的理解显卡,理解光栅化的必备过程,能少走很多弯路。软光栅之后,看引擎,可选择性的看,可随意看。作为一个引擎新人,即使是鬼火,cocos这类入门引擎,大概率都能给你启发。等你能写出cocos这类引擎之后,其实路怎么走,大概率已经不需要别人告诉你了,这个成长的过程中,你至少具备了基本的自学能力,了解了非常多的学习方法。后面的路怎么走,你自己都心有定数,不需要别人再告诉你了。 废话不多说,上个干货:GitHub - Microsoft/DirectX-Graphics-Samples: This repo contains the DirectX Graphics samples that demonstrate how to build graphics intensive applications on Windows.
里面有个MiniEngine,才54M,当然只有渲染的部分。
作为入门参考应该还不错,还能学DX12多好。
发现是个老问题(逃 个人觉得 orge 的架构很不错的。我现在都还能画出 orge 的架构图~~ 关于过渡设计,我倒是不这么觉得,如果你看了最近这些年GDC的视频和PPT就会发现,ORGE只是把这些最佳实践给融合到新的引擎里面。Cocos的代码也可以学习学习的,比 Orge 少很多估计一周就看完了,3.x版本之后好像都是基于Command做的渲染整体设计还是蛮简单的,看完这两套代码之后功力会提升一大截,进而也能对比出二者设计的优劣。
接下来可以在快速的浏览一些更小的代码,比如上面的 libGDX, love2D, bgfx 这种,你会发现~ 啊!竟然好多代码都似曾相识~~ 此时你的水平又晋级了。
再接下来去研究研究ue和其它一些大型引擎的代码就容易的多了,但是可能会发现,哎,这个模块的设计不过如此嘛,这个设计好古怪竟然~~此时看代码已经满不了你的好奇心了,去GDC看上最新的视频、最新的游戏开发技术的PPT,会发现,哦哦哦,好厉害~~~ 要不我也写两行试试... 哈哈哈
关于如何快速的看代码,写写自己的一点心得:
先看把游戏引擎用一用,知道他是干什么的这些引擎的官方网站都有核心模块的设计稿,一定要认真读看源码的时候对照着设计会容易很多不要钻牛角尖,游戏引擎里面会有很多Hack代码要自动忽略
推荐看我们的Wonder 3D引擎,函数式编程,代码质量高,代码总数少(只有几万行),使用最新架构:
Wonder.js WebGL 3D引擎Wonder非常注重代码质量:
1)测试覆盖率>=95%
2)完全重写了2次
3)使用强类型的Reason语言
4)代码契约检查
Wonder架构上使用了最新技术:
1)Data Oriented
2)多线程
3)ECS
4)可定制的渲染管线 job pipeline
Wonder完全函数式编程,编辑器代码也是开源的:
Wonder-Technology/Wonder-Editor SFML,够简单纯粹,代码风格足够好……
Unreal的代码很难看懂,各种宏一层套一层能看到哭,而且有历史包袱……
想学架构的话就别想着去整太多的功能,太大而全的东西不适合用作学习。 楼主应该是有手游背景吧
那么 SIO2 或 鬼火
简单的不能再简单的结构了
入门级引擎不要搞那种特别复杂的
一旦找到感觉,迅速过渡到更成熟的引擎上面去