Sor*_*ade 2 pygame blit python-2.7 pygame-surface
我目前正在开发一款 2D 顶视图的太空探索游戏。我有很多行星,由于地图跨度比显示范围大得多,我最终会在显示区域之外看到很多行星精灵。目前,我认为如果精灵不在显示器中,Pygame实际上不会位图传输精灵(据我所知,位图传输和绘制到表面会大大减慢速度),这是真的吗?或者我是否需要添加一个条件来检查精灵是否位于 blit 调用之前的显示器内?我问的原因是,我的游戏的工作方式是,每次发现一颗行星时,就会创建 2 个新行星……这意味着游戏可能会变得相当大,而且可能会非常慢。
谢谢
不,它不会破坏图像。如果你试图 blit 屏幕之外的东西,Pygame 会简单地忽略它。它不会减慢你的程序,除非有大量的对象,因为 pygame 需要一小部分时间来确定图像是否在屏幕之外。不过,这不是什么大不了的事。
意识到我的答案缺乏证据(这很糟糕,嗯……),所以我进行了一些测试来证明我的观点。我测试了 3 个条件:位图传输到屏幕、位图传输到屏幕外以及不执行任何操作。它们所花费的秒数微不足道,因为它们是基于我的计算机的性能(一台 5 年的笔记本电脑),因此请寻找它们之间的因素;它们对每个人来说都应该是相似的。
正如您所看到的,在屏幕之外进行位图传送比不进行位图传送需要更多的时间,但它所花费的时间几乎没有实际位图传送到屏幕上那么多。在屏幕之外进行位块传输几乎没有任何成本。
为了进一步参考,这是我创建的测试:
setup = """
import pygame
pygame.init()
screen = pygame.display.set_mode((100, 100))
image = pygame.Surface((100, 100))
"""
statement1 = """
for i in range(5000):
screen.blit(image, (0, 0))
"""
statement2 = """
for i in range(5000):
screen.blit(image, (200, 200))
"""
statement3 = """
for i in range(5000):
pass
"""
from timeit import timeit
num_of_times = 10000
inside = timeit(stmt=statement1, setup=setup, number=num_of_times)
outside = timeit(stmt=statement2, setup=setup, number=num_of_times)
nothing = timeit(stmt=statement3, setup=setup, number=num_of_times)
print("Inside: {} seconds".format(inside/num_of_times))
print("Outside: {} seconds".format(outside/num_of_times))
print("Nothing: {} seconds".format(nothing/num_of_times))
Run Code Online (Sandbox Code Playgroud)