c# - 处理游戏中的人口(统一)

标签 c# linq unity-game-engine

我目前正在开发一款模拟城市风格的游戏,并且正在研究管理城市的人口。该脚本最终将发挥作用,就像放置一所房子时一样,该房子会增加城市可容纳的人口数量。构建完成后,我会将该数量的公民结构添加到公民列表中。

但是,想象一下人口超过 1000、10000 名公民。这会是控制大量公民的最佳解决方案吗?此外,当房屋被拆除时,这将删除人口数量(从列表中删除),从而留下职位空缺。我最终希望玩家能够转移焦点,因此任何具有焦点转移枚举类别的建筑物都将意味着劳动力将首先填补这些工作。同样,使用 List 和 Linq 查询是可行的方法还是可以通过其他方法找到更好的解决方案?

public class City : MonoBehaviour
{
    public List<Citizen> citizens = new List<Citizen>();
    public List<Building> cityBuildings = new List<Building>();

    // TODO (LINQ): Method for checking if a building has no employees and this employee is unemployed then assign this citizen to the building
}

public struct Citizen
{
    public Building employedAt;

    public bool CheckEmployment()
    {
        if (employedAt != null)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

最佳答案

答案是 - 正如您可能已经预料到的 - 这取决于情况。 LINQ 操作通常非常快,除非您正在谈论数百万个对象。然而,它们会产生一些最终必须收集的垃圾。如果您每帧都执行此类操作,您可能会遇到 GC 问题。如果你运行的东西不那么频繁(例如,仅当玩家放置/移除房屋等时),这种方法应该可以正常工作。

如果您需要最大性能,您可能需要看看 Unity 中的新 DOTS 架构(又名 ECS),它允许您快速管理大量数据。话虽这么说,过早的优化是万恶之源,而 DOTS 却是令人头疼的野兽。

我将从 LINQ 查询开始,确保它们不会每帧都被调用,也许还有一些巧妙的缓存,并且只有在我确实遇到性能问题时才引入大枪。

关于c# - 处理游戏中的人口(统一),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59786931/

相关文章:

c# - 自定义 Linq 查询

iphone - Unity3d 和 iPhone Objective-c?

c# - 如何在 C# 中获取随机数以及为什么键盘输入不起作用?

c# - 2D Raycast 无法正确检测重叠碰撞器并忽略排序层

C# .NET - 固定证书颁发机构 - 我做得对吗?

c# - MySqlCommand().ExecuteReader().GetString() 不起作用

c# - 这种修改后的 C# 单例模式是一种好的做法吗?

c# - 将字符串附加到 URL

c# - 从 DataTable 创建 XML

c# - LINQ - 返回包含基于多个不同列的表的所有列的行