【问题标题】:CoreData: Large quantity of entities or store an array as Transformable?CoreData:大量实体或将数组存储为可转换的?
【发布时间】:2012-09-08 06:00:38
【问题描述】:

我正在制作一个游戏,其中每个生物都可以进行 3 次攻击,并且每次攻击可以同时产生多种效果。我正在使用 CoreData 来保存所有数据。

可以通过三个实体看到我的问题的基本示例:

  1. Creature:包含与 Attack 实体的一对多关系
  2. Attack:包含与 Effect 实体的一对多关系
  3. Effect:包含效果的详细信息(伤害、迷惑、毒药等)

因此,我需要为每个唯一的 Creature 实体创建三个唯一的 Attack 实体。然后我需要将Effect 实体添加到每次攻击中。我的问题是每个效果可以有不同的价值,但它与所有其他生物的效果基本相同:仍然是“伤害”,但伤害的价值因每个生物而异。

我想到的只有两种方法:

  1. 为每个Attack 为每个Creature 创建一个唯一的Effect,这样我可以将效果值存储在实体中。这样做的缺点是数据可能会变得很大:3x3x400 = 3,600 Effect 实体,每个实体仅存在一个关系。

  2. 为每种类型(损坏、混乱等)创建一个 Effect,并在 Attack 实体中使用可转换数据类型,我在其中存储了包含每个 Effect 实体标识符的字典数组(以便它们可以在需要时找到)以及该效果的价值。这可以由NSCoding 自动轻松处理,并将Entity 对象的数量从 3,600 减少到大约 20。

EffectAttack 实体很少被访问(仅当该生物在战斗中时),我不需要在其中搜索,因此我认为这不会对性能产生明显影响。我还在许多网站上看到他们建议不要在 CoreData 中存储数组和字典。有没有其他方法可以做到这一点?如果没有,什么选择会更好?

PS:抱歉,标题不详,我不知道该放什么。

【问题讨论】:

    标签: ios core-data nscoding


    【解决方案1】:

    如果你不打算改变你的效果类型,你可以拥有一个可以称为CreatureAttack 的实体,其中每一行完全指定了生物攻击的效果。这些列可能是:Creature 的外键、AttackDamageConfusePoison 的外键等。对于每个效果列,一行将具有此效果的值攻击和生物。

    该实体最多只有#Creature x #Attack 行,您只需拉出一行即可了解有关生物攻击的所有信息。

    否则我认为解决方案 1 更简洁,拥有几千行的性能影响应该可以忽略不计,特别是如果您在 Creature 外键上放置索引和/或在 Creature 和 @987654331 上放置复合索引@外键(iOS5支持)。

    【讨论】:

    • 我没有想过这种方法。这里的问题是,如果我想添加一种新的效果类型,我必须更新核心数据模型。然而,在游戏的整个生命周期中,效果可能不会发生太大变化,所以这个选项可能是可行的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2021-09-11
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多