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


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

  
  将Surface调整为新的分辨率。这是一种快速缩放操作,不会对结果进行采样。
  
  可以使用可选的目标表面,而不用创建新的目标表面。如果要重复缩放某些内容,这会更快。但是,目的地的大小必须与传入的(宽度,高度)大小相同。另外,目的地表面的格式也必须相同。”


我试图弄清楚什么是目的地表面。我假设它与以下事实有关:每当我重新缩放表面时都会创建一个新的表面对象,以及如何使用DestSurface避免出现这种情况?

最佳答案

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

pygame.transform.scale()可以:


创建尺寸为newSurface的新曲面((width, height))。
缩放并将Surface复制到newSurface
返回newSurface


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

设置DestSurface后,pygame.transform.scale()会执行以下操作:


缩放并复制SurfaceDestSurface
返回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参数是否可以改进您的特定用例。

关于python - Pygame.transform.scale中的DestSurface参数是什么意思,该如何使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60045882/

10-10 22:00