SDL在linux上运行几秒钟后没有响应

SDL not responding after running for a few seconds on linux

本文关键字:几秒 响应 linux 运行 SDL      更新时间:2023-10-16

我一直在遵循SDL游戏开发手册,我甚至无法让第一个文件正常工作。应用程序启动后,它会渲染窗口,几秒钟后Linux说游戏没有响应,并要求我强制退出。如果单击"等待",则每隔几秒钟重复一次。我注意到的一件事是SDL_PollEvent永远不会返回true。我不知道为什么事情不起作用。这是我的密码。

主要.cpp

#ifdef __cplusplus
#include <cstdlib>
#else
#include <stdlib.h>
#endif
#include "Game.h"
// our Game object
Game* g_game = 0;
int main(int argc, char* argv[]) {
    g_game = new Game();
    g_game->init("Chapter 1", 100, 100, 640, 480, 0);
    while(g_game->running()) {
        g_game->handleEvents();
        //g_game->update();
        g_game->render();
    }
    g_game->clean();
    return 0;
}

Game.h

#ifndef __Game__
#define __Game__
#if !WINDOWS
#include <SDL2/SDL.h>
#else
#include <SDL.h>
#endif
class Game {
public:
    Game() {}
    ~Game() {}
// simply set the running variable to true
    bool init(const char* title, int xpos, int ypos, int width, int
        height, bool fullscreen);
    void render();
    void update();
    void handleEvents();
    void clean();
// a function to access the private running variable
    bool running() {
        return m_bRunning;
    }
private:
    SDL_Window* m_pWindow;
    SDL_Renderer* m_pRenderer;
    bool m_bRunning;
};
#endif /* defined(__Game__) */

Game.cpp

#include "Game.h"
#include <iostream>
bool Game::init(const char* title, int xpos, int ypos, int width,
                int height, bool fullscreen) {
// attempt to initialize SDL
    if(SDL_Init(SDL_INIT_EVERYTHING) == 0) {
        std::cout << "SDL init successn";
// init the window
        int flags = 0;
        if(fullscreen) {
            flags = SDL_WINDOW_FULLSCREEN;
        }
        m_pWindow = SDL_CreateWindow(title, xpos, ypos,
                                     width, height, flags);
        if(m_pWindow != 0) { // window init success
            std::cout << "window creation successn";
            m_pRenderer = SDL_CreateRenderer(m_pWindow, -1, 0);
            if(m_pRenderer != 0) { // renderer init success
                std::cout << "renderer creation successn";
                SDL_SetRenderDrawColor(m_pRenderer,
                                       255,0,255,255);
            } else {
                std::cout << "renderer init failn";
                return false; // renderer init fail
            }
        } else {
            std::cout << "window init failn";
            return false; // window init fail
        }
    } else {
        std::cout << "SDL init failn";
        return false; // SDL init fail
    }
    std::cout << "init successn";
    m_bRunning = true; // everything inited successfully, start the main loop
    return true;
}
void Game::render() {
    SDL_RenderClear(m_pRenderer); // clear the renderer to the draw color
    SDL_RenderPresent(m_pRenderer); // draw to the screen
}
void Game::clean() {
    std::cout << "cleaning gamen";
    SDL_DestroyWindow(m_pWindow);
    SDL_DestroyRenderer(m_pRenderer);
    SDL_Quit();
}
void Game::handleEvents() {
    SDL_Event event;
    while(SDL_PollEvent(&event)) {
        std::cout << "Checking Events";
        switch(event.type) {
        case SDL_QUIT:
            std::cout << "Quiting";
            m_bRunning = false;
            break;
        default:
            break;
        }
    }
}

编辑:

所以我做了一个minamal版本的代码,现在我得到了一个新的错误。错误显示"分段故障(堆芯转储)"。根据在调试中运行到特定行的情况,错误似乎出现在写着"SDL_Texture*tex=SDL_CreateTextureFromSurface(ren,bmp)"的行;我不确定中的错误是什么

这是最小代码:

#ifdef __cplusplus
#include <cstdlib>
#else
#include <stdlib.h>
#endif
#include <iostream>
#include <SDL2/SDL.h>
int main(int argc, char** argv) {
    if(SDL_Init(SDL_INIT_EVERYTHING) != 0) {
        std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl;
        return 1;
    }
    SDL_Window *win = SDL_CreateWindow("Hello World!", 100, 100, 640, 480, SDL_WINDOW_SHOWN);
    if(win == NULL) {
        std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
        SDL_Quit();
        return 1;
    }
    SDL_Renderer *ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    if(ren == NULL) {
        SDL_DestroyWindow(win);
        std::cout << "SDL_CreateRenderer Error: " << SDL_GetError() << std::endl;
        SDL_Quit();
        return 1;
    }
    std::string imagePath = "cb.bmp";
    SDL_Surface *bmp = SDL_LoadBMP(imagePath.c_str());
    if(bmp == NULL) {
        SDL_DestroyRenderer(ren);
        SDL_DestroyWindow(win);
        std::cout << "SDL_LoadBMP Error: " << SDL_GetError() << std::endl;
        SDL_Quit();
        return 1;
    }
    SDL_Texture *tex = SDL_CreateTextureFromSurface(ren, bmp);
    if(tex == NULL) {
        SDL_DestroyRenderer(ren);
        SDL_DestroyWindow(win);
        std::cout << "SDL_CreateTextureFromSurface Error: " << SDL_GetError() << std::endl;
        SDL_Quit();
        return 1;
    }
    SDL_FreeSurface(bmp);
    SDL_Event e;
    bool quit = false;
    while(!quit) {
        while(SDL_PollEvent(&e)) {
            //If user closes the window
            if(e.type == SDL_QUIT) {
                quit = true;
            }
            //If user presses any key
            if(e.type == SDL_KEYDOWN) {
                quit = true;
            }
            //If user clicks the mouse
            if(e.type == SDL_MOUSEBUTTONDOWN) {
                quit = true;
            }
        }
        SDL_RenderClear(ren);
        SDL_RenderPresent(ren);
    }
    SDL_DestroyTexture(tex);
    SDL_DestroyRenderer(ren);
    SDL_DestroyWindow(win);
    SDL_Quit();
    return 0;
}

我已经使用SDL 2.0.4在Linux下成功编译并运行了您的最小代码。我用了一个简单的图像作为"cb.bmp".

尝试以下操作:

  1. 编译如下:g++-Wall-ggdb$(sdl2配置--cflags)-o程序main.cpp-lSDL2

  2. gdb/程序,然后键入"运行"

  3. 当它崩溃时,键入"bt"(用于回溯)

  4. 将输出复制到

我的猜测是:要么不支持"bmp"文件格式,要么不支持渲染驱动程序。尝试使用:

SDL_CreateRenderer(获胜,-1,0);