gpt4 book ai didi

python - 在 python pygame 中更快地绘图

转载 作者:太空宇宙 更新时间:2023-11-04 09:48:20 25 4
gpt4 key购买 nike

我使用 Python 和 pygame 制作了一个程序,它加载 Material 图片,然后创建 block ,每个 block 都分配有随机 Material 。Block 是一个类,在绘图过程中,它会遍历存储 block 的数组,但是速度很慢。有没有比将它们存储在数组中并循环访问更快的方法?

class block:
def __init__(self, texture, x, y):
self.texture = texture
self.x = x
self.y = y


material = pygame.image
material.grass = pygame.image.load("textures/grass.png")
material.water = pygame.image.load("textures/water.png")
material.sand = pygame.image.load("textures/sand.png")

materials = [material.grass, material.water, material.sand]



white = (255,255,255);(width, height) = (2048, 1008);black = (0, 0, 0);screen = pygame.display.set_mode((width, height))

b_unit = 16

b = []

count = 0
cx = 0
cy = 0
while count < (width * height) / (b_unit * b_unit):
b.append(block(random.choice(materials), b_unit * cx, b_unit * cy))
cx += 1
count += 1
if cx == width / b_unit:
cx = 0
cy += 1

while True:
for block in b:
screen.blit(block.texture, (block.x + viewx, block.y + viewy))
pygame.display.flip()

最佳答案

我已经在评论中提到你应该(几乎)总是 convert your images以提高性能。

它还可以帮助将单独的 images/pygame.Surfaces blit 到一个大的背景表面上,然后每帧只将这个背景 blit 一次。我在这里使用两个嵌套的 for 循环来获取坐标并随机 blit 两个图像之一。

如果我在这里使用单独的 Sprite (5184),我得到大约 120 fps,而对于这个单一的背景图像,我得到大约 430 fps。

当然,我只是在这里 blitting,在真正的游戏中,您可能必须将方 block 的矩形存储在列表中或使用 pygame Sprite 和 Sprite 组,例如实现碰撞检测或其他 map 相关逻辑, 所以帧率会更低。

import itertools

import pygame as pg
from pygame.math import Vector2


BLUE_IMAGE = pg.Surface((20, 20))
BLUE_IMAGE.fill(pg.Color('lightskyblue2'))
GRAY_IMAGE = pg.Surface((20, 20))
GRAY_IMAGE.fill(pg.Color('slategray4'))


def main():
screen = pg.display.set_mode((1920, 1080))
clock = pg.time.Clock()
all_sprites = pg.sprite.Group()

images = itertools.cycle((BLUE_IMAGE, GRAY_IMAGE))
background = pg.Surface(screen.get_size())
# Use two nested for loops to get the coordinates.
for y in range(screen.get_height()//20):
for x in range(screen.get_width()//20):
# This alternates between the blue and gray image.
image = next(images)
# Blit one image after the other at their respective coords.
background.blit(image, (x*20, y*20))
next(images)

done = False

while not done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = True

# Now you can just blit the background image once
# instead of blitting thousands of separate images.
screen.blit(background, (0, 0))
pg.display.set_caption(str(clock.get_fps()))
pg.display.flip()
clock.tick(1000)


if __name__ == '__main__':
pg.init()
main()
pg.quit()

旁注:不要将图像添加到 pygame.image 模块(这毫无意义)。

material = pygame.image
material.grass = pygame.image.load("textures/grass.png")

在同一行中用分号分隔写几条语句是非常丑陋的,并且会降低代码的可读性。

white = (255,255,255);(width, height) = (2048, 1008)

关于python - 在 python pygame 中更快地绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48952459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com