PyGame:在blitting之前加载平铺图像信息?

时间:2013-12-25 19:18:13

标签: map pygame tile

我的项目是一张大型地图,可以平移包含可以点击的“信息点”。现在我使用四个大图像,每个图像跨度为5000x5000像素(因此总图大小为20'000x20'000像素)。在我的带有8GB RAM的AMD Phenom 9950四核和NVIDIA GeForce 610上,这需要一段时间才能加载,而在平移图像后它会非常快。我试着把它拼凑起来,但加载速度没有明显的提升,因为在分割成瓷砖之前,图像仍然需要完全加载。

在速度和内存使用方面有一些真正改进的唯一方法是,只加载实际显示的地图图像的那些部分。 PyGame是否提供了这样做的方式?我正在考虑一个“理论上”的瓦片地图,其中包含每个瓦片所需的x和y值(我将它们分组,少用于计算每个帧)和理论图像信息(如:哪个图像及其中的哪个位置) 。只有当图块靠近屏幕的可见部分时,才会加载其图像信息,否则它仍然是数字和字符串值。

这有什么意义吗?有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:1)

使用Pygame实现这一目标的唯一方法是将图像自身分解为较小的正方形(例如250x250),然后,当用户平移时,只需获取当前的x,y坐标,以及屏幕尺寸,并将适合该屏幕或缓冲区边缘的任何图块加载到内存中,并清除该范围之外的任何其他图块。除非您添加对旋转和/或缩放的支持,否则数学将非常简单。我会将瓷砖的位置命名为方形尺寸的倍数(例如500,500的瓷砖将命名为2-2.png)。这将使生成需要在每个位置加载的切片名称变得非常简单 - 获取当前x / y坐标,整数除以250,减去缓冲区切片量,然后按屏幕宽度整数除以250循环加1加上每行的缓冲区块数量。为每一列做那个循环。

答案 1 :(得分:0)

在阅读了@lukevp的回复后,我很感兴趣并尝试了这个:

http://imgur.com/Q1N2UtU

转到此图像并创建名为“test_data”的文件夹。现在放置此图像,代码在test_data文件夹之外并运行。输出将是根据其顺序命名的裁剪数字(当图像为1920 * 1080时,边缘有点偏离)。您可以使用自定义尺寸进行尝试。另请注意,我在ubuntu上,所以请注意适当的路径。

输出:http://imgur.com/2v4ucGI最终链接:http://imgur.com/a/GHc9l

import pygame, os
pygame.init()

original_image = pygame.image.load('test_pic.jpg')

x_max = 1920
y_max = 1080

current_x = 0
current_y = 0

count = 1

begin_surf = pygame.Surface((x_max,y_max), flags = pygame.SRCALPHA)
begin_surf.blit(original_image,(0,0))

cropped_surf =  pygame.Surface((100,100),flags=pygame.SRCALPHA)

while current_y + 100 < y_max:

    while current_x + 100 < x_max:
    cropped_surf.blit(begin_surf, (0,0), (current_x, current_y,100,100))
    pygame.image.save(cropped_surf, os.path.join("test_data", str(count) + '.jpg'))

    current_x += 100

    count += 1

    current_x = 0

    current_y += 100

现在实际上正在努力加载这些图像并按照他说的那样跨越它们。