【问题标题】:Will Pygame blit sprites with a rect outside the displayPygame 是否会在显示屏外使用矩形对精灵进行 blit
【发布时间】:2017-01-04 05:47:42
【问题描述】:

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

谢谢

【问题讨论】:

    标签: python-2.7 pygame blit pygame-surface


    【解决方案1】:

    不,它不会对图像进行 blit。如果您尝试对屏幕外的内容进行 blit,Pygame 将简单地忽略它。除非有大量对象,否则它不应该减慢您的程序,因为 pygame 需要一小部分时间来确定图像在屏幕之外。不过,这并不是什么大不了的事。

    意识到我的答案缺乏证据(这很糟糕,mkay...),所以我进行了一些测试来证明我的观点。我测试了 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 秒

    如您所见,在屏幕外进行 blitting 比不进行 blitting 需要更多的时间,但它并不像实际在屏幕上 blitting 花费的时间那么多。在屏幕外进行 Blitting 几乎没有成本。

    为了进一步参考,这是我创建的测试:

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

    【讨论】:

    • 好吧,这就是我的想法,但由于我不知道 blit 函数中隐藏了什么,我不确定它是否会进行大量计算。
    • @Sorade 我已经更新了我的答案以包含更多信息和实际证明我是正确的,这样你就不必盲目相信一个可以上网的疯子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多