预处理系统 - ReiKohaku/Sonolus-wiki-zh_cn GitHub Wiki

预处理系统

预处理系统在初始加载关卡数据时只运行一次,并负责为游戏准备关卡。

预处理系统用于:

  • 设置或修改在整个游戏过程中使用的不可变数据。

  • 计算每个实体的生成顺序,并将实体排序到生成队列中。

  • 然后使用已知的不可变数据优化节点以提高性能。

准备系统包括三个子系统:预处理系统、生成排序系统和优化系统。

预处理系统

预处理系统为每个实体进行预处理。

系统按回调顺序依次遍历所有实体。 对每个实体调用preprocess

生成排序系统

生成排序系统处理计算每个实体的生成顺序,然后将实体排序到生成队列中。

系统按回调顺序依次遍历所有实体。 对于每个实体,调用spawnOrder并将返回值用作生成顺序。

系统根据实体从最低到最高的生成顺序将所有实体排序到生成队列中。如果两个实体具有相同的生成顺序,则它们将保留在level.json中的顺序。

优化系统

优化系统根据已知的不可变数据和节点逻辑对节点进行优化,以提高性能。

在优化循环的每个循环中,都会检查所有节点,以确定是否可以对其进行优化。 如果其中任何一个被优化,重复这个循环。

可优化的节点示例

1) 所有参数都是值节点的数学节点函数

数学节点函数没有副作用,当所有参数都是已知值节点时,结果可以预先计算。

Add(1 2 3)

将优化为:

6

2) 一些参数为值节点的控制流节点函数

根据控制流节点函数的逻辑,可以简化或修剪一些条件分支。

And(
    1
    2
    DynamicArgument1
    DynamicArgument2
    0
    DynamicArgument3
    DynamicArgument4
)

将优化为:

And(
    DynamicArgument1
    DynamicArgument2
    0
)

3) 含有不可变的数据访问的内存操作节点函数

对不可变数据的访问可以预先计算。

Get(LevelData *GraphicsQuality)

将优化成图形质量的值节点。

优化系统无法创建新节点

优化系统只能修改现有节点,不能创建新节点。

例如,无法优化以下节点:

Add(1 2 DynamicArgument)

要优化它,需要创建一个新的值节点,这是不可行的。

相反,将代码编写为:

Add(Add(1 2) DynamicArgument)

将优化为:

Add(3 DynamicArgument)