You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CentOS与Linux Mint下C语言SDL程序兼容性问题求助

问题描述

我是C语言开发新手,近期在CentOS系统上使用SDL库完成了康威生命游戏的开发,程序运行正常(窗口分辨率为1000x500)。但将程序移至Linux Mint系统后出现显示问题:屏幕闪烁、绘制的网格线条不均,点击方块时会全屏变黑且偶尔闪烁。最初在Mint上编译失败,重装相关依赖后可运行,但上述显示问题仍存在。请问问题原因是什么?是否需要为不同Linux发行版重写代码?

核心代码
#include <SDL2/SDL.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{ 
    int largeur=  1000;
    int hauteur = 500;
    SDL_Renderer *renderer = NULL; 
    SDL_Window *window=NULL;
    SDL_Event event;
    SDL_bool quit=SDL_FALSE;
    SDL_Color fond_blanc = {255,255,255,255};

    int x;
    int y;
    int nbr;
    int dep=0;
    printf("--------Bienvenue au jeu de la vie !! \n");

    if(0!= SDL_Init(SDL_INIT_VIDEO))
    {
        return EXIT_FAILURE;
    }

    window = SDL_CreateWindow("Le jeu de la vie : Erwan",SDL_WINDOWPOS_CENTERED,
    SDL_WINDOWPOS_CENTERED,largeur,hauteur,SDL_WINDOW_SHOWN);
    renderer = SDL_CreateRenderer(window,-1,SDL_RENDERER_ACCELERATED);

    if(0!=SDL_SetRenderDrawColor(renderer,fond_blanc.r
    ,fond_blanc.g,fond_blanc.b,fond_blanc.a)){printf("ok1\n");}

    if(0!=SDL_RenderClear(renderer)){printf("ok3\n");}

    SDL_RenderPresent(renderer);
    /*END OF CREATION OF WHITE BACKGROUND*/

    /*LINES*/
    SDL_Point point[largeur];
    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
    size_t i = 0;
    size_t kt= 0;
    size_t kz =0;
    int c = 0;

    /*creation of horizontal lines*/
    while(c<hauteur/20)
    {
        for(i = 0; i < largeur; i++)
        {
            point[i].x = i;
            point[i].y = c*20;
        }
        SDL_RenderDrawPoints(renderer, point, largeur);
        SDL_RenderPresent(renderer);

        c +=1;
    }

    SDL_Point point2[hauteur];
    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
    i = 0;
    c = 0;

    /*creation of vertical lines*/
    while(c<(largeur/20))
    {
        for(i = 0; i < hauteur; i++)
        {
            point2[i].x = c*20;
            point2[i].y = i;
        }
        SDL_RenderDrawPoints(renderer, point2, hauteur);
        SDL_RenderPresent(renderer);

        c +=1;
    }

    printf("Closing don't touch anything\n ");
    SDL_Delay(1000);
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();

    return EXIT_SUCCESS;
}
编译与运行命令
  • 编译:gcc run.c -o main -lSDL2
  • 运行:./main
问题分析与解决

不需要为不同Linux发行版重写代码,问题根源在渲染逻辑和事件处理上:

  1. 频繁调用SDL_RenderPresent引发闪烁
    代码中每绘制一条线就调用一次SDL_RenderPresent,这会频繁交换前后缓冲区,导致屏幕闪烁。正确做法是完成所有绘制操作后,仅调用一次SDL_RenderPresent。

  2. 用SDL_RenderDrawPoints画线条效率低且易出错
    逐个点绘制线条不仅效率低下,还可能因为不同发行版的SDL渲染器实现差异,导致线条显示不均。建议改用SDL_RenderDrawLine或SDL_RenderDrawLines直接绘制线条,更高效且兼容性更好。

  3. 缺少事件循环处理
    代码定义了SDL_Event但未处理任何事件,点击窗口时的输入事件得不到响应,可能引发窗口状态异常,出现全屏变黑的情况。需要添加事件循环处理用户输入和窗口事件。

修改后的核心代码示例
// ... 保留原有初始化代码 ...

/*END OF CREATION OF WHITE BACKGROUND*/

/*LINES*/
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
int c = 0;

/*creation of horizontal lines*/
while(c<hauteur/20)
{
    // 改用SDL_RenderDrawLine绘制水平线
    SDL_RenderDrawLine(renderer, 0, c*20, largeur, c*20);
    c +=1;
}

c = 0;
/*creation of vertical lines*/
while(c<(largeur/20))
{
    // 改用SDL_RenderDrawLine绘制垂直线
    SDL_RenderDrawLine(renderer, c*20, 0, c*20, hauteur);
    c +=1;
}

// 所有绘制完成后再更新屏幕
SDL_RenderPresent(renderer);

/* 添加事件循环处理 */
while(!quit)
{
    while(SDL_PollEvent(&event))
    {
        if(event.type == SDL_QUIT)
        {
            quit = SDL_TRUE;
        }
        // 处理鼠标点击事件,避免窗口异常
        else if(event.type == SDL_MOUSEBUTTONDOWN)
        {
            // 可在此添加点击方块的逻辑
        }
    }
}

// ... 保留原有销毁资源代码 ...

内容的提问来源于stack exchange,提问作者Erwan Tarchouna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:27:02