树莓派CM4上Pygame程序二次启动时出现闪烁问题
树莓派CM4 Pygame程序退出X后重启闪烁问题排查
环境与操作背景
- 硬件:树莓派CM4
- 系统:Raspberry Pi Lite OS (Buster)
- 操作步骤:
- 手动安装X环境:
sudo apt-get install --no-install-recommends xserver-xorg xinit x11-xserver-utils openbox - 配置开机自启(添加至
.bash_profile):[[ -z $DISPLAY && $XDG_VTNR -eq 1 ]] && startx -- -nocursor - 配置Openbox自启程序(编辑
/etc/xdg/openbox/autostart):# Disable any form of screen saver / screen blanking / power management xset s off xset s noblank xset -dpms # Allow quitting the X server with CTRL-ATL-Backspace setxkbmap -option terminate:ctrl_alt_bksp cd project_dir && python project.py - Pygame核心代码:
import pygame as pg class Game: def __init__(self): pg.init() self.__clock = pg.time.Clock() self.__window_size = (1024, 768) self.__project_size = (392, 291) self.screen = pg.display.set_mode(self.__window_size, pg.FULLSCREEN) self.blank_background = pg.transform.scale(pg.image.load("assets/default_background.png"), self.__window_size).convert() self.grid_image = pg.transform.scale(pg.image.load("assets/new_project_thumb.png"), self.__project_size).convert() self.project_selected = 0 self.rect_pixels = 3 self.grid_locations = self.calculate_grid_locations() def run(self) -> None: pg.mouse.set_visible(False) playing = True while playing: events = pg.event.get() button_event = None self.screen.blit(self.blank_background, (0, 0)) for event in events: if event.type == pg.KEYDOWN: button_event = event.key if button_event == pg.K_LEFT: self.project_selected = max((self.project_selected - 1), 0) if button_event == pg.K_RIGHT: self.project_selected = min((self.project_selected + 1), 3) if button_event == pg.K_ESCAPE: playing = False self.draw_menu() pg.display.update() self.__clock.tick(6) def draw_menu(self): for i in range(4): if i == self.project_selected: rect_loc = (self.grid_locations[i][0] - self.rect_pixels, self.grid_locations[i][1] - self.rect_pixels) pg.draw.rect(self.screen, (237, 28, 36), pg.Rect(rect_loc, (self.__project_size[0] + self.rect_pixels * 2, self.__project_size[1] + self.rect_pixels * 2))) self.screen.blit(self.grid_image, self.grid_locations[i]) def calculate_grid_locations(self): w=int((self.__window_size[0] - 2 * self.__project_size[0]) / 3) h=int((self.__window_size[1] - 2 * self.__project_size[1]) / 3) return [(w, h), (w * 2 + self.__project_size[0], h), (w, h * 2 + self.__project_size[1]), (w * 2 + self.__project_size[0], h * 2 + self.__project_size[1])] if __name__ == "__main__": game = Game() game.run()
- 手动安装X环境:
异常现象
开机自启时程序运行正常;但通过Ctrl-Alt-Backspace强制退出X服务器和程序后,直接在命令行执行python project.py重启,显示会间歇性闪烁。此问题仅在CM4上出现,Ubuntu笔记本无该现象。
可能原因与解决方案
1. X强制退出后的显示硬件状态残留
CM4的GPU帧缓冲区或显示缓存在强制退出X时未完全重置,导致Pygame重启时与残留状态冲突。
- 解决方案:
- 退出X后先执行
fbset -depth 24重置帧缓冲区,再启动程序; - 或重新初始化X环境:执行
xinit -- -nocursor后再运行python project.py,模拟开机启动流程。
- 退出X后先执行
2. Pygame资源未正常释放
强制退出时,Pygame未正确释放GPU资源或重置驱动状态,导致重启时初始化不完整。
- 解决方案:
- 在程序退出逻辑中添加显式资源释放:在
run方法的playing = False后增加pg.quit(); - 启动程序前执行
unset DISPLAY清除残留环境变量,再启动程序。
- 在程序退出逻辑中添加显式资源释放:在
3. Openbox环境变量残留
Openbox启动时设置的X相关环境变量(如DISPLAY、XAUTHORITY)在强制退出后未清理,导致Pygame使用无效配置。
- 解决方案:
- 退出X后执行
source ~/.bash_profile重新加载环境变量,或注销重登后启动程序; - 显式指定显示端口:执行
DISPLAY=:0 python project.py。
- 退出X后执行
4. CM4硬件加速模式异常
开机自启时X会初始化CM4的硬件加速模块,强制退出后该模块未正确关闭,导致Pygame重启无法获取加速资源。
- 解决方案:
- 编辑
/boot/config.txt,确保dtoverlay=vc4-fkms-v3d配置启用(Buster默认可能未开启); - 启动程序前执行
vcgencmd display_power 1重置显示电源状态。
- 编辑
内容的提问来源于stack exchange,提问作者ZPears
相关产品推荐
相关产品推荐

