gpt4 book ai didi

c - 设计实体系统时如何避免 C 中的虚函数

转载 作者:行者123 更新时间:2023-11-30 14:45:06 25 4
gpt4 key购买 nike

我想仅使用 C 和一小部分 C++ 为我的游戏设计一个实体系统。许多人使用继承来做到这一点,但我偶然发现了标记 union ,并了解到您可以通过这种方式实现类似的结果,因为虚拟函数对于游戏来说很慢(所以我从 Casey Mouratori 和 Jon Blow 那里听说,两位游戏开发者给了我很多灵感)。

struct Unit {
int type;
int hp;
union {
struct {
int kingID;
} soldier_data;

struct {
string name;
} king_data;
};
}

Jon Blow 避免使用他尚未发布的新语言 Jai 中的一些功能来使用虚拟函数,因此上面的示例是我唯一的想法。

例如,我可以只编写一个更新函数并使用类型来区分实体。这将是一个非常大的函数,但是我们避免使用虚函数。

我的游戏包含的东西可以说是士兵和树木。树是静态的,几乎什么也不做,所以我会为树实体编写另一个更轻的结构,以节省一些内存,并使用 union 来存储不同类型的树:

struct TreeEntity {    
Texture* texture;
union {
struct {
int height;
} pineTree_data;
struct {
string name;
} coconutTree_data;
}
}

我面临的问题是,如果士兵和树木都可点击怎么办?如果我使用了继承,我会简单地拥有一个函数 Entity* selectEntity(),并在之后检查实例类型,但采用我的方法,我有点迷失了。

我的方法不好吗?我应该坚持使用虚拟函数还是有办法处理这个问题?

最佳答案

您询问如何创建一个通用的 Entity* selectEntity() 函数,该函数可以返回 Unit* 或 Tree*(或者可能是其他东西)。

您可以通过返回基类指针来做到这一点。 Unit 和 Tree 继承自 Entity,Entity 可以包含一个小的枚举,例如:

enum class EntityType : uint8_t {
Unit, Tree, // ...
};

如果您不想使用继承,则可以在每种类型的实体中使用成员变量的公共(public)初始子序列,如下所示:

struct Unit {
EntityType type;
// ...
};

这相当于内存布局方面的继承版本,您可以从 selectEntity() 返回 EntityType*,它实际上指向 Unit 或 Tree 的第一个成员。

关于c - 设计实体系统时如何避免 C 中的虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53259403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com