5

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

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

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

最後に、 http: //www.sfml-dev.org/のような、おそらく簡単になるライブラリを見たことがありますが、そのルートをたどるべきですか?

再度、感謝します。

4

6 に答える 6

7

それはナンセンスな人です

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

あなたにはいくつかの可能性があります:

  • あなた自身を転がしてください。面白いことは何も学ばないので、これはお勧めしません(ほとんど)
  • SDL。ハードウェアアクセラレーションのフラグが付いているので、他のどのフラグよりも優れています
  • SFML。これは良さそうですが、私見では十分に成熟していません。他の部分(ネットワーキング、...)は他のライブラリのラッパーであるため、実際には利点がわかりません
  • GLUT。これは悪です。
  • GLFW。これは本当に素晴らしいです。私はそれを何年も使っています。それはあらゆる観点から完璧です。唯一の制限は、openGLウィンドウを1つしか持てないことですが、ゲーム用なので問題ありません。
于 2010-08-03T06:36:40.347 に答える
3

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

SDL+OpenGL。シェーダーやエクステンションを使用している場合は、グリーまたはグリーも発生する可能性があります。Gleeは使いやすいですが、3.0以降のOpenGLバージョンをサポートしていないようです。また、画像をロードするために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ダンジョンクローラーの300fpsレポートがありました。また、固定フレームレートまたはタイマー駆動エンジンを使用する場合、要求したよりも多くのフレーム/秒を取得することはありません。

SDLは、Unreal2004をLinuxに移植するために使用されました。また、Doom 3 / Quake4Linuxポートでも使用されました。したがって、徹底的にテストされ、よく知られています。

詳細については、このリストを参照してください。

于 2010-08-03T14:02:29.963 に答える
2

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

于 2010-08-03T03:02:03.440 に答える
1

OpenGlをサポートするwxWidgetsもあります。

于 2010-08-03T06:14:57.157 に答える
1

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

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

すなわち:

// 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());
于 2010-08-03T13:39:30.253 に答える
0

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

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

于 2010-08-03T13:02:21.900 に答える