当 win.blit() 后台 pygame 时滞后

Posted

技术标签:

【中文标题】当 win.blit() 后台 pygame 时滞后【英文标题】:Lag when win.blit() background pygame 【发布时间】:2019-12-12 20:10:17 【问题描述】:

我的游戏帧率有问题。我已将其设置为 60,但它只能达到 ~25fps。在显示背景之前这不是问题(只有win.fill(WHITE) 很好)。这里有足够的代码来重现:

import os, pygame
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (50, 50)
pygame.init()

bg = pygame.image.load('images/bg.jpg')

FPS = pygame.time.Clock()
fps = 60

WHITE = (255, 255, 255)
BLUE = (0, 0, 255)

winW = 1227
winH = 700
win = pygame.display.set_mode((winW, winH))
win.fill(WHITE)
pygame.display.set_icon(win)


def redraw_window():

    #win.fill(WHITE)
    win.blit(bg, (0, 0))

    win.blit(text_to_screen('FPS: '.format(FPS.get_fps()), BLUE), (25, 50))

    pygame.display.update()


def text_to_screen(txt, col):
    font = pygame.font.SysFont('Comic Sans MS', 25, True)
    text = font.render(str(txt), True, col)
    return text


run = True
while run:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    redraw_window()

    FPS.tick(fps)

pygame.quit()

【问题讨论】:

一次创建字体就足够了,而不是每次绘制文本时。将font = pygame.font.SysFont('Comic Sans MS', 25, True) 移动到应用程序的开头(在pygame.init() 之后和主应用程序循环之前) 肯定有帮助,不知道为什么我一开始不这样做。显示图像仍然会降低帧率 t(使用 win.fill 最多可提高 16 倍)。 如果你这样做bg = pygame.image.load('images/bg.jpg').convert()会改变吗? 现在做了,效果很好。谢谢 问题解决了吗?答案可以接受吗? (答案左侧的复选标记)。 【参考方案1】:

确保背景 Surface 与显示 Surface 具有相同的格式。使用convert() 创建具有相同像素格式的 Surface。这应该会提高性能,当背景为 blit 时,因为格式是兼容的,blit 不必进行隐式转换。

bg = pygame.image.load('images/bg.jpg').convert()

此外,一次创建字体就足够了,而不是每次绘制文本时。将font = pygame.font.SysFont('Comic Sans MS', 25, True) 移动到应用程序的开头(在pygame.init() 之后和主应用程序循环之前)

【讨论】:

@LåneBook 不客气。答案可以接受吗? (答案左侧的复选标记)。请阅读What should I do when someone answers my question? 好建议。这是另一个:缓存您使用font.render() 创建的Surface。就性能成本而言,渲染文本非常昂贵。 @sloth 当然可以。但遗憾的是,至少在这种情况下,文本似乎是动态的 (fps)。【参考方案2】:

改为使用screen.blit(pygame.image.load(picture.png)) 只需image = pygame.image.load(picture.png) 然后screen.blit(image)

(如果你不断地加载你的图片会卡顿)

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于当 win.blit() 后台 pygame 时滞后的主要内容,如果未能解决你的问题,请参考以下文章

Listview滚动时滞后,添加项目时崩溃

RecyclerView 滚动时滞后

如何创建一个空字符串并更新它[重复]

时滞微分方程求解之三ddesd--变时滞

matlab用dde23求解带有固定时滞的时滞微分方程

与熊猫的互相关(时滞相关)?