Как мне запретить Transform.rotate() снижать мой FPS?Python

Программы на Python
Ответить
Anonymous
 Как мне запретить Transform.rotate() снижать мой FPS?

Сообщение Anonymous »

Я работал над игрой сверху вниз, в которой вместо того, чтобы персонаж игрока смотрел на мышь, карта вращалась вокруг игрока. Направление карты меняется движением мыши, игрок смотрит в ту же сторону. По сути, представьте, что вы стоите лицом прямо вниз в шутере от третьего лица.
У меня возникла проблема: направление, в котором смотрит игрок, фактически определяет частоту кадров в игре: при 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
Остальную часть проекта можно найти здесь.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»