使用Python Arcade库绘制圆形时显示为三角形的问题咨询
问题描述
我尝试使用Python的Arcade库绘制一个简单的圆形,但最终显示的却是位置完全准确的三角形。
我使用的示例代码如下:
import arcade # Set constants for the screen size SCREEN_WIDTH = 400 SCREEN_HEIGHT = 400 SCREEN_TITLE = "Happy Face Example" # Open the window. Set the window title and dimensions arcade.open_window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE) # Set the background color arcade.set_background_color(arcade.color.WHITE) arcade.start_render() # Draw the face x = SCREEN_WIDTH // 2 y = SCREEN_HEIGHT // 2 radius = 100 arcade.draw_circle_filled(x, y, radius, arcade.color.YELLOW) arcade.finish_render() # Keep the window open until the user hits the 'close' button arcade.run()
问题现象截图:
我在网上搜索了数小时未找到解决方案,尝试在另一台电脑运行相同代码,成功得到了正常的圆形。
我的设备配置:
- AMD Ryzen 5 2500U 处理器,Vega 8 显卡
- 8 GB RAM
- 操作系统:Ubuntu 21.10
- Python 版本:3.10
可正常运行的设备同样搭载Ubuntu 21.10系统,配置为AMD CPU + GTX 1060 6 GB 显卡,安装的Python版本也为3.10。
请问该问题可能是什么原因导致的?
问题解答
核心原因
该问题属于AMD Vega 8核显与Ubuntu 21.10自带Mesa开源驱动的OpenGL渲染兼容性问题,与代码逻辑无关:
Arcade底层通过Pyglet调用OpenGL接口绘制图形,填充圆形的实现逻辑是生成指定数量的顶点组成三角形扇来模拟圆形边缘。Ubuntu 21.10自带的Mesa 21.2.x版本驱动对Ryzen 2500U搭载的Vega 8(Raven Ridge架构)的OpenGL参数传递存在已知bug,会把圆形的细分边数参数错误篡改为3,最终渲染为三角形。另一台设备使用的NVIDIA独显驱动无该兼容性问题,因此运行正常。
解决方案
可任选以下一种方案修复:
- 手动指定圆形细分边数:调用
draw_circle_filled时主动添加num_segments参数,强制指定顶点数量,绕过驱动参数读取bug:arcade.draw_circle_filled(x, y, radius, arcade.color.YELLOW, num_segments=32) - 升级Mesa驱动到22.0及以上稳定版本,修复老版本的兼容性缺陷。
- 关闭窗口抗锯齿:调用
open_window时添加antialiasing=False参数,避免抗锯齿逻辑触发渲染异常:arcade.open_window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE, antialiasing=False) - 临时使用软件渲染:运行代码前设置环境变量
LIBGL_ALWAYS_SOFTWARE=1,通过CPU完成渲染绕过显卡驱动问题,适合小窗口测试场景。
内容的提问来源于stack exchange,提问作者Chironito
相关产品推荐
相关产品推荐

