Python 如何减少pygame中的延迟和CPU使用?(pytmx用于加载地图)
我在比赛中有一个很大的滞后问题。我的游戏有一张很大的地图。这张地图是250x250。每块瓷砖为32x32。请注意,我使用的是旧的笔记本电脑。当我打开任务管理器时,它说我的CPU使用率高达50%,但内存使用率只有30-40MB。我是一个初学者,所以我将感谢任何帮助。 我正在使用从YouTube教程中获得的代码。为了配合我的项目,我做了一些修改Python 如何减少pygame中的延迟和CPU使用?(pytmx用于加载地图),python,pygame,pytmx,Python,Pygame,Pytmx,我在比赛中有一个很大的滞后问题。我的游戏有一张很大的地图。这张地图是250x250。每块瓷砖为32x32。请注意,我使用的是旧的笔记本电脑。当我打开任务管理器时,它说我的CPU使用率高达50%,但内存使用率只有30-40MB。我是一个初学者,所以我将感谢任何帮助。 我正在使用从YouTube教程中获得的代码。为了配合我的项目,我做了一些修改 import pygame as pg, time, random from pygame.locals import * from
import pygame as pg, time, random
from pygame.locals import *
from pytmx.util_pygame import load_pygame
def blit_all_tiles(screen, tmxdata, world_offset):
for layer in tmxdata:
for tile in layer.tiles():
# tile[0] = x coordinate
# tile[1] = y coordinate
# tile[2] = image data
x_pixel = tile[0] * 32 + world_offset[0]
y_pixel = tile[1] * 32 + world_offset[1]
screen.blit(tile[2], (x_pixel, y_pixel))
# Game Variables
def main():
tmxdata = load_pygame("assets/Chris' adventure.tmx")
# Standing
player_stand = pg.image.load("CharAssets/Cris 01.png")
player_stand = pg.transform.scale(player_stand, (32, 32))
# Moving Right
player_left = [
pg.image.load("CharAssets/Cris 04.png"),
pg.image.load("CharAssets/Cris 05.png"),
pg.image.load("CharAssets/Cris 06.png"),
]
player_up = [
pg.image.load("CharAssets/Cris 07.png"),
pg.image.load("CharAssets/Cris 08.png"),
pg.image.load("CharAssets/Cris 09.png"),
]
player_down = [
pg.image.load("CharAssets/Cris 01.png"),
pg.image.load("CharAssets/Cris 02.png"),
pg.image.load("CharAssets/Cris 03.png"),
]
# Resize
player_left = [pg.transform.scale(image, (32, 32)) for image in player_left]
player_left_f = 0
player_up = [pg.transform.scale(image, (32, 32)) for image in player_up]
player_up_f = 0
player_down = [pg.transform.scale(image, (32, 32)) for image in player_down]
player_down_f = 0
# Flipping
player_right = [pg.transform.flip(image, True, False) for image in player_left]
player_right_f = 0
direction = "stand"
world_offset = [0, 0]
quit = False
x = 400
y = 200 + 128
# Game Loop
while not quit:
screen.fill((0, 0, 0))
blit_all_tiles(screen, tmxdata, world_offset)
# Events
keypressed = pg.key.get_pressed()
for event in pg.event.get():
# print(event)
if event.type == QUIT:
quit = True
if keypressed[ord("a")]:
x = x - 20
world_offset[0] += 40
direction = "left"
if sum(keypressed) == 0:
direction = "stand"
if keypressed[ord("d")]:
x = x + 20
world_offset[0] -= 40
direction = "right"
if keypressed[ord("w")]:
y = y - 20
world_offset[1] += 40
direction = "up"
if keypressed[ord("s")]:
y = y + 20
world_offset[1] -= 40
direction = "down"
if y < 204:
y = 204
if y >= screen.get_height() - 204 - 32:
y = screen.get_height() - 204 - 32
if x < 204:
x = 204
# world_offset[0] += 10
if x >= screen.get_width() - 204 - 32:
x = screen.get_width() - 204 - 32
# Game Logic
# player = Rect(x, y, 32, 32)
# pg.draw.rect(screen, (225, 0, 120), player)
if direction == "stand":
screen.blit(player_stand, (x, y))
elif direction == "left":
screen.blit(player_left[player_left_f], (x, y))
player_left_f = (player_left_f + 1) % len(player_left)
elif direction == "right":
screen.blit(player_right[player_right_f], (x, y))
player_right_f = (player_right_f + 1) % len(player_right)
elif direction == "up":
screen.blit(player_up[player_up_f], (x, y))
player_up_f = (player_up_f + 1) % len(player_up)
elif direction == "down":
screen.blit(player_down[player_down_f], (x, y))
player_down_f = (player_down_f + 1) % len(player_down)
# Screen Update
pg.display.update()
clock.tick(60)
# Game Initialization
if __name__ == "__main__":
width, height = 800, 600
pg.init()
pg.mixer.init()
screen = pg.display.set_mode((width, height))
pg.display.set_caption("Chris' quest")
clock = pg.time.Clock()
main()
pg.quit()
将pygame导入为pg、时间、随机
从pygame.locals导入*
从pytmx.util_pygame导入加载_pygame
def blit_所有分幅(屏幕、tmxdata、世界偏移):
对于tmxdata中的层:
对于层中的平铺。平铺():
#平铺[0]=x坐标
#平铺[1]=y坐标
#平铺[2]=图像数据
x_像素=平铺[0]*32+世界_偏移[0]
y_像素=平铺[1]*32+世界_偏移[1]
blit(平铺[2],(x_像素,y_像素))
#博弈变量
def main():
tmxdata=load_pygame(“assets/Chris'aventure.tmx”)
#站立
player_stand=pg.image.load(“CharAssets/Cris 01.png”)
玩家站=pg.transform.scale(玩家站,(32,32))
#向右移动
玩家左=[
pg.image.load(“CharAssets/Cris 04.png”),
pg.image.load(“CharAssets/Cris 05.png”),
pg.image.load(“CharAssets/Cris 06.png”),
]
玩家向上=[
pg.image.load(“CharAssets/Cris 07.png”),
pg.image.load(“CharAssets/Cris 08.png”),
pg.image.load(“CharAssets/Cris 09.png”),
]
玩家_向下=[
pg.image.load(“CharAssets/Cris 01.png”),
pg.image.load(“CharAssets/Cris 02.png”),
pg.image.load(“CharAssets/Cris 03.png”),
]
#调整大小
player_left=[pg.transform.scale(图像,(32,32))用于player_left中的图像]
玩家左\u f=0
player_up=[pg.transform.scale(图像,(32,32))用于player_up中的图像]
游戏者_up _f=0
player_down=[pg.transform.scale(图像,(32,32))用于player_down中的图像]
玩家_向下_f=0
#翻转
player_right=[pg.transform.flip(图像,真,假)用于player_left中的图像]
玩家\u右\u f=0
方向=“站立”
世界单位偏移量=[0,0]
退出=错误
x=400
y=200+128
#游戏循环
不退出时:
屏幕填充((0,0,0))
blit_all_磁贴(屏幕、tmxdata、世界偏移)
#事件
keyppressed=pg.key.get_pressed()
对于pg.event.get()中的事件:
#打印(事件)
如果event.type==退出:
退出=真
如果按下[ord(“a”)]键:
x=x-20
世界单位偏移量[0]+=40
方向=“左”
如果总和(按键)==0:
方向=“站立”
如果按下[ord(“d”)]键:
x=x+20
世界单位偏移量[0]=40
direction=“right”
如果按下[ord(“w”)]键:
y=y-20
世界单位偏移量[1]+=40
方向=“向上”
如果按下[ord(“s”)]键:
y=y+20
世界单位偏移量[1]=40
方向=“向下”
如果y<204:
y=204
如果y>=屏幕。获取高度()-204-32:
y=screen.get_height()-204-32
如果x<204:
x=204
#世界_偏移量[0]+=10
如果x>=screen.get_width()-204-32:
x=屏幕。获取宽度()-204-32
#博弈逻辑
#player=Rect(x,y,32,32)
#pg.draw.rect(屏幕,(225,0,120),播放器)
如果方向==“站立”:
屏幕。blit(玩家站,(x,y))
elif方向==“左”:
blit(player_left[player_left_f],(x,y))
玩家左f=(玩家左f+1)%len(玩家左)
elif方向==“右”:
blit(player_right[player_right_f],(x,y))
玩家右f=(玩家右f+1)%len(玩家右)
elif方向==“向上”:
blit(player\u up[player\u up\u f],(x,y))
玩家上浮=玩家上浮+1)%len(玩家上浮)
elif方向==“向下”:
blit(player_down[player_down_f],(x,y))
玩家倒下(玩家倒下+1)%len(玩家倒下)
#屏幕更新
pg.display.update()
时钟滴答(60)
#游戏初始化
如果名称=“\uuuuu main\uuuuuuuu”:
宽度,高度=800600
第init页()
pg.mixer.init()
屏幕=pg.display.set_模式((宽度、高度))
pg.display.set_标题(“克里斯的任务”)
时钟=pg.time.clock()
main()
第页退出
我成功地导入了地图,它现在可以工作了,但滞后是极端的。我很困惑,不知道如何解决这个问题。我会很感激你的帮助。提前感谢。确保图像表面的格式与显示表面的格式相同。使用(或)创建具有相同像素格式的曲面。当图像在显示器上显示为blit
时,这将提高性能,因为格式兼容且blit
不需要执行隐式转换
例如:
player\u stand=pg.image.load(“CharAssets/Cris 01.png”)
player_stand=pg.image.load(“CharAssets/Cris 01.png”).convert_alpha()
另一个选择是创建游戏的单个大型地图 通过在地图上绘制所有平铺,创建一个与整个地图大小相同的平铺:
def create_map():
game_map=pygame.Surface((250*32250*32))
对于tmxdata中的层:
对于层中的平铺。平铺():
#平铺[0]=x坐标
#平铺[1]=y坐标
#平铺[2]=图像数据
x_像素=平铺[0]*32
y_像素=平铺[1]*32
游戏地图.blit(平铺[2],(x_像素,y_像素))
返回游戏地图
game\u map=create\u map()
在应用程序中,使用blit
方法的可选区域参数,仅在屏幕上绘制地图的一部分:
不退出时:
# [...]
sub_区域=屏幕。get_rect(左上角=世界偏移)
屏幕。blit(游戏地图,(0,0),子区域)
# [...]
此解决方案提高了性能