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

新M2 MacBook运行Python Arcade脚本时while循环无法执行的问题

M2 MacBook上Arcade框架while循环无法执行的解决方案

在M2 MacBook上运行Arcade框架脚本时,出现while循环完全不执行的问题——移除循环后脚本正常,但相同Python版本下该脚本在Windows和旧款Mac上可正常运行,怀疑与M2芯片有关。

原脚本代码:

import arcade
import random

class Ball:

    def __init__(self):

        self.x = 0
        self.y = 0

        self.size = 5

        self.color = [10,0,0]
        

    def create(self):

        arcade.draw_circle_filled(self.x, self.y, self.size, self.color)
        
arcade.open_window(800,800,'ball')
arcade.set_background_color(arcade.color.WHITE)
arcade.start_render()

ball_1 = Ball()

while True:
    
    random_x = random.randrange(0, 800)
    random_y = random.randrange(0, 800)
    random_color_1 = random.randrange(0, 256)
    random_color_2 = random.randrange(0, 256)
    random_color_3 = random.randrange(0, 256)
    random_color = [random_color_1,random_color_2, random_color_3]

    ball_1.x = random_x
    ball_1.y = random_y
    ball_1.color = random_color
    ball_1.size = random.randrange(10, 30)

    ball_1.create()

    arcade.finish_render()

arcade.run()

问题原因

Arcade框架依赖自身的事件循环(由arcade.run()启动)处理渲染、输入等操作。手动编写的while True死循环会直接阻塞线程,导致后续的arcade.run()根本无法执行。而M2芯片的ARM架构在系统线程调度、事件处理机制上与x86平台存在差异,这就导致原本在x86平台上能“侥幸”运行的不规范代码,在M2 Mac上完全失效。

另外原脚本还有一个规范问题:arcade.start_render()被放在了循环外部,这不符合Arcade的渲染流程要求,即使在能运行的平台上,渲染逻辑也是错误的。

正确解决方案

改用Arcade官方推荐的面向对象模式,利用框架内置的事件循环实现动画逻辑,避免手动死循环:

import arcade
import random

class Ball:
    def __init__(self):
        self.x = 0
        self.y = 0
        self.size = 5
        self.color = [10, 0, 0]

    def draw(self):
        arcade.draw_circle_filled(self.x, self.y, self.size, self.color)

class MyGame(arcade.Window):
    def __init__(self, width, height, title):
        super().__init__(width, height, title)
        arcade.set_background_color(arcade.color.WHITE)
        self.ball = Ball()

    def update_ball(self):
        # 随机更新球的参数
        self.ball.x = random.randrange(0, 800)
        self.ball.y = random.randrange(0, 800)
        self.ball.color = [random.randrange(0, 256) for _ in range(3)]
        self.ball.size = random.randrange(10, 30)

    def on_update(self, delta_time):
        # 每帧更新球的状态
        self.update_ball()

    def on_draw(self):
        # 每帧执行渲染
        arcade.start_render()
        self.ball.draw()

if __name__ == "__main__":
    game = MyGame(800, 800, 'ball')
    arcade.run()

代码说明

  • 继承arcade.Window类,让框架自动处理事件循环,避免手动阻塞线程。
  • on_draw方法负责每帧的渲染操作,必须在其中调用arcade.start_render()来初始化渲染上下文。
  • on_update方法处理每帧的逻辑更新,比如修改球的位置、颜色等参数,该方法会在arcade.run()的事件循环中被自动调用。
  • 这种写法符合Arcade的官方规范,在所有平台(包括M2 MacBook)都能稳定运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 00:03:13