我在这里得到很多人的建议,并且在过去几个月里,我把我正在制作的4X游戏分解成可消化的元素。每个元素都是自己的游戏,这样我就可以获得一些实践经验。我的当前项目是在处理“人口”(使用Godot)。

我的目标是最终让人口有像家乡省份、当前省份、健康、年龄、创新、能力和勇气这样的统计数据。

这个游戏是回合制的,所以每次按下“结束回合”按钮,游戏就会确定需要计算什么,然后实际上就计算了。例如,它会检查世界是否有活跃的研究所,如果有,就会找到这些研究所里的人口并提高他们的创新能力。

但这里就出现了问题。

我最初尝试让每个人口成为一个对象,但我很快就意识到这是一种坏主意,因为访问大量人口会导致性能损失。所以我切换到数组格式,因为我想它可能会帮助提高性能(?)。

这是我最初的想法:

enum pop {
    POP_HEALTH,
    POP_KNOWLEDGE
}

var pops: Array[Array] = [
    [],
    []
]

var empty_pop_slots: Array = []

func remove_pop(id: int):
    if id >= len(pops[pop.POP_HEALTH]) or id < 0:
        return

    for p in pops.size():
        pops[p][id] = null

    empty_pop_slots.append(id)

func add_pop(... properties: Array):
    if properties.size() < pops.size():
        return

    if empty_pop_slots.size() == 0:
        for p in pops.size():
            pops[p].append(properties[p])
    else:
        var trash = empty_pop_slots.pop_back()
        for p in pops.size():
            pops[p][trash] = properties[p]

这提高了性能,但仍然存在问题。它在更大的人口规模下很慢,即使是10,000人口也需要一段时间来循环通过并修改属性或检查某些值。

所以我需要改变思路了。 我想知道像stellaris这样的游戏是如何处理这些事情的,它们似乎是将人口分组到一起的,但我却无法确定具体是如何做的。 有什么建议吗? 我感觉我的技术知识和经验不足是让我受阻的原因。