• 締切済み

C++/CLI環境でのOpenGLゲーム開発の是非

こんにちは。さっそく質問させていただきます。 C++でOpenGLを用いたゲーム開発は一般的ですが、C++/CLIでのゲーム開発はあまり一般的ではないように思えます。これは邪道なのでしょうか? 私は現在OpenGLで個人的にゲーム開発をしています。それに関連するちょっとしたアプリケーションを作ろうと思い、CLIに手を出した(.Net系言語経験はありません)次第なのですが、これが非常に便利なので気に入りました。 そこでゲーム本体もCLIで開発してみたいと思ったのですが、最初に書いたとおり、これは邪道なのでしょうか。私がそう感じたのは、C#やJavaに関する情報は山ほどあるのに、CLIに関する情報はそれと比べると遥かに少ないからです。ましてやOpenGLと組み合わせているサイトは数える程しかありませんでした。 おそらくCLIがC#や新しいC++/CXに埋もれていたり、MSがCLIを非推奨にしたことや、通常のゲームでは.Netの機能が不要なことが理由なのだとは思います。そういう理由なら私はあまり気にしないのですが、もしCLI環境で開発することによって何らかの致命的な不具合が生じる恐れがある(Windowsに限定されるというのは気にしません)なら、検討し直さなければなりません。 具体的にどういうものかは思いつかないのですが、例えばネイティブコードに劣っている点があるとか、ネイティブで出来ることが出来ないとか…。 要領を得ない質問・分かりにくい文章で申し訳ございません。 ご存知の方、どうかご教授いただきたいです。

みんなの回答

  • axsies
  • ベストアンサー率64% (38/59)
回答No.1

私の意見としては、「C++/CLIの利用価値はグルー言語以外にないから」ですね。 実際、.NETでメインを張る言語として使うにはC#に比べてかなり貧弱です。 まず、用意されてる構文が.NET 2.0相当の最小限のものだけです。 匿名メソッドや、イテレータブロック、LINQ式みたいなものはありません。 プロパティ定義も、C#の int MyValue { get; set; }みたいな、略記構文もありませんし。 .NETのライブラリは名前空間の階層が非常に長くなりがちです。 ですが、C++のヘッダにusing宣言を書くことはできません。 そのため、ソース側のあちこちでusing宣言書かなければならなかったり、直接System::hogehoge::mogemoge::function()みたいな書き方をしなければなりません。 非常に読みづらいコードになりがちです。 デバッグも非常にやりづらい。 VSのデバッガはネイティブ/マネージ混在モードというのがありますが、これがまた結構使いづらくて、 ネイティブモード中ではマネージコードの変数を見ることが出来ず、逆もしかりです。 IDEエディタのコーディング支援もあまりありません。 マネージコードの数値計算はピュアなC++の10倍くらい遅いです。 ゲームロジックの数値計算(キャラやカメラのマトリクスを計算など)くらいはマネージコードでも十分ですが、 下回りのヘビーな計算(パーティクル、当たり判定処理、etc...)を書くには荷が重いケースが殆どです(当然、ゲームで求められるものによりますが)。 だからこそ、ネイティブコードでSIMDを使った計算や、ポインタベースでメモリアーキテクチャを配慮した高速化を書きたいわけですが、 混合アセンブリ中では肝心のSIMDやそれに関する型が使えません。(__m128型とか) 更に、ネイティブコードとマネージコード間では型変換が必要なので、 これをかなり巧く設計しなければパフォーマンスに影響を与えます。 ここがボトルネックになると、ネイティブコードを書くメリットが薄れてしまいます。 あげれば切りが無いのですが、結局こうした事情に加えて、実績のなさと資料の少なさがとどめを刺し、 「C++/CLIはネイティブコードのラッパーにとどめておいて、ゲームロジックはC#使った方が便利じゃん」 もしくは、 「ラッパー作るのめんどくさい!C++一本で作った方が楽だ!」 みたいなことになるわけです。 以上が私の所感ですが、まあ、やはりご自身で簡単なゲームかなんかを作ってみて判断するのが最良です。(無限湧きする敵をひたすら打ち落とすだけのシューティングとか、モデルビューワーとか) 言語は所詮プログラムを作るための道具ですので、 ご自身の目的を達成するのにこの言語は十分使える、と判断して使うのであればそれが王道ですし、 「誰も使ってないから」とか、他人が「アレは○○だからダメだ」と言っていた、という理由で使わないのであればそれは邪道です。 どのようなスタンスに到達しても、ご自身の経験としてマイナスになることはないかなあ、と思います。

