- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
游戏引擎多线程(一)
游戏引擎多线程(一) 前言? ?? ? 最近一直在做项目优化,可是由于项目引擎历史原因,不能去砍掉某些功能而去优化项目,项目开发到这种程度,只能在这个基础上去提升整个引擎的效率,常规的CPU和GPU上的优化(美术资源上的缩减,CPU上耗费地方和GPU耗费地方的优化等)基本上都做了。当然每个人都希望自己的游戏跑的越快越好,现在大部分机器都已经至少是双核的,如果能发挥多核优势,游戏的速度会大幅提升。 这里只是谈游戏引擎的多线程,至于游戏逻辑和游戏引擎这面关联不大。 游戏中大部分线程一个是用来每帧更新,一个是资源加载。资源加载本文不谈,但下面设计的多线程架构会考虑多线程加载的情况,让多线程加载无缝对接。 多线程模型 下面一共想了2种多线程框架,这2种都不是那种无休止的那种让每个线程都疯狂的运行,这样处理起来会有很多棘手的问题,为了简化问题,需要每帧都去同步一次这些线程,这样在提升效率的同时也简化问题的复杂程度(其实这2种模型原理基本一样,实现细节不同,因为一个是渲染,一个是纯引擎更新)。 游戏引擎一把流程分成下面这几部: 流程1.游戏物体的update 流程2.Cull阶段,这个阶段包括相机对物体的裁剪 流程3.对可见物体的渲染分类 流程4.那些可见并且依赖相机更新的物体进行更新。 流程5.渲染 可能不同游戏引擎流程处理和上面不太一样,但大多数都差不多。 这里面每一个过程都是相互依赖的,上一个流程输出,是下一个流程输入,一般只要是相互依赖的,要想做多线程处理,每一帧去同步的话,都要有2个buffer,上一个流程用一个buffer把上一帧的结果记录下来,下一个流程去取另一个buffer进行出来,然后帧末或者帧前交换2个buffer。如果每个流程都去这么做,随着流程越多,本来是延迟一帧的做法,随着流程的增多,会延迟很多帧,并且,好多东西都是不固定的,buffer来存放也是很棘手的问题。 现在为了避免这些问题,提出2种多线程模型,虽然不能让每个流程去多线程出来,但也可以尽量发挥多个CPU的能力,总之比单一线程来跑还是快的。 模型1/forum.php?mod=attachmentaid=NDY4MzN8ZjA5YWVlNDZ8MTM2NzA0NzQ5MHwwfDIwMjAyNA%3D%3Dnothumb=yes 模型1的机制其实很简单,把渲染部分单独拿出来,但由于渲染部分和上面流程是相互依赖的,这个时候必须用双缓冲buffer,做延后一帧处理。也就是上面说过的,一个buffer是给主线程用来填充的渲染数据,另一个是用来给渲染线程来渲染的,然后再步骤2的时候同步2个线程 模型2/forum.php?mod=attachmentaid=NDY4MzR8MzU0YmJjYjh8MTM2NzA0NzQ5MHwwfDIwMjAyNA%3D%3Dnothumb=yes 模型2比模型1的改进就是把流程1分解成多个线程处理,一般游戏里比较消耗的更新就是骨骼动画和粒子的更新。如果更新是没有依赖关系的,就可以把它放到一个单独线程里来出来,如果update m 和update n 有依赖关系,但update m 和update n的集合和其他没有依赖关系,那么就把他们放到一个里面去更新。要把这个划分出来除了设计上就要考虑最小依赖,还要去考虑依赖程序,才能准确划分。 举个例子,有些粒子是绑定到骨头上的,骨头的更新后才能粒子更新,因为粒子要跟随的,如果再无其他更新依赖那么就可以把它们弄到一个线程去。有些粒子不绑定到骨头上,而且这样就可以把它弄到一个线程去。 游戏世界中每一个Actor的更新保持独立性,这种独立性是需要制约的,因为我们很难保证Actor的独立性,要保证独立性并不是太难,需要做一些额外的工作。 我举个例子比如,场景中有2个物体,一个游乐场里面的旋转木马和一个人,默认情况下,人不在车上,并且旋转木马还在转,人的更新和木马的更新是毫无依赖关系的,他们每一个都可以单独放到一个线程去更新。这个时候如果人上了旋转木马,人就要跟随着旋转木马来动,简单的只是位置变,复杂的可能人被绑定到旋转木马的骨头上,跟着骨头走。这个时候你就不能把他们分别放到一个线程去更新,你要把他们放到同一个线程去更新,把他们看做一个整体。 一般情况下,每个Actor只是逻辑数据,它的实际渲染数据作为一个node封装在Actor里面,因为我们考虑的是引擎的多线程,不考虑逻辑层面,当人和旋转木马独立的时候,人和旋转木马的node都attach在引擎里的world,而人和旋转木马的actor都在逻辑层面的world, 如果要想很好解决这个问题,我们就要让直接attach 引擎world 里面 node 都是独立的,那个node 不独立于另一个,则这个node 必须detach 下来,在重新attac
文档评论(0)