5


1

クロスプラットフォームハードウェアアクセラレーション2D C ++アプリ?

かなりの量のC ++を知っているので、今はゲームの作成を検討したかったのです。 クロスプラットフォーム(Windows / OSX / Linux)のままのハードウェアアクセラレーションゲームを作成するという点で、最善のアプローチはどのようなものになるのだろうかと考えていました。 それは2Dゲームになりますが、CPUレンダラーがおそらくそれをカットしないほど十分に集中的です。

OpenGLがあることは知っていますが、クロスプラットフォームでそれを使用する方法に関するチュートリアルを見つけることはできないようです。いずれも1つのプラットフォームに焦点を当てています。

SDLを使用することも可能ですが、使用するとゲームのパフォーマンスが低下する可能性があります。 これは必ずしも真実ですか?

最後に、http://www.sfml-dev.org/のようなライブラリーを見たことがありますが、それはおそらくそれを簡単にするでしょう。

再度、感謝します。

6 Answer


7


それはナンセンスな奴だ

OpenGL * IS *クロスプラットフォーム。 Qtなどは必要ありません。 OS固有のルーチンに依存する唯一の関数であるウィンドウAPIと入力APIの一部のみを適合させる必要があります。

いくつかの可能性があります:

  • あなた自身を転がしてください。 何も学ばないので、これはお勧めしません 面白い(ほとんど)

  • SDL. ハードウェアアクセラレーションのフラグが設定されているため、他のどの製品よりも優れています。

  • SFML。 これは良いように思えますが、十分に成熟していません。 その他の部品 (ネットワーク、…​)は他のライブラリのラッパーなので、実際には利点がわかりません

  • GLUT。 これは悪です。

  • GLFW これは本当に素晴らしいです。 私はもう何年も使っています。 それはあらゆる観点から完璧です。 唯一の制限は、openGLウィンドウを1つしか持てないことですが、ゲーム用であるため、問題ありません。


3


_ クロスプラットフォームハードウェアアクセラレーション2D C ++アプリ? _

SDL + OpenGL。 シェーダーや拡張機能を使用する場合は、http://www.opengl.org/sdk/libs/GLee/ [glee]またはhttp://glew.sourceforge.net/[glew] Gleeは使いやすいですが、3.0以降のOpenGLバージョンをサポートしていないようです。 また、画像を読み込むためにhttp://www.libsdl.org/projects/SDL_image/[SDL_image]が必要になる場合があります。

_ OpenGLがあることは知っていますが、クロスプラットフォームでそれを使用する方法に関するチュートリアルを見つけることはできないようです。いずれも1つのプラットフォームに焦点を当てています。 _

    SDL_Init(SDL_INIT_VIDEO);

    SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 0);//disable vsync

    if (SDL_SetVideoMode(scrWidth, scrHeight, 32, SDL_OPENGL) == 0){
        fprintf(stderr, "couldn't set mode %dx%d!\n", 640, 480);
        SDL_Quit();
        return -1;
    }
    glewInit();//if you use glew, shaders, extensions.

    while(gameIsRunning()){//game loop
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
        //OpenGL rendering here
        glFlush();
        SDL_GL_SwapBuffers();
    }
    SDL_Quit();

詳細については、sdlのドキュメントを参照してください。

_ SDLを使用することも可能ですが、使用するとゲームのパフォーマンスが低下する可能性があります。 これは必ずしも真実ですか? _

vsyncを無効にすると、1秒あたり数百から数千フレームを取得できます。 正確なパフォーマンスはハードウェアとシーンの複雑さに依存します-表示リスト/頂点バッファーオブジェクトのない「RAW」openglを使用した単純な3Dダンジョンクローラーの300 fpsレポートがありました。 また、固定フレームレートまたはタイマー駆動のエンジンを使用している場合は、要求したよりも多くのフレーム/秒を取得することはありません。

SDLは、Unreal 2004をLinuxに移植するために使用されました。 また、Doom 3 / Quake 4 linuxポートでも使用されました。 したがって、完全にテストされ、よく知られています。

詳細については、http://en.wikipedia.org/wiki/List_of_games_using_SDL [このリスト]を参照してください。


2


クロスプラットフォームでOpenGLが必要な場合は、QGLWidgetを使用してQtアプリケーションに埋め込むことができます。


1


wxWidgetsもあり、http://docs.wxwidgets.org/trunk/classwx_g_l_canvas.html [OpenGl support]があります。


1


私にとって問題は、ライブラリを使用すべきかどうかを知ることではありません。 どのライブラリを使用すべきかです。 ゲームを作成する場合は、ほとんどの移植性の問題を解決するライブラリを見つけてください。 最も重要なもの、つまりゲーム自体に集中できます。 他の人は、私があなたに与えたかもしれないより多くのライブラリの提案をしました。

プロジェクトを開始する前にパフォーマンスを過度に心配するのは間違いだと思います。 開発中に直面する他の問題と同様に、パフォーマンスの問題に取り組みます。 プログラムを設計して、ライブラリを他のプログラムロジックとは別のレイヤーに分離します。 必要に応じて実装を切り替える方が簡単です。 それは異なる実装を実験することさえ可能にします。

Ie:

// separate files

class LowLevelGraphicStuff {
  // abstract
};

class LowLevelGraphicStuff_SFML : public LowLevelGraphicsStuff {
  // actual SFML implementation
};

class LowLevelGraphicsStuff_OGL : public LowLevelGraphicsStuff  {
  // actual OpenGL implementation
};

// main

// Run the game with the SFML implementation.
gameLoop(new LowLevelGraphicsStuff_SFML());
// Run the game with the OpenGL implementation.
gameLoop(new LowLevelGraphicsStuff_OGL());


0


はい、SFMLを使用します。 SDLは本質的にハードウェアアクセラレーションではありません。

OpenGLは確かに移植可能ですが、OpenGLコンテキストを作成するためのプラットフォーム固有のメソッドがあります。 SFMLはそれを解決します