У меня возникла проблема: направление, в котором смотрит игрок, фактически определяет частоту кадров в игре: при 45 градусах она уменьшается почти вдвое, а затем возвращается к нормальному значению при 90. Я знаю, что вращение растровых изображений требует больших ресурсов процессора, но я полагал, что точное направление не будет иметь большого влияния на производительность.


Я исследовал возможные решения моей проблемы. Предварительный поворот нескольких углов под разными углами на самом деле не является приемлемым решением, поскольку карты достаточно велики, и отображение полной карты само по себе приводит к проблемам с производительностью. Чтобы решить эту проблему, я рисую только несколько тайлов за раз, но это означает, что для предварительного поворота карты мне, по сути, придется кэшировать все возможные углы всех возможных комбинаций тайлов, которые могут существовать в данный момент, что, я думаю, не то, что большинство машин воспримут хорошо.
Есть ли какая-то явная проблема с оптимизацией моего кода? Есть ли у меня какие-либо другие варианты поворота изображения, возможно, за пределами библиотеки pygame? Или я обречен отказаться от этой игровой идеи или создать ее на другом языке/движке?
Это код функции, которая масштабирует и вращает карту:
Код: Выделить всё
import pygame
import math as m
from settings import *
def camerafy(mapsurface, destsurface, zoom, direction):
"""
Given a surface input, this function resizes and rotates it to reflect the player's
position and direction.
"""
angle = m.radians(-direction)# I hate working with radians. Conversion is important.
# zoompos is just the position to display the map at after map resize but before
# rotation
zoompos = 0.5*RESOLUTIONMULT*zoom*TILESIZE,0.5*RESOLUTIONMULT*zoom*TILESIZE
# The 0.5's just center player
# all of this is to calculate the position to display the map in after rotation and
# zoom.
x1 = zoompos[0]*m.cos(angle) - zoompos[1]*m.sin(angle)
y1 = zoompos[0]*m.sin(angle) + zoompos[1]*m.cos(angle)
calcpos = -x1, -y1
# rotates and scales the map surface
newsurface = pygame.transform.scale_by(mapsurface, RESOLUTIONMULT*zoom)
newsurface = pygame.transform.rotate(newsurface, direction)
# rect is important for it to rotate on center instead of from the top right or
# wherever
newrect = newsurface.get_rect(center = (calcpos[0] + RESOLUTION[0]/2, calcpos[1] + \
RESOLUTION[1]/8*6))
destsurface.blit(newsurface, newrect) # draw map on screen
Мобильная версия