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

树莓派CM4上Pygame程序二次启动时出现闪烁问题

树莓派CM4 Pygame程序退出X后重启闪烁问题排查

环境与操作背景

  • 硬件:树莓派CM4
  • 系统:Raspberry Pi Lite OS (Buster)
  • 操作步骤:
    1. 手动安装X环境:
      sudo apt-get install --no-install-recommends xserver-xorg xinit x11-xserver-utils openbox
      
    2. 配置开机自启(添加至.bash_profile):
      [[ -z $DISPLAY && $XDG_VTNR -eq 1 ]] && startx -- -nocursor
      
    3. 配置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
      
    4. 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()
      

异常现象

开机自启时程序运行正常;但通过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,模拟开机启动流程。

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。

4. CM4硬件加速模式异常

开机自启时X会初始化CM4的硬件加速模块,强制退出后该模块未正确关闭,导致Pygame重启无法获取加速资源。

  • 解决方案:
    • 编辑/boot/config.txt,确保dtoverlay=vc4-fkms-v3d配置启用(Buster默认可能未开启);
    • 启动程序前执行vcgencmd display_power 1重置显示电源状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:06:01