Я пишу какое-то средство просмотра изображений, в котором пользователь может использовать камеру для панорамирования/масштабирования изображений.
Пользователь должен иметь возможность значительно увеличивать масштаб, чтобы увидеть детали на изображениях с высоким разрешением.
Когда изображения маленькие относительно размера окна приложения, я получаю около 300 кадров в секунду, и чем меньше изображения, тем выше частота кадров. Однако, когда я увеличиваю изображение так, что изображение почти заполняет окно приложения, частота кадров падает до менее 10 кадров в секунду ...
Мои изображения представляют собой PNG с довольно высоким разрешением (по большей части около 2000x1000), но я пробовал с изображениями меньшего размера, и у меня возникают те же проблемы с производительностью.
Я уже довольно много искал решений этой проблемы, но ничего полезного не нашел.
Я уже использую функцию "convert()
" (точнее функцию "convert_alpha()
")
Я использую pygame.transform.scale
для масштабирования изображений, чтобы имитировать масштабирование камеры. Вот моя функция set_scale()
:
def set_scale(self, factor):
self.original_rect_size *= factor
self.rect.size = self.original_rect_size
self.image = pygame.transform.scale(self.original_im, Vector2(self.original_rect_size.x*factor, self.original_rect_size.y*factor))
self.rect.size = Vector2(self.original_rect_size.x*factor, self.original_rect_size.y*factor)
Я использую pygame.sprite.LayeredUpdates()
, чтобы сгруппировать и нарисовать все изображения.
Есть ли способ улучшить производительность? Возможно, я делаю что-то не так, так как я новичок в pygame.
Большое спасибо !
pygame.transform.scale
— очень дорогая операция. Масштабируйте изображение только при изменении коэффициента масштабирования:
class YouClass:
def __init__(self):
# [...]
self.factor = 1
def set_scale(self, factor):
if factor != self.factor:
self.factor = factor
self.original_rect_size *= factor
self.rect.size = self.original_rect_size
self.image = pygame.transform.scale(self.original_im, Vector2(self.original_rect_size.x*factor, self.original_rect_size.y*factor))
self.rect.size = Vector2(self.original_rect_size.x*factor, self.original_rect_size.y*factor)