1

私はこの問題をできる限り追跡しており、犯人を見つけたと思いますが、修正することはできません.

基本的に、Ubuntu 12.04 で単純なゲーム エンジンを実行しようとしています。エンジンは静的ライブラリであり、使用中のゲームにリンクされています。すべてが(Ubuntuで)正常にコンパイルされますが、プログラムを実行するとウィンドウが開かず、すぐに閉じます。CodeBlocks で、「プロセスはステータス 255 で終了しました」というエラーが表示されます。Init コードの次の行でチェックされるように、SetVideoMode が null を返していると思います。

if((Surf_Display = SDL_SetVideoMode(WindowWidth, WindowHeight, 32,SDL_GL_DOUBLEBUFFER | SDL_OPENGL)) == NULL){
        return false;
   }

これは、以前に NULL の前に double equals を追加するのを忘れていたためだと思います。この状態では、アプリは終了せず、ウィンドウを作成することはありませんが、プログラムは明らかにシステム モニターで実行されています。

また、興味深いことに気付きました。スタティック ライブラリのデバッグ バージョンは 350 kb 奇数で、プログラム自体はわずか 150kb です。Windows では、プログラムは常にライブラリのサイズよりも大きくなります。これは、ライブラリが実行可能ファイルに組み込まれていることを前提としています。これはおそらくLinuxの仕組みです。

エンジンの初期化コードは次のとおりです。

#include "Scales.h"
#include "SDL/SDL.h"
#include "GL/gl.h"
#include "GL/glu.h"
#include "SDL/SDL_opengl.h"
#include <iostream>

Engine *scalesEngine;

bool OnInit(int WindowHeight, int WindowWidth){

    SDL_Surface* Surf_Display;

    if(SDL_Init(SDL_INIT_EVERYTHING) < 0) {
        return false;
   }
    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_ALPHA_SIZE,      8);

    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,      16);
    SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE,        32);

    SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE,    8);
    SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE,    8);
    SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE,    8);
    SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE,    8);

    SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS,  1);
    SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES,  2);

   if((Surf_Display = SDL_SetVideoMode(WindowWidth, WindowHeight, 32,SDL_GL_DOUBLEBUFFER | SDL_OPENGL)) == NULL){
        return false;
   }

   glClearColor(0.422f,0.576f,1.0f,1.0f);
   glClearDepth(1.0f);

   glViewport(0, 0, WindowWidth, WindowHeight);

   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();

   glOrtho(0, WindowWidth, WindowHeight, 0, 1, -1);

   glMatrixMode(GL_MODELVIEW);

   glEnable(GL_TEXTURE_2D);

   glLoadIdentity();

   game_Init();

   return true;
}

int main(int argc, char* argv[]){

    scalesEngine = new Engine;

    game_preload();

    if(OnInit(scalesEngine->WindowHeight(), scalesEngine->WindowWidth()) == false){
        return -1;
    }

    SDL_Event Event;

    //Main Game Loop
    while(scalesEngine->Running){

        while(SDL_PollEvent(&Event)){
            scalesEngine->OnEvent(&Event);
        }


        scalesEngine->Update();
        scalesEngine->Render();
    }

    scalesEngine->OnCleanUp();
    delete scalesEngine;

    return 0;
}

「ゲーム」で始まるすべての関数呼び出しは、実際のプログラムでは extern 関数です。上記のコードはエンジン ライブラリにあります。

さらに詳しい情報が必要な場合は、お問い合わせください。

編集:問題をさらに追跡した後、SDL が次のエラーを出すことに気付きました:

Couldn't Find Matching GLX Visual

これはどういう意味ですか、どうすれば修正できますか?

4

2 に答える 2

0

(私はこれが古いことを知っていますが、私はついにそれをクラックしました、そしてそれは何ヶ月も私を悩ませてきました。)

「SDL_GL_ACCUM*」のすべての属性セットを削除します。これらを削除すると、マルチサンプルの設定が機能するはずです。

また、GL_MULTISAMPLE、GL_LINE_SMOOTH、およびGL_POLYGON_SMOOTHを有効にし、線/ポリゴンのスムージングのヒントを提供することも忘れないでください。

ウィンドウモードで一部のグラフィックスドライバーを使用すると、AAの効果が見られない場合があります(私の触媒ドライバーは何もしないようです)。

これらは私が使用する属性です:

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_ALPHA_SIZE, 8);

SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32);

//SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE, 8);
//SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE, 8);
//SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE, 8);
//SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE, 8);

//SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);

SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4);
于 2012-11-25T21:28:52.113 に答える
0
SDL_SetVideoMode(WindowWidth, WindowHeight, 32,SDL_GL_DOUBLEBUFFER | SDL_OPENGL))

SDL_GL_DOUBLEBUFFERは に対する有効なflags引数ではありませんSDL_SetVideoMode()


また、膨大な数の GL 属性を指定しています。SDL_GL_SetAttribute()すべての呼び出しを削除してみてください。それが機能する場合は、一度に 1 つずつ追加して、GL 実装が気に入らないものを見つけます。

于 2012-07-16T14:50:24.387 に答える