gpt4 book ai didi

c++ - 像 C++ 一样编写高效的实体系统

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:49:01 26 4
gpt4 key购买 nike

我正在尝试用 C++ 制作一个高效的“实体系统”,我在互联网上阅读了很多博客/文章/文档以获取大量信息,但我又遇到了一些问题。

我发现了两个有趣的主题:

  • 数据驱动系统
  • 实体组件系统

对我来说,这两个系统看起来非常相似。

所以,我找到了 Adam Smith 的这个例子:https://stackoverflow.com/a/2021868

我需要一个像这样灵活的系统:

// Abstract class
class Component
{
// data here
}

// exemple
class Car : public Component
{
// Data here
}

// Entity with components
class Entity
{
std::vector<Component*> components;
}

因此,如果我的实体具有以下组件:Car、Transform、Sprite,我的组件阵列是否会像数据驱动系统那样具有线性数据?

现在,我有系统:

class System 
{
virtual void init();
virtual void clear();
virtual void update();

std::unordered_map< const char*, Entity*> entities;
}

class RendererSystem : public System
{
// Methods's definition (init, clear, …).

void update()
{
for( entity, … )
{
Sprite* s = entity->getComponent('sprite');
...
}
}
}
  • 我读到虚函数很糟糕,在那种情况下它很糟糕吗?
  • 获取组件需要一个 static_cast,这不好吗?
  • 在数据驱动系统中,我到处都看到指针,“原始”变量在哪里,我需要在任何地方都放新的,否则我会有一个包含相同数据数组的类?
  • 我做对了吗?

所有这些点在我看来都“模糊”了。

最佳答案

  1. 虚函数确实有一些开销,但除非您每秒进行数百万次调用,否则您无需关心,所以请忽略这一事实。
  2. 静态转换本身并不坏,但它会在使用它的地方破坏静态类型检查,因此如果您可以将行为移动到您转换的对象内,这样您就可以调用适当的方法而不必知道特定的运行时对象的实例则更好
  3. 不清楚你在问什么,即使你在数据驱动方法中有元素 vector ,集合中的每个元素都需要分配一个new(如果它是一个指针) .一旦你分配了它,你就不需要再做一次,只要你将引用传递给周围的项目

关于c++ - 像 C++ 一样编写高效的实体系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13731839/

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