JemodsCN 2025-08-26 14:42 采纳率: 50%
浏览 21

Pygame 渲染图形表现差

我写个Pygame小程序,但是发现渲染上去的图片,图形,文字之类都很粗糙

img


明明和旁边编辑器的文字大小差不多,字体一样顺畅的多(标题字体还小一些)
但是锯齿很锋利,我能肯定我显示器分辨率没这么低

窗口设定分辨率800 * 600 (标记了pygame.SCALED)
原始分辨率2560 * 1600, 系统缩放200%
字体Jetbrains Mono 设定大小 20

  • 写回答

5条回答 默认 最新

  • 檀越@新空间 2025-08-26 14:43
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    你遇到的问题是 Pygame 渲染图形和文字显示粗糙、有锯齿,这可能与以下几个因素有关:


    一、问题原因分析

    1. 窗口缩放不正确
      你使用了 pygame.SCALED 标志,但如果你的系统设置了 200% 缩放,那么 Pygame 的渲染窗口可能会被系统自动缩放,导致图像模糊或锯齿。

    2. 字体抗锯齿设置不当
      Pygame 默认没有启用抗锯齿(anti-aliasing),导致文字边缘锋利,不够平滑。

    3. 图像缩放方式不恰当
      如果你加载的是低分辨率图片并直接缩放,也会导致画面粗糙。

    4. 显示器高 DPI 支持不足
      Pygame 对高 DPI 显示器的支持有限,尤其是在 Windows 系统中,需要手动处理缩放。


    二、解决方案

    1. 设置正确的窗口大小(考虑系统缩放)

    由于你的系统缩放为 200%,你需要根据这个比例调整 Pygame 的窗口大小。

    import pygame
    import sys
    
    # 获取系统 DPI 缩放比例(Windows)
    try:
        import ctypes
        user32 = ctypes.windll.user32
        scale = user32.GetScaleFactorForMonitor(0) / 100  # 例如 200% → 2.0
    except:
        scale = 1.0
    
    # 计算实际窗口大小(假设你希望显示 800x600 像素)
    window_size = (int(800 * scale), int(600 * scale))
    
    pygame.init()
    screen = pygame.display.set_mode(window_size, pygame.SCALED)
    

    重点: 使用 pygame.SCALED 并结合系统缩放比例来设置窗口大小,可以避免系统自动缩放导致的画面失真。


    2. 启用字体抗锯齿(Anti-Aliasing)

    Pygame 中可以通过 pygame.font.SysFontpygame.font.Font 加载字体,并设置 aa=True 来启用抗锯齿。

    font = pygame.font.SysFont("JetBrains Mono", 20, bold=False, italic=False)
    text_surface = font.render("Hello World", True, (255, 255, 255))
    

    重点: True 表示启用抗锯齿(anti-aliasing),使文字更清晰平滑。


    3. 图像处理:使用更高分辨率图像或双线性缩放

    如果你加载的是低分辨率图片,建议使用更高分辨率的图像。如果无法更换,可以使用 pygame.transform.smoothscale() 替代 pygame.transform.scale(),以获得更平滑的缩放效果。

    image = pygame.image.load("your_image.png")
    scaled_image = pygame.transform.smoothscale(image, (new_width, new_height))
    

    重点: 使用 smoothscale() 可以减少图像缩放时的锯齿感。


    4. 高 DPI 支持(Windows 系统)

    在 Windows 上,你可以通过以下方式让 Pygame 更好地支持高 DPI:

    方法一:修改注册表(高级用户)

    1. 打开注册表编辑器(regedit)。
    2. 定位到 HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM
    3. 新建一个 DWORD 值,命名为 UseDpiScaling,值设为 1
    4. 重启 Pygame 应用程序。

    方法二:使用 pywin32 设置 DPI 感知

    import ctypes
    ctypes.windll.user32.SetProcessDPIAware()
    

    重点: 这个方法可以让 Pygame 窗口感知系统的 DPI 缩放,避免被系统自动拉伸。


    三、完整示例代码

    import pygame
    import sys
    import ctypes
    
    # 设置 DPI 感知(Windows)
    ctypes.windll.user32.SetProcessDPIAware()
    
    # 获取系统 DPI 缩放比例(Windows)
    try:
        import ctypes
        user32 = ctypes.windll.user32
        scale = user32.GetScaleFactorForMonitor(0) / 100  # 例如 200% → 2.0
    except:
        scale = 1.0
    
    # 计算实际窗口大小(假设你希望显示 800x600 像素)
    window_size = (int(800 * scale), int(600 * scale))
    
    pygame.init()
    screen = pygame.display.set_mode(window_size, pygame.SCALED)
    
    # 加载字体并启用抗锯齿
    font = pygame.font.SysFont("JetBrains Mono", 20, bold=False, italic=False)
    text_surface = font.render("Hello World", True, (255, 255, 255))
    
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
    
        screen.fill((0, 0, 0))
        screen.blit(text_surface, (100, 100))
        pygame.display.flip()
    
    pygame.quit()
    sys.exit()
    

    四、总结

    | 问题 | 解决方案 | |------|----------| | 窗口缩放错误 | 使用 pygame.SCALED 并根据系统缩放比例调整窗口大小 | | 文字锯齿 | 使用 font.render(..., True, ...) 启用抗锯齿 | | 图像粗糙 | 使用 pygame.transform.smoothscale() 替代 scale() | | 高 DPI 支持 | 设置 SetProcessDPIAware() 或修改注册表 |

    重点: 在高 DPI 显示器上运行 Pygame 时,务必注意系统缩放和 DPI 感知设置,确保渲染质量不受影响。

    评论

报告相同问题?

问题事件

  • 创建了问题 8月26日