我在这里得到很多人的建议,并且在过去几个月里,我把我正在制作的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这样的游戏是如何处理这些事情的,它们似乎是将人口分组到一起的,但我却无法确定具体是如何做的。 有什么建议吗? 我感觉我的技术知识和经验不足是让我受阻的原因。
评论 (0)