Map PyGame:在blitting之前加载磁贴图像信息?

Map PyGame:在blitting之前加载磁贴图像信息?,map,pygame,tile,Map,Pygame,Tile,我的项目是一个巨大的地图,可以在周围平移,其中包含可以点击的“信息点”。现在,我使用了四个大图像,每个图像跨度为5000x5000像素(因此总贴图大小为20'000x20'000像素)。在我的AMD Phenom 9950四核上,配备8GB RAM和NVIDIA GeForce 610,这需要一段时间才能加载,而之后在平移图像时速度相当快。我试着把它平铺起来,但是加载速度没有明显的提高,因为图像在分块之前仍然需要完全加载 要真正提高速度和内存使用率,唯一的办法是只加载地图图像中实际显示的部分。

我的项目是一个巨大的地图,可以在周围平移,其中包含可以点击的“信息点”。现在,我使用了四个大图像,每个图像跨度为5000x5000像素(因此总贴图大小为20'000x20'000像素)。在我的AMD Phenom 9950四核上,配备8GB RAM和NVIDIA GeForce 610,这需要一段时间才能加载,而之后在平移图像时速度相当快。我试着把它平铺起来,但是加载速度没有明显的提高,因为图像在分块之前仍然需要完全加载

要真正提高速度和内存使用率,唯一的办法是只加载地图图像中实际显示的部分。 PyGame是否提供了这样做的方法?我在考虑一个“理论”的瓷砖贴图,它包含每个瓷砖所需的x和y值(我将它们稍微分组,以计算每个帧)和一个理论图像信息(例如:哪个图像和其中的哪个位置)。只有当平铺靠近屏幕的可见部分时,才会加载其图像信息,否则它将保留数字和字符串值


这有什么意义吗?有什么方法可以实现这一点吗?

使用Pygame实现这一点的唯一方法是将图像本身分割成更小的正方形(例如250x250),然后,随着用户的平移,只需获取当前左上角的x、y坐标以及屏幕大小,并将适合该屏幕或缓冲区边缘周围的任何分片加载到内存中,并清除该范围以外的任何其他区域。除非您添加对旋转和/或缩放的支持,否则数学将相当简单。我会根据它们的位置以正方形大小的倍数来命名这些瓷砖(例如,500500处的瓷砖将被命名为2-2.png)。这将使生成需要在每个位置加载的磁贴名称变得非常简单-取当前x/y坐标,整数除以250,减去缓冲磁贴数量,然后循环使用屏幕宽度整数除以250加1,再加上每行的缓冲磁贴数量。对每一列进行循环。

阅读@lukevp的回复后,我很感兴趣并尝试了以下方法:

获取此图像并创建一个名为“test_data”的文件夹。现在将此图像、代码放在test_数据文件夹之外并运行。输出将是按顺序命名的裁剪图形(图像为1920*1080,边缘有点偏移)。你可以试试你的定制尺码。还请注意,我在ubuntu上,所以请注意使用适当的路径

输出:最终链接:

导入pygame,操作系统
pygame.init()
original_image=pygame.image.load('test_pic.jpg'))
x_max=1920
y_max=1080
电流_x=0
当前_y=0
计数=1
begin\u surf=pygame.Surface((x\u max,y\u max),flags=pygame.SRCALPHA)
开始冲浪(原始图片,(0,0))
裁剪的_surf=pygame.Surface((100100),flags=pygame.SRCALPHA)
当电流y+100小于y最大值时:
当电流x+100

正如他所说,我现在正在努力加载这些图像并跨越它们。

你的意思是一次只加载图像文件的一部分吗?是的,我正试图找到一种方法,只加载当前可见的瓷砖覆盖的整个图像的一部分(加上周围的一些“安全边界”)我怀疑Pygame对此有内置支持;你应该只分割图像本身。这正是重点:D是一个20'000x20'000像素的图像,而一个平铺是100x100像素;)总共有40000张图像;)我的意思是将它们拆分为多个较小的图像文件。:)谢谢你的回答!我解决了类似这样的问题——尽管我不得不承认这个项目已经搁置了大约三年……谢谢你的回答——这实际上是我当时采取的方法,尽管我在2014年春天停止了这个项目。
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