新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
相关产品推荐
相关产品推荐

