编程
Setting Up Development Environment
UnigineScript
High-Level Systems
C++
C#
UUSL (Unified UNIGINE Shader Language)
File Formats
Rebuilding the Engine and Tools
GUI
Double Precision Coordinates
应用程序接口
Containers
Common Functionality
Controls-Related Classes
Engine-Related Classes
Filesystem Functionality
GUI-Related Classes
Math Functionality
Node-Related Classes
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
Rendering-Related Classes

代码应放置的位置: Update(), Flush() or Render()

世界脚本中拥有大量的函数,这些函数用来对应用程序的逻辑进行编码。世界脚本的初始化函数(init())被用来创建物体对象并初始化在加载世界对象时其它所有所需的资源。在卸载世界对象并使用世界对象来删除资源时,调用(shutdown())函数,这些资源在脚本执行期间得以创建用来避免内存泄露。

但逐帧进行升级更新又如何?世界脚本中对此情况分配了三块:

  • update() 中可控制渲染到屏幕上的内容以及渲染方式
  • flush()中可模仿物理,执行计算并实施非渲染游戏逻辑
  • render()中可根据同一帧内升级过的节点状态对行为进行纠正

code Update()

在世界脚本的update()方法中,可指定应用程序执行期间用于每帧上的所有函数。其可用于渲染逻辑的实施。简单地说,与图形有关的一切将由update()开始控制,通过此方法您可以:

注意
勿将力矩运用到update()中的刚体。否则,所得到的结果会随着每张渲染帧而发生变化,这种结果不稳定。

世界对象回调函数

update()中(例如使用WorldTriggerwidget callbacks)设置的回调函数不会立即得到执行。仅当调用下一个引擎函数时才会运行这些回调函数:即如果(在当前帧)存在地话,就在 flush()之前或在接下来的update() (下一帧中) — 无论哪一个先到。

Code Flush()

使用世界脚本的flush()函数,可以控制应用程序中的物理性:

但不要急着对update()中的其它所有进行编码。 flush()不仅可用于物理仿真,还可用于逻辑的实施并执行不太想用于每张渲染帧上的计算。我们一起来具体分析一下这种现象的原因。

通常物理帧率比渲染帧率低(参看details(具体细节)),这样在计算任务重的情况下flush()对性能的要求表现地较友好。其与渲染同时进行,因此也就避免了CPU的瓶颈问题。除此之外,我们还能准确地知道物理标记花费的准确时间,因为物理性具有复杂的帧率。综合以上因素flush()是执行计算的理想选择。

比如需要为对象计算新的位置。可使用 update()计算,但这样讲阻滞渲染的进行。但如果我们使用flush()就可以在开始渲染的时候同时计算新的位置。渲染帧更频繁的问题也很容易地得以解决。知道新位置后,我们就可以在两个位置之间进行线性穿插位置然后将这些位置用于每张渲染帧对象。最终,性能负载会更加平衡,无加载负荷峰值的出现。

注意
但对于在flush()范围内能进行的计算仍有一些限制,您无法:
  • 启用之后,无法进行复位和节点转换。
  • 创建新节点。
  • 删除节点。
这些操作会妨碍到已经开始的渲染进程。作为一个工作区,在flush()内,可生成一个节点数组,同时在update()真正地创建这个数组。

物理回调函数

如同update()一样,如果在flush() 内或使用PhysicalTrigger,设置了任意基于物理的回调函数,这些回调函数无法立即得以执行,因为渲染进程早已开始进行且这些函数会对此进程产生影响。如果要执行一个以上的物理迭代,这些函数会在下一个flush()前得以执行;如果没有,就会在下一个世界脚本的update()之前。

如果要复位或转换,创建或者删除由物理回调函数返回的节点,工作流程一样:将节点保存在数值中接下来在update()中执行所有必要的操作。

Code Render()

世界脚本的render()函数是一种用于在节点状态更新之后对行为进行纠正的额外函数(例如,骨骼蒙皮动画在当前帧中得以展示或粒子系统生成粒子)。

例如要将某个对象(我们姑且称作剑)贴附在具有蒙皮骨骼动画特征的手中。如果已经获取人物手部骨骼的转换并将其设置到 update()函数的剑上,这样的贴附结果将较为松散不精确。剑不会被紧握在手中,因为在世界脚本的update()得以执行之后动画得以显示。这就意味着在update()返回的骨骼转换将用于上一帧。在动画播放之后执行世界脚本中的render(),这样才此函数功能范围内可获取到更新的骨骼转换用于当前帧并将这些转换设置到剑上。

注意
使用render() 仅用于校正的目的,这样会增加主循环时间。其它的所有函数应放置在update()flush()内。
最新更新: 2017-07-03