您提到的这些步骤很可能是在单独的引擎中完成的。只是简单的游戏引擎通常一口气就能拥有它们。您的顺序
for each object
do physics
do game logic
draw
变成
call physics subsystem
call game logic subsystem
call drawing subsystem
物理引擎负责位置和大小。
Game Logic Engine负责解释物理引擎发生了什么变化(他可能会阻塞某些航路点...),角色具有哪些目标以及他们应采取的行为,他运行预定的脚本(此思考功能)。
Drawing Engine绘制可见的对象,并且他知道哪些对象可见,因为Quake引擎在此处作弊(请参见Draw部分)。
我对您的建议是宁愿研究模拟的完成方式,而不是研究游戏引擎。流行文化与游戏开发相关,游戏引擎采用命令式语言(由于传统和速度)制作;因此,获得一本好的教科书(而不是理论)对我来说更具有启发性,然后他们着眼于引擎(实践),而不是着眼于引擎,并费了好几个小时来思考它们是如何做到的。
物理
迭代所有实体并执行{think,draw}的整个概念可能会导致问题。会有冲突等等。我相信Valve有Havok,我想Havok会照顾到足够正确的物理学。
认为
当游戏中的时间等于下一思维中的时间时,便会运行思考功能。它在Quake引擎中以这种方式工作,而Quake引擎是Half Life引擎的基础。它不是每次都运行。
在内部,这应该是简单的遍历实体列表并检查是否已经过去了调用think函数的时间。时间复杂度将为O(N),其中N是实体数。
如果实体太多,则应测量将提高fps的程度。注意,由于阿姆达尔定律,这可能是看不见的加速。我的意思是,您只需遍历所有项目并减少并检查一个数字即可。
我会通过按nextthink排序实体(创建指向实体的指针列表并每次对其进行排序;而不是实体数组)来加快速度,因为实体可能随时更改其nextthink,因此将它们重新排列在数组中需要O(N)而不是O( 1)在清单中)。
您还应该查看Linux中的O(1)调度程序。
画
引擎从相机所在的区域绘制大致可见的图像。游戏级别是划分为一棵树,而区域是该树的叶子。我不会为您提供详细信息 ……因此,如果一个实体可见,则将其放入一组可见实体中并进行绘制。
它们存储哪些区域是潜在的可见区域。它称为“潜在可见集”,简称PVS。有可视化的PVS,绿色的胶囊是玩家,并且在他周围呈现了PVS包含的内容。
<some commercial engine>
呢?