风日好的博客

日最烈的狗

物理引擎和图形引擎互相的配合

    由于还没有学习游戏引擎的相关知识,所以不太清楚物理引擎和图形引擎互相之间是怎么联系起来的。所以根据在网上找到的资料,简单讲一下这两个引擎的实现方式和互相的配合。


配合:

    物理引擎和图形引擎的配合可以简单描述为:输入场景信息(包括物体的形状、物理参数和位置等),通过物理引擎计算出场景中所有物体的新的形状和位置,再由图形引擎将它们渲染后显示在计算机上。以physX物理引擎和OGRE图形引擎作为例子:

一、OGRE初始化: 创建显示对象、地形、灯光等,完成其他准备。

二、PhysXc初始化:准备相关物理环境,根据OGRE中的几何体,创建用于物理计算的静态和动态角色。并互相关联。

三、创建帧监听器,进行帧循环更新图形显示。

四、调用PhysX引擎中的运算函数,对场景中物体与物体之间的相互作用进行模拟运算。


以上步骤第三、四步由于PhysX引擎的模拟计算线程是独立的,与OGRE帧循环线程分开,因此物理引擎的计算过程与图形引擎的显示渲染过程同时进行。根据物理引擎计算的结果,更新场景内物体的位置、方向、速度等参数,将更新后的参数传递给OGRE更新图形显示,循环进行下一步模拟计算。

PhysX引擎

既然物理引擎是计算每个物体的运动状态,那么unity使用的physX引擎做了些什么呢?

Physx里的基本术语:

1.     Scene场景:就像演员表演都需要一个舞台一样, PhysX的所有物理运动都在这个scene中进行。

2.     Actor角色:角色(Actor)为场景中参与运算具有形状、实体的对象

3.     bosy刚体:用来记录物体之间世界交互的各种系数,如速度,阻尼等.

4.     shape形状:描述和表达某一角色的外形,PhysX中提供六种基本形状:盒子(Box) 、球体( Sphere ) 、胶囊( Cap sule ) 、凸状网格( Conv2exMesh) 、三角网格( TriangleMesh) 和平面( Plane ) 

定义各种不同的角色(actor),然后指定每个角色的形状(shape)属性和刚体(body)属性,最后是把这些角色都加入到场景(scene)空间中去,接下来就是计算

计算部分:

//则应该是我熟悉的部分,暂时没找到网上没资料,先留着,以后再写。

游戏引擎的简单描述:

引用了知乎谢天奇的答案

如果渲染和逻辑在一个线程中

1.计算本帧逻辑-渲染本帧

最差的方式 GPU必须等待CPU执行完后才能开始工作

2.渲染上一帧-计算本帧

会有“差一帧”现象

并且都无法解决一个问题 就是渲染和逻辑一一对应并非必要 逻辑帧率和渲染帧率互相绑架了

并且以上方式如果出现渲染压力过大 超过一帧时间 就会拖慢游戏逻辑 当然你可以在下一帧多次执行逻辑 来追赶 不过因为每帧总有一次渲染 所以这么做更可能的情况是 逻辑帧拖欠的债反而越来越高 最终导致游戏永远卡死

所以解决办法是渲染逻辑在两个独立的线程中

渲染全力执行
每次都只是采样场景最新的逻辑状态而已 并且对于动画的插值计算 并不需要每个逻辑帧都计算 而是需要渲染的时候才需要计算 逻辑只需要更新时间就可以了

这种情况下就不会出现因为渲染压力大导致游戏卡死了 最多渲染跳帧 逻辑依旧正常 不会拖慢 更不会卡死 除非你逻辑慢到无法在一帧完成 那么就没救了 只能拖慢了

并且逻辑和渲染各自都能以任意频率执行

不过这么做也有难度
就是所有逻辑数据都要做双缓冲 逻辑更新从读缓冲读数据 更新到写缓冲 处理完交换读写缓冲

渲染每次都读最新的读缓冲数据



阅读更多
个人分类: 游戏引擎
上一篇IEnumerator, yeild和协程各自的实现方式,在unity中的联系和应用
下一篇C++ 主要新特性
想对作者说点什么? 我来说一句

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

关闭
关闭