0

複数のインスタンス変数を持つクラスがあります。クラスで2つの目的を達成したい。1つの目的で一部の変数のみを使用し、場合によっては両方を使用する可能性があります。

より具体的な例を次に示します。ユーザーが画面をタップするたびに、犬のスプライトと猫のスプライトがアニメーションで表示されるクラスを作成したいと思います。もう一度タップすると、別のアニメーションを実行し続けます。ただし、犬のスプライトのみを表示して更新したい場合があります。また、まれに、犬のスプライトが表示された後、数回タップした後に猫のスプライトが表示されるようにしたい場合もあります。

問題は、インスタンス変数が割り当てすぎるメモリが多すぎるかどうかです。私はメモリを大量に消費するゲームを作ることを計画しているので、パフォーマンスに非常に関心があります。実際にすべてのインスタンス変数をいつ使用するかを予測するのは難しいので、それらを2つのクラスに分割する必要がありますか?より良いアイデアを得るために、考えられるシナリオを分割してみましょう。

  1. Dog Spriteのみが使用され、cat spriteは表示されません。1つのクラスに残された場合、catのインスタンス変数は変更されません。

  2. 犬のスプライトが最初に表示され、次に猫のスプライトが後で表示されます。両方のスプライトが最終的に表示されます。2つのクラスに分けることは可能ですが、タッチアドバンスロジックやアニメーションなどのメソッドが類似しているため、一部のメソッドが重複しています。しかし、1回のクラスのままにしておくと、シナリオ1が発生する可能性があります。これは、多くの重複コードを再現しなくても解決できる可能性があります。

他のことが起こる可能性がありますが、問題はすでに上で説明されています。これらは私の観点からの賛否両論です:

  1. ワンクラスアプローチ

    • プロ
    • 重複するロジックを避ける
    • 同様のインスタンス変数につながる複数のヘッダーをインポートする必要はありません

    • コン

    • おそらく、インスタンス変数の半分を未使用のままにしておきます(NSString、CCSprite、多くの整数と浮動小数点数、CCAnimation、CCLabelBMFontを含む)
  2. 2クラスアプローチ

    • プロ
    • インスタンス変数が少ない
    • 将来、不要な変数を継承せずにクラスから継承する可能性があります

    • コン

    • 一部のロジックが再現されています

どのオプションを使うべきか決めるのは難しいです。どんな提案も素晴らしいでしょう!前もって感謝します!

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

3 に答える 3

6

パフォーマンスがとても気になる

あなたと他の何千人もの経験の浅い開発者。真剣に、あなたが経験する可能性が最も高い2つのことがあります:

  1. あなたのアイデアは釣り合いがとれておらず、いくらパフォーマンスを最適化してもうまくいきません -> あなたのアイデアを変えてください
  2. パフォーマンスは少しも重要ではなく、単に時間を無駄にしました

パフォーマンスは、ゲーム開発者がプロ​​ジェクトの開始時に考慮する必要がある最も重要でない事項の 1 つです。

なんで?

ケース #2 は自明です。

ケース 1 を始める前に妥当な精度で評価するには、経験が必要です。それにしても難しい。機能 X が技術的に難しすぎる (または不可能である) ことが判明した場合は、バックアップ計画を立ててください。パフォーマンスを評価できず、アイデアがどのバックアップ プランでも機能しない場合は、次の 2 つのオプションがあります。

  1. 別のアイデアを実装する
  2. 簡単なプロトタイプを作成して、メモリ使用量、CPU と GPU の使用率、読み込み時間、および数時間ではないにしても数日以内にアイデアが実現可能かどうかを判断するために適切と思われるその他のフィットネス テストなど、ピーク パフォーマンスのパラメーターを見つけます。

インスタンス変数はあまりにも多くのメモリを割り当てますか?

いいえ、割り当てられたメモリはパフォーマンスとはほとんど関係ありません。

class_getInstanceSizeを使用して、クラス インスタンスが使用するメモリ量を確認できます。クラス インスタンスが 500 バイト以上を使用することはめったにありません。ただし、これはインスタンス変数に割り当てられたメモリのみをカウントします。インスタンス変数が指すメモリはカウントしません。cocos2d アプリでは、メモリ使用量の 95% がテクスチャによるものであると言っても過言ではありません。

どのオプションを使用するかを決定するのは難しい

常に次のことに努めます。

  • 読みやすいコードを書く
  • 保守可能なコードを書く
  • 少ないコードを書く
  • より安全なコードを書く
  • コードは一度だけ書く (重複を避ける)
于 2013-03-23T00:28:58.140 に答える
0

これはいくぶん自由回答形式の質問であり、この質問に取り組む方法は無数にあります。したがって、これは私のアプローチであり、すべてのシナリオに適合する場合と適合しない場合があります。

インスタンス変数を置き換えることができる場合がありますが、必ずしも必要な場合は、これが決定に影響することはありません。インスタンス変数は、必要に応じて使用する必要があります。単一のインスタンス変数を代入するためだけに無限の計算を実行しないでください。特定のスコープ外では必要ない場合は、インスタンス変数を変数に制限するようにしてください。ここに投稿した有益なユーザーのおかげで、インスタンス変数は、心配する必要のないような微視的なスケールで未使用のインパクト パフォーマンスを残しました。

私の観点からは、クラスは 1 つの焦点のみを持つべきであり、機能にのみ焦点を当て、それを必要とする他のクラスに他の情報を渡す必要があります。情報はカプセル化されたままである必要があります。他のプロジェクトでの再利用性を維持するための 1 つの機能が必要です。

関数の関係に注目する必要があります。IT-IS は、あるオブジェクトが別のオブジェクトを継承する必要があるという関係です。実際には、シエナ-ISのような車です。ボート - 乗り物です。したがって、これらのオブジェクトはそのスーパークラスから情報を継承する必要があります。対照的に、IT-HAS は、これらのクラスには、通常は継承できない品質またはコンポーネントの何かが含まれていると述べています。シエナは車ですが、タイヤはシエナではありません。むしろ、シエナにはタイヤがあります。

もう 1 つの重要な関係は委任です。派手な定義では、米国の代表者が州の人々を代表するのと同じように、別の人に代わってタスクを実行すると言います。基本的に、他のクラスに影響を与えるべきではないという特定の情報を他のクラスに渡します。クラスは誰に渡すかを正確に知る必要はありませんが、特定の情報を渡すには十分な情報を知っている必要があります。デリゲートの正確な ID がわからないこのプロセスは、カップリングと呼ばれます。

私の場合、猫と犬のうち、IT-IS を伴う委任が主観的に最良の答えです。あなたの意見は異なるかもしれません。基本クラスには、Cat と Dog が共有するすべての情報が含まれている必要があります。また、スプライトの位置など、必要なその他の情報は、デリゲートとして他のクラスに渡す必要があります。そして、私が書いたことに基づいて、通常の状況では、クラスは 2 つの機能を実行するようにプログラムされるべきではありません。クラスのために、ある機能を実行し、他のすべての忠実なニーズを別の機能に渡します。

于 2013-03-23T01:11:18.203 に答える
0

EmbodiedD、あなたは確かにここで心配しすぎています。ほとんどのアプリケーションでは、ヒープがかなり大きくなります。1 つの単純なクラスは関係ありません。データ集約型クラスのインスタンスが 1000 個ある場合、プロファイリングについて考え始める必要があるかもしれません。組織について心配している場合、それはまったく別のことです。classA を var1 と var2 でロードするか、classA を var1 で、class2 を var2 でロードする場合は、抽象化をどのように教えられたかが問題になります。

于 2013-03-23T00:07:34.373 に答える