游戏
1.1 调度游戏中的事件
一个调度其可以有效帮助以下游戏技术的实现,他们包括物理仿真,人物运动,碰撞检测,游戏中的人工智能,渲染。在所有这些技术中有一个关键问题就是时间。在不同的时间里,当数百个不同的物体和过程都需要更新时,这些仿真技术的很多种东西变得非常复杂。
调度器的重要能力在于它能够动态地增加和删除物体,这可以使新物体很平滑地加入到游戏里面去,和其他游戏里面的物体一起参加仿真,然后在不需要的时候从调度里面把它删除。
1.1.1 调度器的组成
调度器的基本组件包括任务管理器,事件管理器和时钟。通过这些组件调度器就能生成基于时间或者基于帧的事件,然后调用相应的事件处理器。
任务管理器处理任务的注册和组织。每个任务都有一个包含了一个管理器可以调用的回调函数的接口。任务管理器维护了一个任务列表,其中包含了每一个任务的调度信息---例如开始时间,执行频率,持续时间,优先级和其他的属性。他也可能包含一个用户数据的指针或者性能统计信息。
事件管理器是调度器的核心部分。任务管理器里面的每一个任务都定义了一个或多个其需要处理的事件。一个事件指的是一个任务需要执行的时间。事件管理器的责任就是要产生必须的事件以执行相应的任务。
真实时间与虚拟时间:一个真实时间的调度在概念上是很简单的—时间管理器不停地进行循环,察看一个真实的时间时钟,每当目标到达的时候它就会触发一个事件。一个虚拟事件的调度器会把时间分成帧。任务在帧之间以批处理的方式进行,在虚拟时间里运行,然后在每帧渲染出来的时候与真实的时间进行同步。
时钟组件是用来跟踪真实时间,当前的仿真时间和帧数的。时间管理器负责事件的排序和产生。在某些情况下,多个任务可能会设置在同一个时间运行。有较高优先级的先执行。如果优先级相等或者系统没有优先级就轮流执行。我们经常需要动态地更改一个已经注册的任务属性,这可能会牵涉到更改他的优先级,周期,持续时间或者要求在它找到还没有结束的时候就将它删除。为了能更新任务的属性,我们必须使用一个外部的方法来找到他,可以使用一个唯一的注册ID来标志一个任务。
1.1.2 一个简单的调度器
调度器的设计主要集中在两个组件上面-----调度器引擎本身和ITask插件接口。要使调度器运行起来,必须要有一个调用它的程序。在一个非图形里面的程序里面,这要求把它放在一个循环里面然后执行顺序里面然后执行就可以。While (running) scheduler.ExecuteFrame();有两种方法把调度器集成在一个消息驱动的图形界面上。第一种方法是修改消息循环来处理消息和调用调度器。这是一个最容易想到的方法,但是有个缺点,就是当窗口大小来来改变的时候调度器会停止工作。第二种方法是创建一个Windows时钟,利用时钟消息来调用调度器。由于时钟消息并不会被窗口的拖动打断,调度器就可以在后台就接续运行了。
仿真:调度器可以用来驱动仿真系统。为了实现动画和碰撞检测功能,大多数仿真引擎都将时间分成独立的小片。