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

明明和旁边编辑器的文字大小差不多,字体一样顺畅的多(标题字体还小一些)
但是锯齿很锋利,我能肯定我显示器分辨率没这么低
窗口设定分辨率800 * 600 (标记了pygame.SCALED)
原始分辨率2560 * 1600, 系统缩放200%
字体Jetbrains Mono 设定大小 20
我写个Pygame小程序,但是发现渲染上去的图片,图形,文字之类都很粗糙

窗口设定分辨率800 * 600 (标记了pygame.SCALED)
原始分辨率2560 * 1600, 系统缩放200%
字体Jetbrains Mono 设定大小 20
下午好🌅🌅🌅
本答案参考通义千问
你遇到的问题是 Pygame 渲染图形和文字显示粗糙、有锯齿,这可能与以下几个因素有关:
窗口缩放不正确
你使用了 pygame.SCALED 标志,但如果你的系统设置了 200% 缩放,那么 Pygame 的渲染窗口可能会被系统自动缩放,导致图像模糊或锯齿。
字体抗锯齿设置不当
Pygame 默认没有启用抗锯齿(anti-aliasing),导致文字边缘锋利,不够平滑。
图像缩放方式不恰当
如果你加载的是低分辨率图片并直接缩放,也会导致画面粗糙。
显示器高 DPI 支持不足
Pygame 对高 DPI 显示器的支持有限,尤其是在 Windows 系统中,需要手动处理缩放。
由于你的系统缩放为 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并结合系统缩放比例来设置窗口大小,可以避免系统自动缩放导致的画面失真。
Pygame 中可以通过 pygame.font.SysFont 或 pygame.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),使文字更清晰平滑。
如果你加载的是低分辨率图片,建议使用更高分辨率的图像。如果无法更换,可以使用 pygame.transform.smoothscale() 替代 pygame.transform.scale(),以获得更平滑的缩放效果。
image = pygame.image.load("your_image.png")
scaled_image = pygame.transform.smoothscale(image, (new_width, new_height))
重点: 使用
smoothscale()可以减少图像缩放时的锯齿感。
在 Windows 上,你可以通过以下方式让 Pygame 更好地支持高 DPI:
regedit)。HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM。DWORD 值,命名为 UseDpiScaling,值设为 1。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 感知设置,确保渲染质量不受影响。