2

私は現在ゲームプロジェクトに取り組んでいます。C++でエディターを開発するのは時間がかかるため、C#でエディターを開発しています。効率を上げるために、エディターの主要言語としてC#を使用し、結果をすばやく取得します。

ただし、C ++で読み取ることができるC#オブジェクトを作成するC#でゲームエディターを作成したり、C++で使用できるC++オブジェクトを作成するC#でゲームエディターを作成したりすることはできますか?

これは、C#がRAD環境であるため、Windowsアプリケーションの開発が迅速であるためですが、C ++/DirectXはおそらくゲームに最適な環境です。

どちらも.NETFrameworkの一部であるため、この2つを組み合わせる方法はありますか?

4

3 に答える 3

2

過去に、C++/Cli を使用して C# から C++ オブジェクトを作成することに成功しました。基本的に、c/c++ (アンマネージド) オブジェクトをロード/作成する C++ (マネージド) ライブラリを作成できます。このマネージド ライブラリは、マネージド (c#/vb) ライブラリ/アプリケーションから使用できます。次の点に注意してください。

  • C++/cli は特定のプラットフォーム (x86/x64) 用にのみビルドできるため、それに応じてマネージ エディターをビルドする必要があります。
  • Microsoft がこのシナリオをあまり好まない限り、Visual Studio 2012 は C++/cli のインテリセンスをサポートしていません。

また、COM と p/invoke も実行可能な代替手段です。

于 2012-11-12T15:26:54.310 に答える
1

C# と C++ の間 (またはマネージ言語とアンマネージ言語の間) の通信は面倒であり、使用する非常に正当な理由がない限り、避けるべきです。

通信には、パイプ、WCF、COM、P/Invoke、およびその他のカスタム商用オプションを使用できます。そのためにネットを検索できます。私が取り組んだエンジンでは、複数のプロセスで共有される匿名の MemoryStream を使用しています。

しかし、常に問題として出てくるのは、C++ の構造上の変更については、C# に反映する必要があるということです。メソッドが取るパラメータや構造体の定義を変更した場合と同様です。C# を自動的に "型取り" して、常に C++ で最新の状態に保つための解決策はいくつかありますが、実装には費用がかかり、重くなります。

さて、なぜあなたは気にしないでください!確かに、ハイエンドの商用エンジンは C++ 以外にはありません。非現実的?C++. ソース?C++. クライシス?C++. C++ は、マネージ言語では提供できないパフォーマンスを提供するためです。また、メモリを直接制御し、オブジェクトの作成方法と消去方法をマイクロ制御することもできます。

では、なぜ気にしてはいけないのでしょうか?Assassin's Creed、Half-Life、または Skyrim のサイズまたは範囲のトリプル A ゲームを出荷する計画がない限り、XNA Framework の下の C# は十分なスペースとパフォーマンスを提供します。必要以上に。実際にパフォーマンスの問題がある場合は、マネージ言語が問題ではない可能性が高く、コードにはまだ多くの最適化が残っているはずです。C# でパフォーマンスの問題が発生した場合、C++ でも問題が発生する可能性があります。

XNA は、Windows、Xbox、およびさまざまな Microsoft ポータブル デバイスで出荷することもできます。その上、とにかく DirectX を使用すると、これらのプラットフォームに制限されます。

于 2012-11-12T15:14:33.577 に答える
0

C# から C++ オブジェクトを作成することは可能ですか?

直接ではありません。まず、P/Invoke を使用してコンストラクターを呼び出すことはできないと思います。常に特別な「コンストラクターラッパー」をエクスポートする必要があります。たとえば、次のようになります。

extern "C" {
    EXPORT_API YourClass* YourClassInstanceFactory()
    {
        return new YourClass();
    }
}

後続thiscallの s では、ライブラリをコンパイルするたびに変更される可能性のある装飾された名前をすべて追跡する必要があります。

C++ でラッパー ライブラリを作成して、externC ヘルパー関数が C# を介してプラットフォームで呼び出されるようにすることもできますが、これが追加する可能性のあるオーバーヘッドについてはよくわかりません。

もう 1 つの解決策は、C# で直接参照できる C++/CLI (CLR クラス ライブラリ) ラッパー ライブラリを作成することです。このアプローチの利点は、通常の C++ プロジェクトと同じ方法でネイティブ ライブラリを参照できることです。

于 2018-07-05T20:40:04.760 に答える