【问题标题】:Pygame weird effects on the screen, segmentation fault and crashPygame对屏幕的奇怪影响,分段错误和崩溃
【发布时间】:2021-07-13 14:33:05
【问题描述】:

这几天我遇到了一个严重的问题,这是终端抛出的分段错误(核心转储)错误。

这个问题出现在我输掉后回到菜单,然后再次播放。

这正是发生的事情:

上图中显示的窗口会立即出现,然后关闭。

顺便说一句,我正在开发的游戏中帧数限制为 50,而我的笔记本电脑是游戏机,所以我不知道这次崩溃的原因是什么,但我认为是代码造成的。

这是当我尝试返回菜单然后再次播放时运行的一段代码:

# this is inside the main loop in the game function
for event in events:
    if event.type == KEYDOWN:
        if event.key == K_c: # back to menu
            pygame.quit()
            main_menu()

# this is inside the main_menu() function
if play_button.get_rect(x=320, y=270).colliderect(cursor_rect) and pygame.mouse.get_pressed()[0]:
        pygame.quit()
        pilot()
                

更新:

  1. 发生错误时没有显示特定的错误消息,但所有错误消息都包含core dumped 问题。

    例如:corrupted size vs. prev_size Aborted (core dumped)

  2. 经过一番研究,我发现这个问题可能与 pygame 和 Ubuntu (linux) 之间的兼容性问题有关,我顺便在 Linux Mint 上编码。

【问题讨论】:

  • 你为什么用pygame.quit()
  • 我也使用 Linux Mint(现在是最新的 20.2 “Uma”,但我从 16.0 开始),我从来没有遇到过这个问题。您是否在某个 IDE 中运行它?你是直接在终端试的吗? PyGame 使用 C/C++ 库SDL,可能需要更新。但我总是在一个窗口中运行——即使菜单和游戏有自己的主循环。再次关闭和打开窗口只是浪费时间。您是否同时运行两个窗口? PyGame/SDL 不是为了同时运行两个窗口而创建的。
  • 对我来说问题可能是关闭并再次创建窗口。 PyGame/SDL 被创建为当时只运行一个窗口。 quit() 可以从内存中删除一些 SDL 元素,init() 可能会在内存中的不同位置创建它们,因此它可能需要在 PyGame 中重新创建对象才能访问内存中的正确位置。
  • 你应该在启动时只运行一次pygame.init(),只创建一次screen = pygama.display.set_mode(...)并作为参数发送它game(screen)menu(screen),并且在退出程序时只使用一次quit()
  • 我在 GitHub 上找到了我的示例,但它在类中保留了代码:github.com/furas/python-examples/blob/master/pygame/…

标签: python pygame crash


【解决方案1】:

现在,我已经成功解决了这个问题,它与多个 pygame.display.set_mode() 调用有关。

我一直在为每个菜单和游戏创建一个窗口,这导致了分段错误(核心转储)错误。

根据cmets中的@furas,pygame.init()pygame.display.set_mode()只能调用一次,而pygame.quit()只能在退出整个程序时调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多