関連するQ&A

  • C、C++でのゲーム開発

    スクエニやコーエーなどのゲーム会社が使用している開発言語はCやC++と聞きました。(PS2など) そこで興味本位でCを勉強してみようと思ったのですが、ゲームの開発でCが選ばれている理由の一つに、Cは.NET Freamworkを通さないというのが大きな理由であると聞きました。 現在私はVisual C++というソフトを使用しているのですが、どうもこれは.NET Freamworkを使用しているようなことが書かれていました。(何か解釈を間違っているかもしれませんが) そこで一度疑問を整理しようと思い、質問させていただきます ゲームの開発言語としてC系が多く選ばれている理由は何でしょうか?(オブジェクト指向言語が選ばれない理由) また、ゲーム会社はどのような環境で開発を行っているのでしょうか?(Visual C++など.NET Freamworkを介するようなソフトは使用しないのでしょうか?) 以上です、お願いします。

  • C++/CLIについて

    現在C、C++を1部、WIN32を習得しているのですが、ウィンドウアプリケーションを作るときは全てWIN32APIを使用して作っています データベースを使ってみようと思い、VS2005(Pro)についていたSQLEEを使ってみようと色々と調べたんですが、ほとんどの書籍やサイトがVBかC#を使用していました しかし、VBやC#でプログラムを書き直すのも大変なのでどうしようかと思っていたらC++/CLIなるものの存在を知りました そこでC++/CLIの勉強をしてDBを使おうと思ったのですが、何分習得言語以外の知識が足りないため不安なところを質問させてください 以下質問 1、VB、C#、C++/CLIとC+WIN32の大きな違いは.NETFrameWorkが使えるか使えないかということであっていますか? 2、多くの書籍がVBやC#とDBを組み合わせているのは、.NETに含まれるADO.NETを使用するからですか? 3、C/C++を習得するとMFCを習得するのが一般的なようですが、MFCのメリットがイマイチわからないので教えてください(WIN32で十分代用可能なため) 4、C++/CLIを習得すればMFCは必要ありませんよね? 以上質問の数が多いですがよろしくお願いします

  • C++/CLIとC#の連携について

    いつも拝見させていただいております。 現在、C++/CLIとC#にて連携を行っているのですが、C++/CLIで作成したクラス配列 がC#側でどのようにすれば受け取れるのか方法がわかりません。 C++/CLIで作成しているクラス配列はSystem::Collections::Generic::Listを使用 して配列化しています。 下記がC++/CLIのソースになります。 List<testClass>^% testClass::GetList() { List<testClass>^ lpTestClassList = gcnew List<testClass>(); testClass^ lpTestClass; lpTestClass = gcnew testClass(); lpTestClassList->Add(lpWatchServiceMasterInfoWrapper); return lpTestClassList; } これをC#側で使用しようとすると下記エラーが発生します。  「この言語によってサポートされていません」 C++/CLI⇒C#間の連携ではListクラスを使用することは不可能なのでしょうか? クラスを配列にして引き渡したいだけなので、他の方法等含めて何か参考になることがありましたら ご教授ください。 よろしくお願い致します。 開発環境  C++/CLI ⇒ DLL(ネイティブなコードを参照するためのラッパー用DLL)  C# ⇒ アプリケーション

  • MFCとC++/CLIとの比較

    MFCを使ってプログラミングを今までやっていましたが、C++/CLIへ移行しようと思っています。 ただ、MFCとC++/CLIではプログラミングの自由度に差はあるでしょうか? ここでの自由度とは、思い通りの処理・機能を実現し易いかことです。 処理・機能に関しては具体的にはまだ決まってないので、一般的な話で構いません。 あと、主観で構わないのでMFCとC++/CLIとどちらが好みかも教えてもらえると幸いです。理由も聞かせてもらえるとベストです。 よろしくお願い致します。

  • 【VC++】MFC、C++/CLI(CLR)、C#の違い、及び、これからの展望

    いつも大変お世話になっています。 VC++初心者です。 VC++6.0(MFC)、VC++2005(CLR)(C++/CLI)(Express Edition)を 同時期に使い始めて何ヶ月か経ちました。 現在では、CLIの方が圧倒的に開発スピードが早く(扱いやすい)、 逆に、MFCの開発スピードが遅く(扱いにくい)、イライラしっぱなしです。 (CLIの開発では、WEBにあるC#のコードを参考にしながら、  コーディングしています。) そこで、何点か疑問に思ったので、ご回答頂けませんでしょうか。 (1)CLIとC#を区別した理由は何なのでしょうか。 (2)MFCはこれからも使われるのでしょうか。  (MFCで新規開発をすることは、まだまだ大勢なのでしょうか。) (3)VC++2005以降、MFCは有償らしいのですが、  VC++6.0(MFC)とVC++2005(MFC)は何か変わったのでしょうか。  (コーディングしやすくなっていますか?) (4)個人差はあると思いますが、開発スピードが一番早いのは、  CLR、C#、MFCのどれでしょうか。   すぐに返信ができないと思いますが、 宜しければ、ご回答頂けると幸いです。

  • [c++]windowsでの開発環境

    仕事でjavaのプログラム(ほとんどがコンソールプログラム)を 組んでまいりましたが、わけあってc++でアプリケーションを 再構築することになりました。javaの開発環境といえばeclipseですが c++のwindowsでの開発はvisutal studioが一般的なのでしょうか? visual studioは高価なのでexpress版を試しましたがmfcが入っていません ためしにcygwin+eclipseを試しましたがネット上に情報が少なく ライブラリの使い方に難儀しています 学術用途ではなく、一般企業の仕事で使うということであれば やはり有償版のvisual studioを購入すべきでしょうか?

  • ゲーム開発について

    私は高2の男子です。 自分は、ゲームを作れるようになることを目標にc言、c++とやってきたのですが、そろそろゲーム作成に入りたいと思い、いろいろなことを調べてみました。 すると、C以外にも知識が必要だということがわかり、どのような手順でとりかかればよいのか教えていただきたいと思い、質問させていただきました。 自分は、PCゲームを作りたいので、Drectxかと思ったのですが、なかなか難しいようなので、DXライブラリから始めたほうが良いものか、あと、Drectxならば、現在はどのバージョンをインストールしたらよいのか教えていただきたいです。ネットのページでは、いろいろな情報がありすぎて、収拾がつかないのです>< どうかよろしくお願いします!!!

  • C/C++でComponent Objectを開発したい

    こんにちは。 WSH JScript などの処理系から同期関係の Win32 API (*) を呼びたくて Component Object (COM オブジェクト) を C/C++ で開発したいと思っています。そこでプログラムの骨格がどのようになるのか学ぶよいポインタ情報がありましたら教えて頂ければ幸いです。 開発環境は WinXP, Borland C++ 5.5.1 を当方使用しています。特に BCC でなければという理由はありません。 (注釈) * Mutex/Event オブジェクトをアクセスする手続きが主です

  • C++/CLIでfstream(.NET 3.5)

    過去の資産にアクセスするためにC#から使うクラスライブラリをC++/CLIで作成しています。 当初は.NET Framework 4.5で作成していたのですが、Windows7でFrameworkを追加するのが面倒くさいという事で、3.5でプロジェクトを起こし直してコンパイルしました。 そうしたところ、大量のリンクエラーが発生しました。 --抜粋(下記を含め、合計18行のエラー) VCMRTD.lib(locale0_implib.obj) : error LNK2034: metadata は、COFF シンボル テーブルと整合しません: LINK : error LNK2034: metadata は、COFF シンボル テーブルと整合しません MSVCMRTD.lib(locale0_implib.obj) : error LNK2020: 未解決のトークン (0A0000A1) "extern "C" double __cdecl _hypot(double,double)" (?_hypot@@$$J0YANNN@Z) -- 調査した結果、fstream関連を定義するとこの症状が出る事がわかりました。 そこで、単純に以下のプロジェクトを作成したところ、同じ現象が発生しました。 1..NET Framework 3.5でCLRクラスライブラリのプロジェクトを作成する(ここではTESTプロジェクト) 2.作成されたテンプレートの「TEST.h」に関数を追加する -----(TEST.h) // TEST.h #pragma once #include <fstream> using namespace System; namespace TEST { public ref class Class1 { void test() { std::fstream f; } }; } ---- 3.コンパイル → リンクエラー 標準関数はいくつか使っているのですが、fstream系だけがダメなようです。 (sstreamはOKでした) これに関して、何か対策方法はないものでしょうか。 情報があればお教え下さい。 よろしくお願いいたします。 開発環境: Windows 8.1 VisualStudio 2013 Pro

  • マイクロソフトの開発環境について

    Microsoft Visual C++ .NET .NET Framework Microsoft Visual studio .NET Microsoft Visual studio express .NET Microsoft Visual studio express .NET framework (これに言語名、vb, c#, vc++などのバリエーション) というような記述が、書籍、サイトに書いてあります。略称だったりするのかも知れませんが。 大局的にどういう風に整理して理解したらよいかわかりません。時間の流れの中で名称が統廃合されたとか。 末尾につく .NET, framework という接尾語の意味とか...、言葉で中身を理解したいのですが、どういう風に理解すればいいでしょうか。 わかっているのは1つだけ、expressが付いたらフリー(タダ)という意味ですよね。違うでしょうか。 expressがないものは有償と思っているのですが。もしそうだったらexpressとか書かないでストレートな表現にした方がいいと思うのですが。 ある情報処理の本に”この本は、Visual C++ .NET対応”、と書いてあります。私はMicrosoft Visual studio expressの中のc++をダウンロードして持っているのですが、それでいけるのかなと思っています。やっぱり指定どおりじゃないとだめなのでしょうか。 別の視点からの質問になりますが、OpenGLを用いたCGの開発環境はどのように整備するようになっているでしょうか。ここが本来の質問の出発点でした。これをやろうとしていろいろ調べていくとこのような問題にぶつかったということなのですが。 よろしくお願いします。

専門家に質問してみよう