0

背景:

私が設計しているものについて、2D 配列内の要素を参照する正しい方法について、友人と話し合っています。PointXNA のおよびVector2構造体を配列参照として使用することに不満を感じていXましYた。

これらの構造体を作成し、独自のプロパティ and を呼び出しArrayPointました。私の友人は、これは非常に時間の無駄だと思っていますが、私はとの参照を交換するのは好きではありません。なぜなら、私の数学のバックグラウンドから、行列に i と j を使用するように教えられてきたからです。たとえば、の代わりに を使用します。ArrayVector2IJXYmyArray[i, j]myArray[y, x]

この状況に対処する最善の方法は何ですか?

単純に x と y を入れ替えただけですか? または、好きなように処理する独自の構造体を作成しますか? とにかくこれはほとんどすべて恣意的なので、それはすべて個人的な好みにかかっていますか?

4

3 に答える 3

2

あなたの友人に聞いてください!

これが悪い考えである理由はたくさんあります。

  • あなたの数学のバックグラウンドは、と言うかもしれませij。ただし、2D 空間にマップされる配列 (例: マトリックスではなくタイル マップ) の場合xyコードを理解しやすくするセマンティックな意味を伝えるため、実際には好ましいものです。(つまり、I と J ではなく、X と Y 軸があります)。

  • (通常、よりセマンティックな意味を持つケースではijとにかくインデクサーを構造体に格納することはありません - それらは一時的なローカルになります。)

  • 純粋な理由がなければ、コードを増やすよりもコードを減らす方が常に望ましいです。コードの作成とテストには貴重な時間がかかります。他の人のコード (組み込みの XNA 型など) を使用すると、時間を節約できます。

  • ある日、Point. の 2 つのバージョンがPointある場合、その関数の 2 つのバージョンになる可能性があります。より多くのコードと、さらに悪いことに: 重複したコード!

  • 「ここで発明されていない」というのは、プログラマーとして身につけるべき、本当に、本当に、本当に悪い習慣です。他の人のコードと一緒に暮らすことを学びましょう (それが機能する限り - この場合は機能します)。

  • 他の誰もこれをしません。あなたのコードは、それを操作しようとするすべての人を混乱させ、困らせるでしょう。

  • 小さなパフォーマンス ヒットが不必要にコピーされます。(さらに、パフォーマンスにわずかな影響を与える他のいくつかの難解な事柄。)

(また、Vector2(浮動小数点)で配列にインデックスを付けるのはちょっと変です。)

于 2012-08-16T06:21:57.673 に答える
1

データを XNA ライブラリ メソッドに渡すには、構造体との間で変換する必要があるため、個人的な好みには依存しません。確かに非常に小さい変換コストが発生しますが、ループで繰り返し実行すると、合計するとかなりの額になる可能性があります。

確かに、SpriteFont.MeasureString() が幅と高さではなく、X と Y のメンバーで構成されるデータ構造を返すのはばかげていますが、奇妙さと戦おうとするよりも、奇妙さに対処する方が簡単です。

私のアドバイスは、 x と y をインデックスとして使用して、追加のオーバーヘッドを回避することです。

于 2012-08-15T18:55:20.640 に答える
0

あなたのしていることは問題ないと思います。私がそれに対してアドバイスするのは、かなりの複雑さを追加している場合だけです。ご存知のように、多くの計算やグラフィックスを処理する必要がある XNA ソフトウェアやその他のソフトウェアは、効率が悪いとわずかな変更で本当に行き詰まる可能性があります。ただし、あなたがしていることはあなたを助けるだけであり、複雑さを加えるべきではありません. 私はそれのために行くと思います。

于 2012-08-15T18:54:31.343 に答える