doom3命令系统中,重要的类有idEventDef负责管理命令的注册声明,idEvent是命令
对象。
该命令系统主要数据结构有 eventDefList , FreeEvents,EventQueue,EventPool
其中EventPool是一个声明为 idEvent 的 4096个对象的数组,该数组是命令对象的分配池。
这样在实时运行时,省去了从堆中分配命令与在堆中释放的时间。在初始化阶段,调用
idEvent::Init()函数会将EventPool中的所有的命令节点都加入到FreeEvents列表中,以便
分配。而idEvent::Alloc函数是为上层分配命令的函数,该函数直接从FreeEvents列表中摘出
一个idEvent对象来给上层调用者使用,而当上层调用者对分配得的idEvent对象调用Free()时
会将当前idEvent节点还给FreeEvents。由于FreeEvents的节点实际是来自EventPool故有命令数量
限制,最大命令数量不得超过4096个,若超过会关闭游戏。
为了将命令加入队列中,需要调用idEvent的Schedule函数,该函数会根据传入的时间time
将该命令加入EventQueue命令列表的适当位置,该EventQueue是一个根据时间递增顺序的命令列表。
Schedule函数将遍历EventQueue列表的所有项找到自己time的位置,然后插入之。
该命令系统的核心函数就是ServiceEvents(),该函数是一个static member函数,该函数
会根据当前游戏时间,将在当前时间之前的所有命令泵出并加以传给idEvent的object变量加以处理
并将处理后的命令返还给FreeEvents用于再分配。
命令的定义由idEventDef负责,该类的主要参数是name,formatspec.该类负责注册命令的类型。
name变量是一个const char* 该变量指定了命令的名称。formatspec指定的是参数类型。当该idEventDef
构造时,会自动将自身保存在static idEventDef* eventDefList中。该eventDefList是定义命令
的查找表。
对象。
该命令系统主要数据结构有 eventDefList , FreeEvents,EventQueue,EventPool
其中EventPool是一个声明为 idEvent 的 4096个对象的数组,该数组是命令对象的分配池。
这样在实时运行时,省去了从堆中分配命令与在堆中释放的时间。在初始化阶段,调用
idEvent::Init()函数会将EventPool中的所有的命令节点都加入到FreeEvents列表中,以便
分配。而idEvent::Alloc函数是为上层分配命令的函数,该函数直接从FreeEvents列表中摘出
一个idEvent对象来给上层调用者使用,而当上层调用者对分配得的idEvent对象调用Free()时
会将当前idEvent节点还给FreeEvents。由于FreeEvents的节点实际是来自EventPool故有命令数量
限制,最大命令数量不得超过4096个,若超过会关闭游戏。
为了将命令加入队列中,需要调用idEvent的Schedule函数,该函数会根据传入的时间time
将该命令加入EventQueue命令列表的适当位置,该EventQueue是一个根据时间递增顺序的命令列表。
Schedule函数将遍历EventQueue列表的所有项找到自己time的位置,然后插入之。
该命令系统的核心函数就是ServiceEvents(),该函数是一个static member函数,该函数
会根据当前游戏时间,将在当前时间之前的所有命令泵出并加以传给idEvent的object变量加以处理
并将处理后的命令返还给FreeEvents用于再分配。
命令的定义由idEventDef负责,该类的主要参数是name,formatspec.该类负责注册命令的类型。
name变量是一个const char* 该变量指定了命令的名称。formatspec指定的是参数类型。当该idEventDef
构造时,会自动将自身保存在static idEventDef* eventDefList中。该eventDefList是定义命令
的查找表。