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发行版重写代码,问题根源在渲染逻辑和事件处理上:
频繁调用SDL_RenderPresent引发闪烁
代码中每绘制一条线就调用一次SDL_RenderPresent,这会频繁交换前后缓冲区,导致屏幕闪烁。正确做法是完成所有绘制操作后,仅调用一次SDL_RenderPresent。用SDL_RenderDrawPoints画线条效率低且易出错
逐个点绘制线条不仅效率低下,还可能因为不同发行版的SDL渲染器实现差异,导致线条显示不均。建议改用SDL_RenderDrawLine或SDL_RenderDrawLines直接绘制线条,更高效且兼容性更好。缺少事件循环处理
代码定义了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
相关产品推荐
相关产品推荐

