python - Pygame 运行速度超慢(~2 fps)

标签 python pygame

我的 pygame 游戏运行速度非常慢,大约 2 fps。您应该能够使用 WASD 四处移动,并且始终位于屏幕中央。我知道这与我的瓷砖 map 和我的数学计算方式有关,但我无法确定。另外,如果有更好的方法让玩家保持在中心位置,同时将 map 移到其后面,我很想知道如何做到这一点。

import pygame, sys, numpy
#create fps clock
clock = pygame.time.Clock()
#
MAPHEIGHT = 80
MAPWIDTH = 80
TILESIZE =  40
TILESONSCREENW = 13
TILESONSCREENH = 13
#set screen size
SCREENH = TILESONSCREENH*TILESIZE
SCREENW = TILESONSCREENW*TILESIZE
#create character vars
circleRad = 40
circleSpeed = 4
#create circle pos vars
circleX = 250
circleY = 250
#create keyboard button vars
rightP = False
leftP = False
upP = False
downP = False
#
playerOnTileS = pygame.Surface((MAPWIDTH*TILESIZE, MAPHEIGHT*TILESIZE))
#constants for the tilemap
GRASS = pygame.image.load("grass.png")
#tilemap
tilemap = [[GRASS for i in range(MAPHEIGHT)] for j in range(MAPWIDTH)]
#create window
DISPLAYSURF = pygame.display.set_mode((SCREENW, SCREENH))
#set window name
pygame.display.set_caption("Snowball Fight!")
#---------------------------------------------------
class Player:
    def __init__(self, playX, playY, size):
        self.playerX = playX
        self.playerY = playY
        self.size = size
        self.playerSurface = pygame.Surface((size, size))
        pygame.draw.rect(self.playerSurface, (19,135,67), (0,0,size, size))
#------------------------------------------------
    def update(self):
        playerOnTileS.blit(self.playerSurface, (self.playerX, self.playerY))
        DISPLAYSURF.blit(playerOnTileS, (SCREENW/2-self.playerX-self.size ,SCREENH/2-self.playerY-self.size))
#game loop
myPlayer = Player(0,0,circleRad)
while True:
    DISPLAYSURF.fill((0,0,0))
    for event in pygame.event.get():
        #if the user closed the window
        if event.type == pygame.QUIT:
            #close pygame
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_a:
                leftP = True
            if event.key == pygame.K_d:
                rightP = True
            if event.key == pygame.K_w:
                upP = True
            if event.key == pygame.K_s:
                downP = True
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_a:
                leftP = False
            if event.key == pygame.K_d:
                rightP = False
            if event.key == pygame.K_w:
                upP = False
            if event.key == pygame.K_s:
                downP = False
    if leftP:
        myPlayer.move(-circleSpeed,0,True)
    if rightP:
        myPlayer.move(circleSpeed,0,True)
    if downP:
        myPlayer.move(0,circleSpeed,True)
    if upP:
        myPlayer.move(0,-circleSpeed,True)
    for row in range(len(tilemap)):
        for column in range(len(tilemap[row])):
            playerOnTileS.blit(tilemap[row][column],(column*TILESIZE,row*TILESIZE))
    myPlayer.update()
    pygame.display.update()
    clock.tick(30)

最佳答案

Images/pygame.Surfaces 通常应使用 pygame.Surface.convert 进行转换或 convert_alpha 方法。未转换表面的性能很糟糕。当我转换草 map 像时,我得到了近 30 FPS。

下一个问题是嵌套的for循环。 Python 的函数调用开销相当大,因此最好在主循环开始之前将所有图 block blit 到一个大背景表面上,然后每帧一次将该背景表面 blit 到 DISPLAYSURF 上,以清除它。通过这一更改,我得到了 pygame 明显的最大 FPS,这意味着 clock.get_fps() 在 2000 和 1666.666 FPS 之间跳跃。

# Ahead of the while loop.
playerOnTileS = pygame.Surface((MAPWIDTH*TILESIZE, MAPHEIGHT*TILESIZE))
for row in range(len(tilemap)):
    for column in range(len(tilemap[row])):
        playerOnTileS.blit(tilemap[row][column],(column*TILESIZE,row*TILESIZE))

您必须更改 update 方法(顺便说一句,最好将其称为 draw),并将播放器表面 blit 到 DISPLAYSURF 上.

关于python - Pygame 运行速度超慢(~2 fps),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53752010/

相关文章:

Python/vtk - 在 vtkPolyData 对象中单独设置每个点大小?

python - pygame 中是否有事件处理选项来最小化和最大化屏幕?

python - 如何在pygame中从一种颜色淡入另一种颜色?

Python SSH paramiko 问题 - 来自 ssh session 内部的 ssh

python - 使用其他列中的一些值创建列 - 有条件

python - 时间序列数据框中的横截面权重

python - 在数据帧上使用 merge_first 并以重复日期作为索引

python - pygame 中的碰撞帮助以及当您使用角度和速度移动时如何阻止它撞到墙壁

python - 如何创建 "Solid" block ? pygame

python - 我只能检查二维数组的第一列