0

我有一个有多个实例变量的类。我想通过课堂实现两个目的。我可能只将一些变量用于一个目的,有时同时使用两者。

这是一个更具体的例子。我想创建一个类,每次用户点击屏幕时,都会出现一个带有动画的狗精灵和猫精灵。如果再次点击,它们将继续执行不同的动画。但是,有时我只希望狗精灵出现和更新。在其他一些罕见的情况下,我希望在狗精灵出现后点击几下后猫精灵出现。

问题是:实例变量是否分配了太多内存?我非常关心性能,因为我正计划制作一款内存密集型游戏。由于很难预测我何时实际使用所有实例变量,我应该将它们分为两类吗?让我们划分可能的场景以获得更好的想法。

  1. 只有 Dog Sprite 被使用并且 cat sprite 永远不会出现:如果 cat 的实例变量留在一个类中,则保持不变。

  2. 狗精灵首先出现,然后猫精灵随后出现:两个精灵最终都会出现。可以分为两类,但有些方法是重复的,因为触摸推进逻辑和动画等方法是相似的。但是如果我们把它放在一个类中,可能会出现场景 1,这可能会在没有大量重复代码的情况下解决。

可能会发生其他事情,但问题已经在上面讨论过。从我的角度来看,这些是利弊:

  1. 一类方法

    • 避免一些重复的逻辑
    • 无需导入多个导致某些类似实例变量的标头

    • 骗局

    • 可能保留一半的实例变量未使用(包括 NSString、CCSprite、大量整数和浮点数、CCAnimation、CCLabelBMFont)
  2. 两级方法

    • 更少的实例变量
    • 以后可能继承类而不继承一些不必要的变量

    • 骗局

    • 部分逻辑复现

很难决定我应该使用哪个选项。任何建议都会很棒!先感谢您!

if (didHelp) 
   for (int x = 0; x < 100; x++)
      NSLog(@"Thanks!");
4

3 回答 3

6

我非常关心性能

您和其他数以千计的缺乏经验的开发人员。说真的,您最有可能遇到两件事:

  1. 您的想法不成比例,再多的性能优化都无法使其发挥作用->改变您的想法
  2. 性能一点也不重要,你只是在浪费时间

性能是游戏开发者在项目开始时需要考虑的最不重要的事情之一。

为什么?

案例#2 是不言而喻的。

在您开始之前以合理的准确性评估案例 #1 需要经验。即使那样也很困难。如果功能 X 被证明在技术上太具有挑战性(或不可能),只需制定一个备用计划。如果您无法评估性能,并且您的想法不适用于任何备份计划,那么您还有两种选择:

  1. 实施不同的想法
  2. 创建一个快速原型以找出峰值性能参数:内存使用率、CPU 和 GPU 使用率、加载时间以及任何其他适合性测试,以便在几天(如果不是几小时)内确定您的想法是否可行。

实例变量是否分配了太多内存?

不,分配的内存与性能关系不大。

您可以使用class_getInstanceSize来查看类实例使用了多少内存。一个类实例很少会使用超过 500 字节。但是,这仅计算为实例变量分配的内存 - 而不是实例变量可能指向的内存。在 cocos2d 应用程序中,可以公平地说 95% 的内存使用将来自纹理。

很难决定我应该使用哪个选项

始终努力:

  • 编写可读代码
  • 编写可维护的代码
  • 少写代码
  • 编写更安全的代码
  • 只写一次代码(避免重复)
于 2013-03-23T00:28:58.140 回答
0

EmbodiedD,你这里肯定是顾虑太多了。在大多数应用程序中,堆会变得非常大。一个简单的类将是无关紧要的。当您拥有 1000 个数据密集型类的实例时,您可能不得不开始考虑分析。如果您担心组织,那完全是另一回事。如果您使用 var1 和 var2 加载 classA 或使用 var1 加载 classA 并使用 var2 加载 class2,则更多的是如何教您进行抽象。

于 2013-03-23T00:07:34.373 回答
0

这是一个有点开放式的问题,有很多方法可以解决这个问题。因此,这是我的方法,可能适合也可能不适合所有场景。

在某些情况下可以替换实例变量 - 但是如果必要的话,这不会影响您的决定。需要时应使用实例变量。不要为了替换单个实例变量而执行无休止的计算。当在某个范围之外不需要时,请尝试将您的实例变量限制为变量。感谢在这里发布的信息丰富的用户,实例变量在如此微观的范围内留下了未使用的影响性能,您不必担心。

从我的角度来看,一个类应该只关注一个焦点——功能,并且应该将任何其他信息传递给需要它的其他类。信息应该保持封装——一个功能是在其他项目中保持可重用性。

应该关注功能的关系。IT-IS 是说一个对象应该继承另一个对象的关系。实际上,它就像 Sienna-IS 一辆汽车。船——是一种交通工具。因此,这些对象应该从它的超类继承任何信息。相反,IT-HAS 说这些类包含一些不能被继承的东西,通常是质量或组件。赭色 - 是汽车,但轮胎 - 不是 - 赭色。相反,赭色有轮胎。

另一个重要的关系是委托。花哨的定义说它代表另一个人执行一项任务,就像美国的代表如何代表他们的州人民一样。基本上,它向其他班级传递了一定的信息,谁应该在良好的实践中,不影响其他以前的班级。班级不应该确切地知道它传递给谁,但知道足以传递某些信息。这种不知道委托的确切身份的过程称为耦合。

就我而言,对于猫和狗,委托和 IT-IS 是主观上最好的答案。你的意见可能不同。基类应包含 Cat 和 Dog 共享的所有信息。任何其他需要的信息,例如精灵的位置,都应该作为委托传递给其他类。根据我写的内容,在正常情况下,一个类不应该被编程为执行两个功能;为一个班级做一个功能,并将所有其他尽职尽责的需要传递给另一个。

于 2013-03-23T01:11:18.203 回答