0

XNA でゲームのプログラミングを行っており、構築中に提供された保存された出力場所を使用してユニバーサル数学オブジェクトを作成しようとしています。

私の計画はコンストラクターでrefを使用することでしたが、最初の呼び出しを超えてオブジェクトにその参照を保持/保存する方法がわかりません...

public MathObject(ref float OutParam)
{
    Out = OutParam; // This obviously won't do what I want... But it's where I'd like to do it.
}

更新では、入力を記述し、製品に保存された出力場所を変更させたいと思います。

foreach (MathObject MatOb in MathList)
{
    MatOb.Update(time);
}

アイデアは、コード全体で使用するモジュール式の数学ツールを作成し、作成時に、更新時に (再参照せずに) 変更する既存のオブジェクト パラメーター (「出力」) にそれを指示することでした。これにより、単一のループがツールのすべてのインスタンスに指示して、与えられた出力を変更できるようになることが期待されていました。

私が理解しているように、c ++では、変更するパラメーターのアドレスを数学オブジェクト内に保存し、更新でこれを使用して、その場所のメモリを指して変更することで可能です。

安全でないコードを使用せずに c# で同様のことが可能ですか?

安全でないコードは常に避けるべきですか?

編集:

- 使用目的 -

調整可能な「設定して忘れる」出力場所を持つオブジェクトを作成できるようにしたいと思います。

たとえば、ゲーム インターフェイス内で動作する単純なベジェ カーブ エディターを作成しました。特定の曲線が常に特定のパラメーター (文字の位置など) を調整するように、コードで出力の場所を設定できますが、インターフェイス内で出力が接続されているものも変更するとよいでしょう。

特定のアプリケーションは、主にゲーム内編集用です。エディターが自己完結型の場合に最も実用的であることは理解していますが、これは限られた、ゲーム コンソールに適した編集機能のためのものです (堅牢性は劣りますが、原理的にはリトル ビッグ プラネットの編集機能に似ています)。

私のバックグラウンドは 3D デザインとアニメーションであるため、多くのノードベースの編集システムでの作業に慣れています。さまざまなユーティリティ ノードを作成し、入力と出力を調整して、シェーディング、リギング モデルなどのパラメーターを駆動します。これをゲームで再作成しますが、ゲーム内の限られた編集機能に特定の原則を適用して適用することに興味があります。最善のトラブルシューティングを行うだけです。

返信ありがとうございます。

4

3 に答える 3

0

必要なのはオブザーバーのデザインパターンだと思います。数学オブジェクトの更新に関心のあるアイテムは、avent(ie MathObjectChange)を登録し、適切に反応します。

于 2012-07-27T08:37:29.700 に答える
0

安全でないコードなしでC#でこれを行う方法はわかりませんが、安全でないコードを使用せずにこのソリューションで問題に絶対に取り組む必要がある場合は、メモリマップトファイルがお勧めです。それでも、これらは.NET 4.0まで.NET開発に使用されておらず、このオプションがパフォーマンスの面で安全でないコードとどのように比較されるかはわかりません。

于 2012-07-27T08:31:53.003 に答える
0

C# でこれを行う方法は、get/set デリゲートのペアを使用することです。この便利なヘルパー構造体を使用して、それらを保存できます。

public struct Ref<T>
{
    Func<T> get;
    Action<T> set;

    public Ref(Func<T> get, Action<T> set)
    {
        this.get = get;
        this.set = set;
    }

    public T Value { get { return get(); } set { set(value); } }
}

次のようなクラスがあるとします。

class Foo { public float bar; }

次のように使用します。

Foo myFoo = new Foo();
Ref<float> barRef = new Ref<float>(() => myFoo.bar, (v) => myFoo.bar = v);

// Ta-Da:
barRef.Value = 12.5f;
Console.WriteLine(barRef.Value);

(ここでコードを実際にテストしていないことに注意してください。概念は機能し、以前はうまく使用できましたが、頭のてっぺんからこれを入力して構文を台無しにした可能性があります。)

この質問は XNA でタグ付けされているため、パフォーマンスについて簡単に説明する必要があります。

  1. おそらく、これは同等のメモリ アクセスよりも 1 桁ほど遅く実行されることがわかるでしょう。そのため、タイトなループには適していません。

  2. これらのものを作成すると、メモリが割り当てられます。これは、いくつかの理由から、パフォーマンスにとって非常に悪いものです。したがって、描画/更新ループ内でこれらを作成しないでください。ただし、ロード中は問題ありません。

そして最後に、これは単純にプロパティに直接アクセスするよりも醜いので、可能な場合はこれを使用しないようにできる限りのことを行ってください。

于 2012-07-27T09:06:27.727 に答える