Python 如何使pygame只加载屏幕上显示的图形

Python 如何使pygame只加载屏幕上显示的图形,python,python-3.x,pygame,python-3.6,Python,Python 3.x,Pygame,Python 3.6,我正在用Python和Pygame与我的团队创建一个游戏。 这是一款基于zombsroyee.io的2d皇家战斗游戏 由于地图非常大,游戏开始延迟,因为它正在加载整个地图,甚至是屏幕上没有显示的部分 我们希望pygame只加载当前显示在屏幕上的图形,当您移动时,停止加载当前未显示的图形并加载新图形 我们如何在Python3中实现这一点 谢谢你的阅读 编辑:我们还检查了当我们将屏幕窗口大小设置为较小的(例如680x680)时,游戏是否不太滞后。如何使游戏的性能在大窗口(例如1280x720)下保持

我正在用Python和Pygame与我的团队创建一个游戏。 这是一款基于zombsroyee.io的2d皇家战斗游戏

由于地图非常大,游戏开始延迟,因为它正在加载整个地图,甚至是屏幕上没有显示的部分

我们希望pygame只加载当前显示在屏幕上的图形,当您移动时,停止加载当前未显示的图形并加载新图形

我们如何在Python3中实现这一点

谢谢你的阅读


编辑:我们还检查了当我们将屏幕窗口大小设置为较小的(例如680x680)时,游戏是否不太滞后。如何使游戏的性能在大窗口(例如1280x720)下保持良好?

据我所知,没有内置功能。您可以将图像分割为矩形网格,并仅加载包含当前位置可见内容的子图像。您可能希望缓存一个特定的最大数量,以避免一次将它们全部加载到内存中。如果您可以将整个图像加载到内存中并保存在内存中,则会简单得多,因此无需再次加载。您可以在开始时加载地图一次,并将其保存在单独的曲面上,然后在屏幕上仅显示屏幕上显示的地图部分。要做到这一点,你需要在相机移动时跟踪矩形。也许问题不仅仅在于地图。通常,在每一帧中对整个屏幕进行分屏是非常耗时的。“SDL还有一些其他的设计限制,比如全屏滚动图形可以很快将游戏速度降低到无法玩的程度。”是的,这当然是一张大地图。我认为处理它的一种方法是使用
mmap
将(未压缩的)像素数据从它映射到虚拟内存中,然后使用字符串切片来提取和组装形成要显示的矩形区域的像素
pygame
有一个
image.fromstring()
函数,允许从组合数据创建新曲面。这种方法的一个优点是,它将使用操作系统的虚拟内存页面处理来管理实际存储在物理内存中的数据量。如果你有一个这么大的地图,请记住,你也不需要在每一帧都对整个地图上的每个对象进行blit!在大多数情况下,如果您检查屏幕上哪些对象是可见的,哪些对象离您很近(例如,在每个方向上都在屏幕大小的+20%范围内,以覆盖屏幕中间的精灵),而不obj.blit()其他对象,这就足够了。您将需要不断更新所有对象的位置,但不必临时更新95%的可用对象,这样会稍微提高性能;)据我所知,没有任何内在的东西。您可以将图像分割为矩形网格,并仅加载包含当前位置可见内容的子图像。您可能希望缓存一个特定的最大数量,以避免一次将它们全部加载到内存中。如果您可以将整个图像加载到内存中并保存在内存中,则会简单得多,因此无需再次加载。您可以在开始时加载地图一次,并将其保存在单独的曲面上,然后在屏幕上仅显示屏幕上显示的地图部分。要做到这一点,你需要在相机移动时跟踪矩形。也许问题不仅仅在于地图。通常,在每一帧中对整个屏幕进行分屏是非常耗时的。“SDL还有一些其他的设计限制,比如全屏滚动图形可以很快将游戏速度降低到无法玩的程度。”是的,这当然是一张大地图。我认为处理它的一种方法是使用
mmap
将(未压缩的)像素数据从它映射到虚拟内存中,然后使用字符串切片来提取和组装形成要显示的矩形区域的像素
pygame
有一个
image.fromstring()
函数,允许从组合数据创建新曲面。这种方法的一个优点是,它将使用操作系统的虚拟内存页面处理来管理实际存储在物理内存中的数据量。如果你有一个这么大的地图,请记住,你也不需要在每一帧都对整个地图上的每个对象进行blit!在大多数情况下,如果您检查屏幕上哪些对象是可见的,哪些对象离您很近(例如,在每个方向上都在屏幕大小的+20%范围内,以覆盖屏幕中间的精灵),而不obj.blit()其他对象,这就足够了。您将需要不断更新所有对象的位置,但不必临时更新95%的可用对象,这样会稍微提高性能;)