python-2.7 - Pygame 会在显示器外用一个矩形 blit Sprite 吗

标签 python-2.7 pygame blit pygame-surface

我目前正在开发一款 2D 俯 View 太空探索游戏。我有很多行星,由于 map 跨度比显示大得多,所以我最终在显示区域外看到了很多行星 Sprite 。目前我认为如果 Sprite 不在显示器中,Pygame 实际上不会 blit Sprite (据我所知,它 blitting 和绘制到表面会减慢很多事情)是真的吗?或者我需要添加一个条件来检查 sprite 是否在 blit 调用之前位于显示中?我问的原因是我的游戏的运行方式是每次发现一个行星时都会创建 2 个新行星......这意味着游戏可能会变得非常大,而且可能会非常慢。

谢谢

最佳答案

不,它不会阻塞图像。如果你试图 blit 屏幕外的东西,Pygame 会简单地忽略它。它不应该减慢你的程序,除非有大量的对象,因为 pygame 需要一小部分时间来确定图像在屏幕之外。但这不是什么大问题。

意识到我的回答缺乏证据(这很糟糕,我想……),所以我进行了一些测试来证明我的观点。我测试了 3 种情况:blitting 到屏幕,blitting 到屏幕外,什么都不做。他们花费的秒数是微不足道的,因为它们是基于我的计算机的性能(一台 5 岁的笔记本电脑),所以寻找它们之间的因素;他们应该对每个人都是相似的。

5,000 个比特

  • 内部:0.033265519510593734 秒
  • 外部:0.002402466401003767 秒
  • 无:0.00023237229449441657 秒

500,000 个比特

  • 内部:3.639024520190433 秒
  • 外部:0.23328839021967726 秒
  • 无:0.023549600850092247 秒

50,000,000 个比特

  • 内部:360.48034191795153 秒
  • 外部:23.317473949049596 秒
  • 无:2.3507101910654455 秒

如您所见,在屏幕外进行 blit 传输比不进行 blit 传输要花费更多的时间,但它所花费的时间几乎没有实际 blit 传输到屏幕上所花费的时间多。在屏幕外闪烁几乎没有成本。

为了进一步引用,这是我创建的测试:

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))

关于python-2.7 - Pygame 会在显示器外用一个矩形 blit Sprite 吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39185187/

相关文章:

python - import * 只允许在模块级别。使用 Pyscripter 的 Python 3.3

python - Pygame blit 区域参数?

python - 权限错误 : [Errno 13] Permission denied: 'file.mp3'

python - 在python中查找并删除以特定子字符串开头和结尾的字符串

python - 属性错误 : module 'django.contrib.postgres.fields' has no attribute 'JSONField'

python - 我可以使用 google.api.search 匹配所有内容并仅按类别过滤吗?

python - 程序中的奇怪错误,某些对象在使用后出现 "turns off"

python - 如何在 python 中将图像 block 传输到特定图像的区域内?

python-2.7 - Mandrill python API 附件错误信息