C# 在游戏中处理人口(统一)

C# 在游戏中处理人口(统一),c#,linq,unity3d,C#,Linq,Unity3d,我目前正在开发一款模拟城市风格的游戏,我正在研究如何管理城市的人口。剧本最终将起到安置房屋的作用,这座房屋增加了城市容纳多少人的能力。当构建完成后,我将把公民结构的数量添加到公民列表中 然而,想象一下,人口超过了1000,10000人。这是控制大量公民的最佳解决方案吗?此外,当一所房子被移除时,这将移除人口数量(从列表中移除),从而留下职位空缺。我最终希望玩家能够转移焦点,因此任何具有焦点转移枚举类别的建筑都将意味着劳动力将首先填补这些工作。同样,使用列表和Linq查询是一种方法,还是会有更好的

我目前正在开发一款模拟城市风格的游戏,我正在研究如何管理城市的人口。剧本最终将起到安置房屋的作用,这座房屋增加了城市容纳多少人的能力。当构建完成后,我将把公民结构的数量添加到公民列表中

然而,想象一下,人口超过了1000,10000人。这是控制大量公民的最佳解决方案吗?此外,当一所房子被移除时,这将移除人口数量(从列表中移除),从而留下职位空缺。我最终希望玩家能够转移焦点,因此任何具有焦点转移枚举类别的建筑都将意味着劳动力将首先填补这些工作。同样,使用列表和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;
        }
    }
}
公共级城市:单一行为
{
公共列表公民=新列表();
public List cityBuildings=new List();
//TODO(LINQ):检查建筑物是否没有员工且该员工失业的方法,然后将该公民分配到建筑物
}
公共结构公民
{
雇佣的公共建筑;
公共职业
{
如果(employedAt!=null)
{
返回true;
}
其他的
{
返回false;
}
}
}

答案是——正如您所预料的那样——这取决于具体情况。LINQ操作通常非常快,除非您正在谈论数百万个对象。然而,他们最终会产生一些必须收集的垃圾。如果您在每一帧执行这样的操作,您可能会遇到GC故障。如果你不经常运行东西(例如,仅当玩家放置/移除房屋等),这种方法应该可以很好地工作

如果您需要最大的性能,您可能需要看看Unity中新的DOTS体系结构(aka.ECS),它允许您快速管理大量数据。话虽如此,过早的优化是万恶之源,而点则是让你头疼的野兽


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

List.Add()
List.Remove()
是非常快速的操作。我看这里没有性能问题。除了
,你根本不应该在这里使用
结构
!否则,例如,列表中的
建筑
无论是否连接到
公民
中的
雇员网站
struct
是一种值类型,因此您将拥有具有相同值的独立副本。您想要的是
es,因此
建筑
中的任何变化也会自动反映在所有相应公民的
就业数据中!明亮的我已经研究过ECS,但目前我仍然很清楚,因为关于大多数c#原则,我还有很多东西要学习,但这对于未来的发展是很好的。感谢您的时间提醒,关于LINQ,微软自己在其建议中实际上建议:避免使用LINQ。这可能适用于某些用例(例如,紧密循环中的LINQ),但我认为,这些笼统的声明必须谨慎对待。代码可读性和可维护性几乎总是胜过性能问题。如果您的评测显示某个LINQ语句存在性能问题,那么请务必将其扩展到一些手动代码(如果您使用Rider IDE,您基本上可以让IDE为您这样做)。除此之外,我建议您保留LINQ,因为它更具可读性和可维护性。