use*_*752 3 python performance pygame border
我在Pygame中有一些透明背景的表面.它们的大小都一样.但是每个圆上都绘制了一个不同大小的圆圈,因此圆圈并不完全适合图像.下面是一些示例图像(我在Photoshop中截取了截图,因此您可以清楚地看到图像的透明度和大小):

现在我想删除图像周围的透明边框,使圆圈完全适合图像.我不希望表面呈圆形,我不认为这是可能的,但我希望表面左侧和右侧没有空白列,顶部没有空白行和底部.想要的结果:

曲面上的圆每帧都会改变大小,因此我必须每帧重新计算新曲面.
我已经谷歌了,但我还没有找到任何关于Pygame表面的东西.我也尝试制作自己的功能,但它看起来很丑陋而且更糟糕:帧率从50(如果我不调用函数)下降到30 fps(如果我调用该函数).我测试了一下,我发现较小的圆圈比较大的圆圈需要更长的处理时间.我怎么能这样做,但速度更快.如果你想我可以展示我所做的功能.
surface对象有一个方法get_bounding_rect,我们将在这里开始.该函数返回可能的最小rect,其中包含曲面上的所有非透明像素.
pixel_rect = image.get_bounding_rect()
Run Code Online (Sandbox Code Playgroud)
使用此rect的大小,我们可以创建一个新表面:
trimmed_surface = pygame.Surface(pixel_rect.size)
Run Code Online (Sandbox Code Playgroud)
现在的blit的所述部分image包含在pixel_rect到trimmed_surface:
trimmed_surface.blit(image, (0,0), pixel_rect)
Run Code Online (Sandbox Code Playgroud)
此时,trimmed_surface应该是pixel_rect与原始表面不同的透明行和列"修剪" 的表面尺寸相同的表面.
Surface.get_bounding_rect的文档:http://www.pygame.org/docs/ref/surface.html#Surface.get_bounding_rect