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

Pygame中如何实现非阻塞延时 替代time.sleep的阻塞效果

蚁群模拟器碰撞延时销毁沙块实现方案

不要用time.sleep()也不要贸然上多线程:Pygame本身是帧循环驱动的架构,用时间戳记录延时任务是最轻量、无阻塞、无线程安全问题的方案,适配你现有代码的改造成本极低。

核心调整逻辑:

  • 给沙块新增中间状态:原有cells数组中1代表正常沙块,新增2代表「已被蚂蚁触发、等待销毁的沙块」,避免多个蚂蚁碰到同一块沙时重复触发销毁逻辑
  • 单独维护待销毁任务列表,每个条目存储沙块坐标、计划销毁时间戳、触发任务的蚂蚁对象四个信息
  • 碰撞检测触发时不做等待,直接标记沙块状态、停住对应蚂蚁、把销毁任务加入列表就立刻返回,不阻塞帧循环
  • 每帧主循环先遍历待销毁任务列表,当前时间达到销毁时间点时,再执行沙块销毁、恢复蚂蚁移动的操作,同时移除已完成的任务

具体代码修改

首先在主循环外部初始化待办任务列表:

pending_sand_remove = []

修改原碰撞检测函数,去掉sleep逻辑,改为登记延时任务:

def collision(cells, sprite, size, current_time):
    for row, col in np.ndindex(cells.shape):
        hitbox = pg.Rect(col * size, row * size, size + 1, size + 1)
        if pg.Rect.colliderect(sprite.rect, hitbox):
            # 仅对未被触发的正常沙块响应
            if cells[row, col] == 1:
                sprite.stop_moving = True
                # 标记沙块为待销毁状态,避免重复触发
                cells[row, col] = 2
                # 登记3秒(3000毫秒)后的销毁任务
                pending_sand_remove.append(
                    (row, col, current_time + 3000, sprite)
                )

修改主循环逻辑,增加延时任务处理环节:

if running:
    # 获取当前程序运行的毫秒级时间戳
    current_time = pg.time.get_ticks()
    cells = update(screen, cells, 10)

    # 倒序遍历处理所有到期的销毁任务,倒序遍历可以直接删除列表元素不打乱索引
    for i in range(len(pending_sand_remove) - 1, -1, -1):
        row, col, destroy_time, target_sprite = pending_sand_remove[i]
        if current_time >= destroy_time:
            cells[row, col] = 0
            target_sprite.stop_moving = False
            pending_sand_remove.pop(i)

    # 仅对处于移动状态的蚂蚁做碰撞检测,减少无效计算
    for sprite in all_sprites:
        if not sprite.stop_moving:
            collision(cells, sprite, 10, current_time)

方案说明

  • 全程无阻塞:所有逻辑都在主线程帧循环内执行,不会卡住渲染和交互,3秒延时的误差最多为单帧时长(通常小于16ms,无感知)
  • 天然支持多蚂蚁并行挖沙:每个销毁任务独立计时,不同蚂蚁触发的沙块销毁逻辑互不干扰
  • 无多线程问题:Pygame渲染、精灵属性修改、numpy数组写入都不是线程安全的,子线程操作这些内容很容易引发随机崩溃、花屏等难以调试的问题,本方案完全规避了这类风险

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:01:41