【问题标题】:What does the parameter DestSurface in Pygame.transform.scale mean and how do I use it?Pygame.transform.scale 中的参数 DestSurface 是什么意思,如何使用?
【发布时间】:2020-02-03 19:26:53
【问题描述】:

pygame.transform.scale 方法的文档如下。

scale(Surface, (width, height), DestSurface = None) -> Surface`

将 Surface 调整为新的分辨率。这是一种不会对结果进行采样的快速缩放操作。

可以使用可选的目标表面,而不是让它创建一个新表面。如果您想重复缩放某些东西,这会更快。但是目标必须与传入的(宽度、高度)大小相同。目标表面的格式也必须相同。”

我试图弄清楚目标表面是什么。我假设它与以下事实有关

【问题讨论】:

标签: python pygame


【解决方案1】:

pygame.transform.scale() 不会缩放输入 Surface 本身。它创建一个新表面并对新表面进行缩放“blit”。新的表面由返回值返回:

pygame.transform.scale() 会:

  1. 创建大小为 (width, height) 的新表面 (newSurface)。
  2. 缩放并将Surface复制到newSurface
  3. 返回newSurface

目标表面是一个pygame.Surface,缩放后的表面将复制到该表面。这样更快,因为不必为 Surface 分配内存。

DestSurface 已设置,然后 pygame.transform.scale() 设置:

  1. 缩放Surface 并将其复制到DestSurface
  2. 返回DestSurface

因此DestSurface的大小必须为(width, height)DestSurface的格式与Surface的格式相同。


一个可能的用例是,如果您必须在主应用程序循环中不断地将某些东西缩放到固定大小(例如,如果表面是动态生成的)。在下面surf 被假定为一个表面对象:

while True:
    # [...]

    scaledSurf = pygame.transform.scale(surf, (100, 100)) 
    window.blit(scaledSurf, (x, y)

使用DestSurface参数可以改进代码:

scaledSurf = pygame.Surface((100, 100))

while True:
    # [...]

    pygame.transform.scale(surf, (100, 100), scaledSurf) 
    window.blit(scaledSurf, (x, y)

这可能是一种罕见的情况。一般来说,您应该尝试在初始化时缩放表面,而不是在应用程序循环中连续缩放并在循环中使用缩放的表面。


不要尝试强制使用该参数,也不要“构建”DestSurface 参数的用例。反过来做。编写您的应用程序并使其运行。然后调查DestSurface 参数是否可以改进您的特定用例。

【讨论】:

  • 您好,非常感谢您的彻底澄清。更要感谢提醒重要的做法是在循环之前初始化而不是在循环中不断地初始化。作为一个新手程序员,我非常感谢你的指导。最佳,J
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 2014-02-18
相关资源
最近更新 更多