unreal里面的算法框架 - CSDN
  • 知乎用户,Machinist of Games 知乎用户、妍青、莱牧 等人赞同 ...这是一个很难的问题,而且不容易回答,很容易...一、关于Unreal4和Unity 很不幸,我并没有看过Unity代码,我们没有购买,而我也并不是特别

    知乎用户,Machinist of Games

    知乎用户、妍青莱牧 等人赞同
    谢邀。

    这是一个很难的问题,而且不容易回答,很容易引起争论,老实说我并不想在公开场合评论到底哪个更好或者更坏,这并不明智,其实每个人心底都有自己的答案。

    我只想聊一些我的看法。

    一、关于Unreal4和Unity

    很不幸,我并没有看过Unity代码,我们没有购买,而我也并不是特别想看。或许有人说:装!嗯,其实写了很多年代码了,什么没见过?看过并不一定能写出那样的产品,没看过也不代表你不能写出超越它的代码。很多人对待引擎代码的态度其实和追女孩差不多,没追到的时候,天天时时刻刻想着,到手了,就呆在硬盘里,其实真正每个文件都读过的人,凤毛麟角,读懂的人可能更少。

    在刚开始学习游戏引擎的时候,需要读一定数量的代码,但积累了一定的代码量和经验之后,需要的更多是观察、思考、总结。所以比较资深的程序员,会花更大量的时间思考,而不是学(chao)习(xi)别人的代码。

    回到这两者的对比上,我没看过,所以就不知道怎么对比了,只能说各有各的好,咸鱼青菜各有所爱,而且游戏界的金科玉律就是,谁能出产品,谁能大卖,谁就是赢家。

    至今Unreal3已经被证明了是一个伟大的引擎,有足够的title说明问题了。Unity有不少作品,但还缺乏一锤定音的作品,和AAA不沾边有关系吧。但用户足够多,增长率高也可以说明问题。Unreal4还欠缺证明自己的作品,等战争机器吧,Epic还需要向别人演示怎么使用这个引擎。

    二、关于题主提出的几个对比

    很直接说一句,那都不是什么问题,或者可以说,根本不是比较的重点。Unity那种写法,上世纪就已经有人在用,不见得是什么高明的写法,这种c/c++的奇技淫巧,只有初学者或者刚刚学会一点儿的人会感兴趣。我顺手可以拈来好多类似的,比如gcc的tree node结构,初读感觉那个精妙,后来发现也就那样儿。这种union我大概10年前在写高速raytrace引擎的时候已经用过,而且用在xmm上面,即现在DirectXMath的写法。至于你说不明白为什么Unreal这么写,看不懂if。为什么?很简单啊,因为这是“历史问题”。那个年代过来的代码都是这么写的,就一直这么写了。

    很多人搞错了一点,以为数学库要效率高,这也是我刚开始写引擎和图形程序时候的错觉。后来发现,不是的,游戏引擎的数学库,不是全都要求效率高的,数学库最重要的是“稳定”。因为真正在跑的,AAA游戏,或者重度的MMORPG,最重要的,不是数学运算,而是“架构”。反而数学运算,需要稳。稳到什么程度?havok曾经推销他们的物理引擎,最引以为傲的的,并不是它有多快,而是它的所有物理运算在所有平台上的计算结果都完全一致(评论有朋友修正了这个说法,应该是同样的计算在同一平台上每次计算都一样)。这简直吊炸天啊有木有!!!如果你不明白这句话背后的意义,那么我想你没必要讨论数学库了。

    回到问题本身,一个字,编译器优化,可以回答一切问题。

    现代游戏引擎的瓶颈,有两处,一处是runtime的执行效率,一处是content creation的pipeline生产效率。后者太庞大太宽泛,没实战过的人,不理解,这里不展开细说,只讨论第一点,runtime。

    runtime部分,现代引擎面对的问题,主要是越来越复杂的场景,越来越多的drawcall,越来越重的资源。这里面最麻烦的就是提交。所以新一代的API,都注重提高提交效率,即更薄的driver层。这就是DX12标榜的十万drawcall的意义。

    这里我必须提一点,这两个引擎,Unreal4和Unity,都有一个架构上的严重欠缺,就是没有从原生上支持多线程。即使Unity5,也只是用了一种thread pool的分发的策略,把一部分集中的繁重的事务分发到其它线程计算,但它并不是真正的“原生多线程”,即任意的不相关的任务都可以随意分发到不同的线程上。考虑每个entity自己更新自己的逻辑,可以并行,有100核心就可以几乎真的并行更新100个entity,这才是真正的原生多线程。

    这种引擎,目前公开的只有Frostbite 3是这么做的。(当然我不会告诉你,我们……)。

    至于Component架构,这方面我有另一种看法。游戏引擎是一个很重度的工程项目,而非科研项目,干净与否并不能成为评判标准,实用性才是金科玉律。我认为unreal这么做(把业务相关的东西放到底层),是基于一种发展的眼光看。很简单,我也会这么做,如果我开发了一套非常超前的架构,但我又对它没有足够的底,不知道接下来应该怎么写,我认为总体方向是对的,但我不清楚业务和他如何结合,那么我就采取折中的方式来处理,即把一部分业务嵌到架构中,先把业务应用起来,验证架构的正确性,然后通过重构和迭代,逐步把业务细节划分出去。

    显然UObject是继承Unreal3而来的,Unreal4非常大胆,blueprint是一种非常超前的想法,而且非常有前途,也非常好,但这个改变太庞大了,太重了,要一下子割裂和Unreal3的关系是不切实际的,稳妥的方式是逐步修改过来,并且验证之后再完全迁移过去。所以迁入一部分实际业务的想法很现实。而且要考虑,引擎开发本身应该依附具体项目。我认为Unreal4应该依附在战争机器游戏本身的开发身上,才可以保证它不会走弯路。所以在底层重度嵌入一部分FPS相关代码,无可厚非也没有任何问题。

    老实说,我有代码洁癖,但我也会这么做,因为引擎不是独立产品,是依附游戏的附带产物,一切应该以游戏业务为优先。这也是为什么我一直对Unity有一些负面看法的原因,它的开发商本身并没有任何游戏,一切反馈是来自于用户,二手数据。所以Unity看起来似乎很“干净”,但就是太干净,干净得出奇,变得不接地气,这才是为什么它缺乏AAA。

    三、渲染质量之谈

    题主似乎不断在强调不要被Unreal4的渲染质量吓唬住了,我觉得这句话是很有问题的,直接地说,这句话是不专业的,一点都不professional的。显然题主是有倾向性的,因为Unity本身就是一直被Unreal4的渲染所吓唬住了,所以每个版本的升级都在重点强调自己的渲染特性得到了提升。

    老实说,这并不明智。因为Unity的提交效率。。。

    上面提到了一点,现代引擎的瓶颈一个很重要的点就在于渲染批次的提交上面。这里请看我一直所赞誉的Frostbite 3,的数据——BF4一些场景的DP数量达到了5000~10000。吊炸天啊!这需要非常高的提交效率,非常优异的渲染组织。这就是引擎真正的架构技术核心所在。另一个碉堡了的是CryEngine,提交效率很高。

    所谓“渲染质量”是什么鬼东西?搞了差不多二十年图形,我很少听到专业人士提到这个词。我听过渲染效率,听过画面质量,听过各种shading model。同一张显卡,同样的shading model如果还用同样的模型,同样的算法,有什么质量不质量的?难道Unreal4算的 1 + 1 = 2 比 Unity 算的 1 + 1 = 2 质量要高?那个 2 要更好看?

    不是的,这是业余的看法。专业的看法是,你要对画面有取舍,有调控。引擎是一个大的系统,系统设计最重要的一环是控制和分配。图形学没什么算法是不公开的,Unreal4用到的所有算法都是公开的,所有的siggraph paper你都能access到,没什么秘方,没什么magic code。关键是,你的取舍,你花多少资源在哪个部分,省了哪个地方的东西。

    这部分的功力,是源自于游戏开发本身,源自于积累,源自于TA。这也是Unity欠缺的地方,因为Epic自己开发游戏。所以Epic在资源的调配上,有取舍,有经验,在开发战争机器的时候,在开发游戏的时候,有各种纠结,填了不少坑。写好代码只是开始,教会TA和美术使用引擎、正确使用你写的技术、配合并创造出美丽的画面,才是真正有绝对价值和意义的工作,这占了99%。

    图形学是工程的图形学,是trick和cheat的集合。正如你堆钱买奢侈品是不能除掉身上浓浓的杀马特山寨风的,必须读书、读书、读书、思考、思考、思考、沉淀、沉淀、沉淀。光靠堆一些feature,不是正确的姿势。这就是为什么Unity 5堆了那么多feature,看起来还是远不如Elemental Demo。

    四、双生

    对比Unreal、Unity,同样的例子,请看CGFX领域的MetalImage和Pixar。MentalRay非常屌,有很多先进设计,一直坚持用raytrace,早就开发出电影质量的全局光渲染,但它一直被死对头Pixar的RenderMan所压制。Pixar的RenderMan,采用“落后的”渲染算法REYES,直到13.0版本之前一直不支持raytrace,且价格昂贵,更新缓慢,但广受电影制作喜爱,上世纪好莱坞特效渲染标配渲染器。为什么?很简单,Pixar自己是做电影的,RenderMan本身一直为Pixar的电影服务,获得各种第一手电影制作需求。而反观MentalImage一直只是一家软件公司,没有电影业务,只卖软件,只卖技术,所以无论改进得多好,一直不懂电影制作者的心。

    我对Unreal和Unity的看法,也基本基于此案例。当然,现在disney有更强的渲染器,可以完全干死RenderMan,不过这货是不卖的,正如Frostbite,也是不卖的。世界上最好的引擎技术,不会出现在商业引擎里面,只会在In house engine中。

    五、寄望

    我聊了许多,然而这并没有什么卵用,工作中该用哪款的,还是要用哪款,这不是技术人员能够决定的。不过我一直以来的信念,都是我们始终是要做自己的引擎的,并不是为国争光什么的狗屁高大上理由。很简单,技术人员存在的意义,就在于用技术碾压对手。你的技术,到底是用在给别人打补丁上,还是给自己充实力量上?

    所以我对所有这些第三方引擎的态度,都是批判地学习。好的,我兹词,不好的,我谨记并绕开。其它不参合任何个人感情,也不需要卖任何情怀,只需要记住,所有的这些——Unreal、Unity、CryEngine、Frostbite、SnowDrop、Fox等等等等,都是他人的嫁衣裳,我们真正需要的,是自己的遮羞布。

    题主的批判态度,已经带有点私人感情了,这并不理智,希望你可以成长,客观看待这些东西。

    ————————————————————

    补充一点,题主说Unreal4不如ogre,我觉得这真有点太过了。ogre实在是渣渣渣渣渣。不多说,自己领悟吧。

    ————————————————————

    再最后补充一点,评判这些引擎的时候,如果你不是对自己的实力有足够的把握,如果你不是很清楚到底自己是否真的彻底了解这些设计背后的原本意义,那么千万千万千万别开上帝视角

    要很清楚这些引擎是世界最顶尖的脑袋架构出来的,一些显而易见的问题,比如用if是否很2b,难道你以为可以架构出blueprint、能够做到c++hot load这种吊炸天的人,他们想不到?

    不可能的事情!去看看Unreal4的Multicast delegate怎么设计,怎么构建,C++用的多好,多纯熟,对语言的压榨多极致,能够有这种把握深度的人,会不知道用书本上写的条条框框“千万别用if啊”什么的?不可能的事情!

    Tim Sweeney这些人的脑袋太好用了,太厉害了。比如Component的结构,坑超级多,你想到的,别人不会没想到。我遇到这种情况,不会第一时间想别人是否2b了,而会先考虑、是否自己没想到更深刻的问题?或许还有其他坑?就连Voxel Cone Tracing这种屌炸天的算法都能想到,不可能想不到你看出来的小问题。

    所以,每当要开启上帝视角,请换一下角度,如果是你,你怎么设计,你怎么处理,真的就没有问题?如果你真的设计的比他们好,请别犹豫,站出来,战胜他们。编辑于 2015-06-08
     42 条评论 感谢 
    分享
     收藏  没有帮助  
    举报
      禁止转载
    展开全文
  • 作者:Flood Sung,CSDN博主,人工智能方向研究生,专注于深度学习,增强学习与机器人的研究。 责编:何永灿,欢迎人工智能领域技术投稿、约稿、给文章纠错,请发送邮件至heyc@csdn.net 本文为《程序员》原创...

    作者:Flood Sung,CSDN博主,人工智能方向研究生,专注于深度学习,增强学习与机器人的研究。

    责编:何永灿,欢迎人工智能领域技术投稿、约稿、给文章纠错,请发送邮件至heyc@csdn.net

    本文为《程序员》原创文章,未经允许不得转载,更多精彩文章请订阅2017年《程序员》

    2016年AlphaGo计算机围棋系统战胜顶尖职业棋手李世石,引起了全世界的广泛关注,人工智能进一步被推到了风口浪尖。而其中的深度增强学习算法是AlphaGo的核心,也是通用人工智能的实现关键。本文将带领大家了解深度增强学习的前沿算法思想,领略人工智能的核心奥秘。

    前言

    深度增强学习(Deep Reinforcement Learning,DRL)是近两年来深度学习领域迅猛发展起来的一个分支,目的是解决计算机从感知到决策控制的问题,从而实现通用人工智能。以Google DeepMind公司为首,基于深度增强学习的算法已经在视频、游戏、围棋、机器人等领域取得了突破性进展。2016年Google DeepMind推出的AlphaGo围棋系统,使用蒙特卡洛树搜索和深度学习结合的方式使计算机的围棋水平达到甚至超过了顶尖职业棋手的水平,引起了世界性的轰动。AlphaGo的核心就在于使用了深度增强学习算法,使得计算机能够通过自对弈的方式不断提升棋力。深度增强学习算法由于能够基于深度神经网络实现从感知到决策控制的端到端自学习,具有非常广阔的应用前景,它的发展也将进一步推动人工智能的革命。

    深度增强学习与通用人工智能

    当前深度学习已经在计算机视觉、语音识别、自然语言理解等领域取得了突破,相关技术也已经逐渐成熟并落地进入到我们的生活当中。然而,这些领域研究的问题都只是为了让计算机能够感知和理解这个世界。以此同时,决策控制才是人工智能领域要解决的核心问题。计算机视觉等感知问题要求输入感知信息到计算机,计算机能够理解,而决策控制问题则要求计算机能够根据感知信息进行判断思考,输出正确的行为。要使计算机能够很好地决策控制,要求计算机具备一定的“思考”能力,使计算机能够通过学习来掌握解决各种问题的能力,而这正是通用人工智能(Artificial General Intelligence,AGI)(即强人工智能)的研究目标。通用人工智能是要创造出一种无需人工编程自己学会解决各种问题的智能体,最终目标是实现类人级别甚至超人级别的智能。

    通用人工智能的基本框架即是增强学习(Reinforcement Learning,RL)的框架,如图1所示。

    图1 通用人工智能基本框架

    智能体的行为都可以归结为与世界的交互。智能体观察这个世界,然后根据观察及自身的状态输出动作,这个世界会因此而发生改变,从而形成回馈返回给智能体。所以核心问题就是如何构建出这样一个能够与世界交互的智能体。深度增强学习将深度学习(Deep Learning)和增强学习(Reinforcement Learning)结合起来,深度学习用来提供学习的机制,而增强学习为深度学习提供学习的目标。这使得深度增强学习具备构建出复杂智能体的潜力,也因此,AlphaGo的第一作者David Silver认为深度增强学习等价于通用人工智能DRL=DL+RL=Universal AI。

    深度增强学习的Actor-Critic框架

    目前深度增强学习的算法都可以包含在Actor-Critic框架下,如图2所示。

    图2 Actor-Critic框架

    把深度增强学习的算法认为是智能体的大脑,那么这个大脑包含了两个部分:Actor行动模块和Critic评判模块。其中Actor行动模块是大脑的执行机构,输入外部的状态s,然后输出动作a。而Critic评判模块则可认为是大脑的价值观,根据历史信息及回馈r进行自我调整,然后影响整个Actor行动模块。这种Actor-Critic的方法非常类似于人类自身的行为方式。我们人类也是在自身价值观和本能的指导下进行行为,并且价值观受经验的影响不断改变。在Actor-Critic框架下,Google DeepMind相继提出了DQN,A3C和UNREAL等深度增强学习算法,其中UNREAL是目前最好的深度增强学习算法。下面我们将介绍这三个算法的基本思想。

    DQN(Deep Q Network)算法

    DQN是Google DeepMind于2013年提出的第一个深度增强学习算法,并在2015年进一步完善,发表在2015年的《Nature》上。DeepMind将DQN应用在计算机玩Atari游戏上,不同于以往的做法,仅使用视频信息作为输入,和人类玩游戏一样。在这种情况下,基于DQN的程序在多种Atari游戏上取得了超越人类水平的成绩。这是深度增强学习概念的第一次提出,并由此开始快速发展。

    DQN算法面向相对简单的离散输出,即输出的动作仅有少数有限的个数。在这种情况下,DQN算法在Actor-Critic框架下仅使用Critic评判模块,而没有使用Actor行动模块,因为使用Critic评判模块即可以选择并执行最优的动作,如图3所示。

    图3 DQN基本结构

    在DQN中,用一个价值网络(Value Network)来表示Critic评判模块,价值网络输出Q(s,a),即状态s和动作a下的价值。基于价值网络,我们可以遍历某个状态s下各种动作的价值,然后选择价值最大的一个动作输出。所以,主要问题是如何通过深度学习的随机梯度下降方法来更新价值网络。为了使用梯度下降方法,我们必须为价值网络构造一个损失函数。由于价值网络输出的是Q值,因此如果能够构造出一个目标Q值,就能够通过平方差MSE的方式来得到损失函数。但对于价值网络来说,输入的信息仅有状态s,动作a及回馈r。因此,如何计算出目标Q值是DQN算法的关键,而这正是增强学习能够解决的问题。基于增强学习的Bellman公式,我们能够基于输入信息特别是回馈r构造出目标Q值,从而得到损失函数,对价值网络进行更新。

    图4 UNREAL算法框图

    在实际使用中,价值网络可以根据具体的问题构造不同的网络形式。比如Atari有些输入的是图像信息,就可以构造一个卷积神经网络(Convolutional Neural Network,CNN)来作为价值网络。为了增加对历史信息的记忆,还可以在CNN之后加上LSTM长短记忆模型。在DQN训练的时候,先采集历史的输入输出信息作为样本放在经验池(Replay Memory)里面,然后通过随机采样的方式采样多个样本进行minibatch的随机梯度下降训练。

    DQN算法作为第一个深度增强学习算法,仅使用价值网络,训练效率较低,需要大量的时间训练,并且只能面向低维的离散控制问题,通用性有限。但由于DQN算法第一次成功结合了深度学习和增强学习,解决了高维数据输入问题,并且在Atari游戏上取得突破,具有开创性的意义。

    A3C(Asynchronous Advantage Actor Critic)算法

    A3C算法是2015年DeepMind提出的相比DQN更好更通用的一个深度增强学习算法。A3C算法完全使用了Actor-Critic框架,并且引入了异步训练的思想,在提升性能的同时也大大加快了训练速度。A3C算法的基本思想,即Actor-Critic的基本思想,是对输出的动作进行好坏评估,如果动作被认为是好的,那么就调整行动网络(Actor Network)使该动作出现的可能性增加。反之如果动作被认为是坏的,则使该动作出现的可能性减少。通过反复的训练,不断调整行动网络找到最优的动作。AlphaGo的自我学习也是基于这样的思想。

    基于Actor-Critic的基本思想,Critic评判模块的价值网络(Value Network)可以采用DQN的方法进行更新,那么如何构造行动网络的损失函数,实现对网络的训练是算法的关键。一般行动网络的输出有两种方式:一种是概率的方式,即输出某一个动作的概率;另一种是确定性的方式,即输出具体的某一个动作。A3C采用的是概率输出的方式。因此,我们从Critic评判模块,即价值网络中得到对动作的好坏评价,然后用输出动作的对数似然值(Log Likelihood)乘以动作的评价,作为行动网络的损失函数。行动网络的目标是最大化这个损失函数,即如果动作评价为正,就增加其概率,反之减少,符合Actor-Critic的基本思想。有了行动网络的损失函数,也就可以通过随机梯度下降的方式进行参数的更新。

    为了使算法取得更好的效果,如何准确地评价动作的好坏也是算法的关键。A3C在动作价值Q的基础上,使用优势A(Advantage)作为动作的评价。优势A是指动作a在状态s下相对其他动作的优势。假设状态s的价值是V,那么A=Q-V。这里的动作价值Q是指状态s下a的价值,与V的含义不同。直观上看,采用优势A来评估动作更为准确。举个例子来说,假设在状态s下,动作1的Q值是3,动作2的Q值是1,状态s的价值V是2。如果使用Q作为动作的评价,那么动作1和2的出现概率都会增加,但是实际上我们知道唯一要增加出现概率的是动作1。这时如果采用优势A,我们可以计算出动作1的优势是1,动作2的优势是-1。基于优势A来更新网络,动作1的出现概率增加,动作2的出现概率减少,更符合我们的目标。因此,A3C算法调整了Critic评判模块的价值网络,让其输出V值,然后使用多步的历史信息来计算动作的Q值,从而得到优势A,进而计算出损失函数,对行动网络进行更新。

    A3C算法为了提升训练速度还采用异步训练的思想,即同时启动多个训练环境,同时进行采样,并直接使用采集的样本进行训练。相比DQN算法,A3C算法不需要使用经验池来存储历史样本,节约了存储空间,并且采用异步训练,大大加倍了数据的采样速度,也因此提升了训练速度。与此同时,采用多个不同训练环境采集样本,样本的分布更加均匀,更有利于神经网络的训练。

    A3C算法在以上多个环节上做出了改进,使得其在Atari游戏上的平均成绩是DQN算法的4倍,取得了巨大的提升,并且训练速度也成倍的增加。因此,A3C算法取代了DQN成为了更好的深度增强学习算法。

    UNREAL(UNsupervised REinforcement and Auxiliary Learning)算法

    UNREAL算法是2016年11月DeepMind提出的最新深度增强学习算法,在A3C算法的基础上对性能和速度进行进一步提升,在Atari游戏上取得了人类水平8.8倍的成绩,并且在第一视角的3D迷宫环境Labyrinth上也达到了87%的人类水平,成为当前最好的深度增强学习算法。

    A3C算法充分使用了Actor-Critic框架,是一套完善的算法,因此,我们很难通过改变算法框架的方式来对算法做出改进。UNREAL算法在A3C算法的基础上,另辟蹊径,通过在训练A3C的同时,训练多个辅助任务来改进算法。UNREAL算法的基本思想来源于我们人类的学习方式。人要完成一个任务,往往通过完成其他多种辅助任务来实现。比如说我们要收集邮票,可以自己去买,也可以让朋友帮忙获取,或者和其他人交换的方式得到。UNREAL算法通过设置多个辅助任务,同时训练同一个A3C网络,从而加快学习的速度,并进一步提升性能。

    在UNREAL算法中,包含了两类辅助任务:第一种是控制任务,包括像素控制和隐藏层激活控制。像素控制是指控制输入图像的变化,使得图像的变化最大。因为图像变化大往往说明智能体在执行重要的环节,通过控制图像的变化能够改善动作的选择。隐藏层激活控制则是控制隐藏层神经元的激活数量,目的是使其激活量越多越好。这类似于人类大脑细胞的开发,神经元使用得越多,可能越聪明,也因此能够做出更好的选择。另一种辅助任务是回馈预测任务。因为在很多场景下,回馈r并不是每时每刻都能获取的(比如在Labyrinth中吃到苹果才能得1分),所以让神经网络能够预测回馈值会使其具有更好的表达能力。在UNREAL算法中,使用历史连续多帧的图像输入来预测下一步的回馈值作为训练目标。除了以上两种回馈预测任务外,UNREAL算法还使用历史信息额外增加了价值迭代任务,即DQN的更新方法,进一步提升算法的训练速度。

    UNREAL算法本质上是通过训练多个面向同一个最终目标的任务来提升行动网络的表达能力和水平,符合人类的学习方式。值得注意的是,UNREAL虽然增加了训练任务,但并没有通过其他途径获取别的样本,是在保持原有样本数据不变的情况下对算法进行提升,这使得UNREAL算法被认为是一种无监督学习的方法。基于UNREAL算法的思想,可以根据不同任务的特点针对性地设计辅助任务,来改进算法。

    小结

    深度增强学习经过近两年的发展,在算法层面上取得了越来越好的效果。从DQN,A3C到UNREAL,精妙的算法设计无不闪耀着人类智慧的光芒。在未来,除了算法本身的改进,深度增强学习作为能够解决从感知到决策控制的通用型学习算法,将能够在现实生活中的各种领域得到广泛的应用。AlphaGo的成功只是通用人工智能爆发的前夜。

    展开全文
  • DRL的基本模型: DRL算法框架: 大脑的执行机构-actor: 输入状态s,输出动作a(policy gradient算法) 大脑的评判机构-critrc:...在actor-critic的框架下:有DQN、A3C、UNREAL算法提出。 DQN- 第一个提出...

    DRL的基本模型:

    在这里插入图片描述
    DRL算法大框架:
    在这里插入图片描述
    大脑的执行机构-actor: 输入状态s,输出动作a(policy gradient算法)
    大脑的评判机构-critrc:根据回馈r(外界给的)进行调整。(Q learning)
    人类也是在本能和价值观影响作用下进行行为,并且价值受经验的影响不断改变。
    在actor-critic的框架下:有DQN、A3C、UNREAL等算法提出。
    DQN-
    在这里插入图片描述
    第一个提出的DRL算法,输出动作有限情况可用。仅有critic模块。critic模块重新表示为value network。
    算法:基于价值网络,我们可以遍历某个状态s下各种动作的价值,然后选择价值最大的一个动作输出。
    重点:value network怎么设计,每个动作的价值如何计算。怎么更新每个动作的价值。
    针对更新问题:我们要有一个目标Q(价值)(根据bellman公式迭代),和现在的Q进行平方差最小化来更新参数。

    A3C算法:
    1)在价值网络的基础上,价值网络给出动作的好坏评价,乘以动作网络中整体动作概率分布,作为动作网络的损失函数。
    2)actor网络的输出有两种:某一确定动作和所有动作的分布概率。A3c采用动作概率的方式。
    3)A3C在动作价值Q的基础上,使用优势A(Advantage)作为动作的评价。优势A是指动作a在状态s下相对其他动作的优势。假设状态s的价值是V,那么A=Q-V。
    具体计算上:A3C算法调整了Critic评判模块的价值网络,让其输出V值,然后使用多步的历史信息来计算动作的Q值
    4)还使用异步训练的思想

    区分:
    我们只有在使用Policy Gradient时完全不使用Q,仅使用reward真实值来评价,才叫做Policy Gradient,要不然Policy Gradient就需要有Q网络或者V网络,就是Actor Critic。

    https://www.zhihu.com/question/56692640/answer/157280972

    POMDP介绍:MDP是状态到动作的mapping,而POMDP是基于状态之上的概率分布(probability distribution over states)到动作的mapping。

    https://www.zhihu.com/question/41477987

    展开全文
  • Unreal开发一个简单的MC Demo 第一节1.使用一个模版Unreal提供了一系列的基础模版供大家使用,因为我们要做一个MC Demo,最适合的Demo即是First Person Example。 该模板提供了第一人称射击的基础,可以控制角色...

    用Unreal开发一个简单的MC Demo 第一节

    1.使用一个模版

    Unreal提供了一系列的基础模版供大家使用,因为我们要做一个MC Demo,最适合的Demo即是First Person Example。
    该模板提供了第一人称射击的基础,可以控制角色上下左右蹦跳,还能瞄准发射子弹,十分像MC的操作。

    创建项目

    2.制作一个MC风格的方块

    首先将这上中下三个面的图片导入到Unity
    201507151958264412015071520175844420150715201812439

    然后右键–创建材质,只有这样才能给Unity使用

    创建一个BSP方块

    选择方块,将他的画刷大小改成100/100/100

    将模式改为选择并旋转对象,然后将刚创建的材质拖到方块的6个面上,如果看不到记得旋转一下
    于是我们得到了一个6面涂色的方块。

    在世界大纲里面找到刚才创建的方块,点击他,然后创建静态网格物体

    双击进入刚才的静态网格物体,设置他的碰撞,否则方块不能堆叠或者站在上面

    于是,一个MC风格的静态网格物体创建完成~

    在最后,我们选择该物体,然后蓝图->转换为蓝图类,将物品转化为蓝图物品。方便以后增加新功能

    3.蓝图编辑

    First Person Example的主要功能存放在FirstPersonCharacter蓝图里面,有移动,开火等功能。

    首先我们当然要增加放置方块功能了。

    首先增加Place事件,用鼠标左键触发,原来的开火放到鼠标右键
    去编辑-项目设置里面修改一下~

    好,开始进入正式的蓝图编辑。

    首先创建一个事件监听,监听输入的Place事件
    收到Place事件后,发出一条射线,通过Break Hit Result判断命中的单位

    然后将命中的点XYZ除以100再乘以100(对齐方格),然后创建一个方块,然后就Bingo!

    可以运行一下程序看看结果

    果然可以放方块了!但是有个问题,为什么方块都在底下,堆不上去呢?

    其实很简单,我们碰撞的点在地底,Z通过int(Z/100)*100运算的结果的也一直在地底下,所以我们永远堆不上去。而且在MC里,我们在方块的左右点击放置,理应也出现在目标箱子的左右。
    所以我们还要获取碰撞的方块,判断命中点在目标方块的上下左右,然后放置箱子。

    首先获得碰撞的Actor,尝试将他转换成方块,取得他的XYZ,用来跟之前的XYZ对比

    判断Y轴,放置在箱子的上或者下,将结果保存到Cube Place Vector(需要创建一个Vector变量)里

    X轴和Z轴同理。。。

    最后在目的地创建方块

    运行一下

    非常好!BTW,我们的测试小人还能蹦到方块上。完美!

    好了,第一节就这样完工。下一节我们尝试移除方块~

    展开全文
  • 探索开发一个引擎需要用到多少知识和技术

    开发一个游戏引擎需要用到多少知识和技术?

    如何开发一个游戏引擎?

    想要做游戏、做出一款好的游戏、那么肯定要先了解什么是游戏引擎、开发一个游戏引擎需要用到什么、游戏引擎包括什么等等,前面了解了Unreal Engine 的页面和基础运用,现在就来一个基础入门,此文章参考了很多资料及其其他文章,仅当粗略的总结,而且会持续更新和修改。

    什么是游戏引擎?

    那么首先开始了解,什么是游戏引擎?
    根据百度百科资料:

    游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程序的核心组件。这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程式而不用由零开始。大部分都支持多种操作平台,如Linux、Mac、OS、X、微软Windows。游戏引擎包含以下系统:渲染引擎(即“渲染器”,含二维图像引擎和三维图像引擎)、物理引擎、碰撞检测系统、音效、脚本引擎、电脑动画、人工智能、网络引擎以及场景管理。

    那游戏引擎的原理是什么呢,以及为什么要做游戏引擎?
    游戏引擎是一个为运行某一类游戏的机器设计的能够被机器识别的代码(指令)集合
    它像一个发动机,控制着游戏的运行。**一个游戏作品可以分为游戏引擎和游戏资源两大部分。**游戏资源包括图象,声音,动画等部分,
    列一个公式就是:游戏=引擎(程序代码)+资源(图象,声音,动画等)。游戏引擎则是按游戏设计的要求顺序地调用这些资源。

    在游戏引擎这个概念出现之前,还只是游戏的萌芽期,那时候的游戏大多简单、场景也粗糙,但每款游戏的平均开发周期也要达到8到10个月以上,这一方面是由于技术的原因,另一方面则是因为几乎每款游戏都要从头编写代码,造成了大量的重复劳动。渐渐地,一些有经验的开发者摸索出了一条偷懒的方法,他们借用上一款类似题材的游戏中的部分代码作为新游戏的基本框架,以节省开发时间和开发费用。这差不多就是游戏引擎出现的原因,用某句话来戏说,正是因为人类偷懒才有了这诸多的发明,但不得不说游戏引擎的出现确实促进了游戏的发展。

    在此推荐百度百科链接:https://baike.baidu.com/item/游戏引擎/620879?fr=aladdin

    维基百科中的定义则更加
    游戏引擎
    就如汉字最开始是由图案构成的一样,游戏引擎一开始也只是一个单独的游戏。当人们不断的制作新的游戏的时候,发现很多功能是通用的,没有必要做重复的内容。所以,人们开始对游戏里面的功能进行抽象总结,这样在开发新的游戏的时候可以直接使用之前的成果,即节省时间,又可以避免很多前人遇到的坑。 那么游戏引擎其实就是一些已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程序的核心组件。其目的在于让游戏设计者能容易和快速地做出游戏程式而不用由零开始。
    这些由之前开发游戏的经验与成果所抽象总结的一个系统就是游戏引擎。一个成熟的游戏引擎应该尽可能的通用于各种游戏制作,提供一套完善的制作流程。各个游戏大厂一般都有自己的游戏引擎,如EA的寒霜引擎、育碧的Anvil引擎、完美的Angilica祖龙引擎,其他小型公司一般使用的是商业游戏引擎,如Unity,UE4。
    简单的说:游戏引擎也决定了游戏最初的样子。

    在此也推荐文章(游戏的发展史):https://baijiahao.baidu.com/s?id=1620171317445300416&wfr=spider&for=pc

    接下来再来说游戏引擎会用到的一些知识:

    大多数游戏引擎包含以下系统:渲染引擎、物理引擎、碰撞检测系统、音效、脚本引擎、电脑动画、人工智能、网络引擎以及场景管理。

    游戏引擎大致等于图形引擎+=游戏解决方案+=编程接口。
    每一款引擎对于图形渲染的处理方式都不同,所以用某个引擎编写出来的游戏,具体的表现画面也会不同。比如,有的引擎编写出的光影效果特别绚丽,有的则粒子效果特别真实。
    图形引擎只是游戏引擎中一个占比极大的组成部分。一款好的游戏引擎,不仅要看它对于图形图像的处理能力,也要看它对于其他部分的处理能力,比如对音频、音效的播放、键盘鼠标的处理,以及 UI 界面的编辑和各种处理工具的提供。这里的处理工具包括地图编辑器、关卡编辑器、人物编辑器、资源编辑器、物理碰撞、碰撞检测等。所以,从专业的角度讲,游戏引擎是完成开发一套游戏的解决方案,而不仅涉及图形部分。
    不管你是直接面对引擎编写代码,还是在引擎提供的编辑器(比如关卡编辑器)基础上编写简单的逻辑代码,写代码都是必不可少的。在引擎提供的编程接口上,你能很容易地调用各种接口完成游戏的开发。

    游戏引擎是用什么编写的呢

    游戏引擎并没有一种固定的开发语言,依赖于你所制作游戏的目标平台是什么。
    1.C/C++
    2. JavaScript/TypeScript
    3. NET
    4. Java
    游戏引擎控制着游戏的几乎所有内容,游戏的表现质量和游戏引擎直接相关;我们需要掌握更多游戏引擎相关的知识。因为,不管你是购买游戏引擎还是自己开发游戏引擎,了解游戏引擎,会让你对游戏编程的总体脉络有一个了解。熟知游戏引擎的开发逻辑,你就能很快定位问题所在。

    那么下面我们来真正进入了解游戏引擎制作需要的东西

    1、架构
    2.第三方软件开发包
    3.平台独立层
    4.对象组件模型
    5.原子类型与原子操作
    6.定时器
    7.Graphics Wrappers 图形包裹类
    8.Moudule模块
    9.字符串
    10.调试
    11.语法分析器
    12.性能分析
    13.引擎配置
    14.曲线
    15.RTTI、反射、序列化
    16.唯一标识符
    17.游戏资产
    18.材质与纹理
    19.摄像机
    20.物理
    21.BSP树
    22.关于剔除
    23.光照贴图
    24.动态阴影
    25.贴花Decal
    26.HDR与后处理
    27.环境映射EnvironmentMapping
    28.PRT
    29.层级式物体依附
    30.MatchMaking
    31.音频
    32.前端FrontEnd
    33.静态与动态元素
    34.世界载入
    35.脚本
    36.游戏专用子系统
    37.玩家机制
    38.游戏摄像机
    39.Debug,Release
    40.软件的主要构成 算法+数据结构+设计模式
    41.游戏开发常用的数学知识
    向量运算,三角函数,矩阵运算,四元数,随机数,坐标系运算(笛卡尔坐标系、极坐标系、球坐标系),空间变换,以及其他的几何学(点到面的距离,点是否在几何体内等),微积分
    42.内存管理:涉及知识操作系统
    43.容器:涉及数据结构
    44.I/O
    45.游戏循环与渲染循环

    参考文章链接:https://blog.csdn.net/u012999985/article/details/79369542
    https://blog.csdn.net/xiaokunzhang/article/details/80588810
    http://baijiahao.baidu.com/s?id=1598686146136015080&wfr=spider&for=pc
    https://zhidao.baidu.com/question/42201286.html
    https://baike.baidu.com/item/游戏引擎
    https://blog.csdn.net/qq493453700/article/details/72833924
    推荐阅读文章:强烈推荐文章:https://blog.csdn.net/u012999985/article/details/79369542
    第一个游戏引擎制作:https://blog.csdn.net/qq493453700/article/details/72833924

    展开全文
  • 今年是第二次参加UnrealOpenDay活动,收获颇丰,也认识了很多业界大咖。这里稍微详细点的总结一下会议内容和参会心得。 首先是行程: 会议9点签到,9:45正式开始。地点和去年一样还是在宝华万豪酒店,位于上海马戏...
  • actor-critic框架

    2017-05-16 15:34:10
    最近发现我大自动化的思想在deep learning中很有体现呀,之前说过77要去研究bicnet了,读完之后从里面采用的actor-critic框架说起吧,这个就用到了我们自控里面反馈的思想。 据说今年几个顶会文章强化学习占到70%,...
  • 上一篇《浅谈Virtual Texture》主要是对理论知识的介绍,本篇开始对Unreal Virtual Texture的源码做一个导读。 内容包括Virtual Texture的流程和一些技术实现细节,默认你已经对Virtual Texture有一定的认识,如对...
  •  图2 Actor-Critic框架把深度增强学习的算法认为是智能体的大脑,那么这个大脑包含了两个部分:Actor行动模块和Critic评判模块。其中Actor行动模块是大脑的执行机构,输入外部的状态s,然后输出动作a。而Critic评判...
  • TemplateMethod 动机(Motivation) 在软件构建过程中,对于某一项任务,它常常有稳定的整体操作 结构,但各个子步骤却有很多改变的需求,或者由于固有的原因 ...定义一个操作中算法框架,而将一些步骤延迟到...
  • 之前UWA为大家分别介绍了Unreal 4引擎中渲染模块的光照系统和材质系统,在本篇文章中,我们将为大家介绍渲染模块的图像后处理这部分内容。
  • 转自:深度学习前沿算法思想 导读 第一版: 深度学习前沿算法思想 深度学习实践:使用Tensorflow实现快速风格迁移 行为识别:让机器学会“察言观色”第一步 第二版: 谷歌首届 TensorFlow 开发者峰会 重磅...
  • 本文根据小米互娱 VR 技术专家 房燕良在 MDCC 2016 移动开发者大会上的演讲整理而成,PPT 下载地址:... ...房燕良,从 2001 年开始,自主研发 3 代游戏引擎,发布游戏超过 10 款。代表作品有
  • 深度学习前沿算法思想 本文转自: https://mp.weixin.qq.com/s?__biz=MzA5NDExMTAzNA==&mid=2649981646&idx=2&sn=8fe05eac5a5068efb65ca1602e5fd3a0&chksm=8854b69bbf233f8db5dbaa...
  • 这次的版本带来了数百个虚幻引擎 4 的更新,包括来自 GitHub 的社区成员们提交的 145 个改进!感谢所有为虚幻引擎 4 添砖加瓦贡献的人们: alk3ovation, Allegorithmic (Allegorithmic), Alwin Tom (alwintom), ...
  • 这篇文章是从微软Web开发系列的一部分。 感谢您支持谁使SitePoint可能的合作伙伴。 团结和Epic的虚幻引擎,流行的中间件工具经常使用的游戏开发商,不限于创建作为一个可执行文件运行编译的应用程序。...
1 2 3 4 5 ... 20
收藏数 900
精华内容 360
热门标签
关键字:

unreal里面的算法框架