有很多类会在java中恶化性能吗?

时间:2017-11-01 01:47:36

标签: java performance javafx

所以我试图使用 javafx (类似于Hearthstone)制作CCG类型的游戏,我想知道是否有一个类是非常糟糕的想法每张卡片,因为我做了一些研究,大多数粉丝制作的Hearthstone纸牌游戏都使用JSON来获取卡片对象。例如,如果游戏中只有4张名称为

的牌
  • DragonMaster
  • 火神
  • 海盗
  • 查克诺里斯

    我有4个类,分别是名字。现在我虽然这是必要的,因为每张卡都有自己的行为,这意味着一张牌在召唤时可能会做一些事情,在这种情况下,我有一个被调用该行动的方法,而其他人可能有其他方法或根本没有。

现在你可以说,如果你在游戏中有100张牌,那么课程的数量也会变大(而且这只是卡片包,因为我使用的是MVC模型,如果没有我意识到,这个项目真的很大。)

其他一些信息:

  • 所有具体的卡类(例如Vulcan)都会扩展一个抽象的类,其中包含名称和费用等字段。

  • 在模型中的卡片包中,我有两个其他包,然后才有实际的课程,一个用于仆从,另一个用于法术。

此外,如果我没有为每张卡片上课,我如何实例化一张新的特定卡片以添加到该播放器的手中?是否有一个不同的解决方案#34;类丰富"问题,这实际上会影响游戏运行时的性能,甚至是jar文件中的空间吗?

如果有人可以回答我的问题或任何形式的帮助,我将非常感激。

2 个答案:

答案 0 :(得分:1)

拥有数千个课程不会以任何明显的方式影响绩效。您甚至可以提前预编译它们或缓存它们。

也就是说,许多游戏引擎使用实体组件方法来表示游戏实体,并将效果保持为不同的功能。 通过这种方式,您可以结合使用单一继承无法实现的不同效果卡。

以下是描述该方法的链接。

https://en.wikipedia.org/wiki/Entity%E2%80%93component%E2%80%93system

你可以逐渐适应这一点。 例如,您的卡可能只是一种实体。

class Card {
   int mana;
   String name;
   Effect[] effects;
   Trigger[] triggers;
}

效果可能是作用于游戏区和当前卡片的代码片段。

interface Effect {
    void affect(Playfield pf);
}

触发器可以是与卡相关的事件侦听器。 即当对手打牌时,可能会触发一个触发器。

答案 1 :(得分:0)

我不是这个领域的专家,但我认为虽然你的方法可行,但它可能会使可维护性和扩展性变得更加困难。

您可以尝试的另一种方法是将卡的特征存储在数据库(或某种属性文件)中。在这种情况下,您只需要一个公共Card类,并从数据库加载其值。

class Card {
    int id;
    String name;
    int cost;
    int speed;
    OnSummonEffect summonEffect;
}

interface OnSummonEffect { ... }

abstract class StatBoostEffect implements OnSummonEffect { ... }

class AttackBoostEffect extends StatBoostEffect { ... }

卡表

CardID        Name        Cost    Speed              SummonEffect
  1       DragonMaster      5       10       com.foo.bar.AttackBoostEffect
  2       Vulcan            3       12       com.foo.bar.SomeSummonEffect

虽然保存类名可能听起来不太优雅(并且它可能有其自身的副作用),但这种方法可以轻松添加新内容。

添加新的卡片类型只是向数据库表中添加一个新条目,并可能添加新的"效果"上课到项目。如果您决定将某些属性(或添加新属性)更改为卡,则只需在数据库表中添加/更改列,然后再添加/更改单个Card类。如果您为每种卡类型创建了一个类,则必须更改基卡,然后更改每个卡类。