моя производительность игровой анимации недостаточно высока, поэтому я попытался найти способ улучшить скорость и нашел Пристрели их, но игра, похоже, использует скрипт GLSL и холст, которые я действительно не понимаю, как они работают. Как я могу переписать свой код, используя описанный выше метод (скрипт glsl и холст)
Вот мой медленный скрипт 10-12 Fps на мобильных устройствах (Android и iOS) и 48-58 Fps на десктопе
from kivy.app import App
from kivy.uix.image import Image
from kivy.uix.widget import Widget
from kivy.properties import NumericProperty, ReferenceListProperty, ObjectProperty,ListProperty, BooleanProperty
from kivy.vector import Vector
from kivy.clock import Clock
import random
import math
from kivy.lang import Builder
Builder.load_string("""
<FT>:
canvas.before:
PushMatrix
Rotate:
angle: self.angle
origin: self.center
canvas.after:
PopMatrix
<Flame>:
canvas.before:
PushMatrix
Rotate:
angle: self.angle
origin: self.center
canvas.after:
PopMatrix
<FlameGun>:
tank: tank
canvas:
Rectangle:
source: "wood.png"
size: self.size
pos: self.pos
FT:
id: tank
center: (root.width/2, 70)
""")
class Flame(Image):
velocity_x = NumericProperty(0)
active = BooleanProperty(False)
velocity_y = NumericProperty(0)
velocity = ReferenceListProperty(velocity_x, velocity_y)
angle = NumericProperty(0)
def __init__(self, **kwargs):
super(Flame, self).__init__(**kwargs)
self.size_hint=(None, None)
self.source = "zn.zip" #Contain animated images of Flame
self.anim_delay= 0.35
self.anim_loop = 1
rs = random.randint(70, 80)
self.size = (rs, rs)
self.bind(active=self.addV)
def addV(self, *args):
self.velocity_y += random.uniform(20.0, 25.0)
self.velocity_x += 0
def move(self, pa):
self.pos = Vector(*self.velocity) + self.pos
self.angle = random.randint(0, 360)
self.size = (self.size[0]+1, self.size[1]+1)
if (self.y > pa.top/1.6):
pa.removeThis(self)
self.velocity_y = 0
self.velocity_x = 0
class FT(Image):
velocity_x = NumericProperty(0)
activated = BooleanProperty(False)
velocity_y = NumericProperty(0)
velocity = ReferenceListProperty(velocity_x, velocity_y)
angle = NumericProperty(180)
def __init__(self, **kwargs):
super(FT, self).__init__(**kwargs)
self.source = 'FlameThrower.png'
class FlameGun(Widget):
tank = ObjectProperty(None)
angle = NumericProperty(180)
pr = NumericProperty(0.0)
flames = []
def update(self, dt):
self.addFlame()
if len(self.flames) != 0:
for tank in self.flames:
if tank.active:
tank.move(self)
def removeThis(self, bl):
self.flames.remove(bl)
self.remove_widget(bl)
bl = None
def startFlame(self, *args):
for tank in self.flames:
if not tank.active:
tank.active = True
def addFlame(self, *args):
self.fl = Flame()
self.add_widget(self.fl)
self.fl.center = self.tank.center
self.flames.append(self.fl)
self.fl.velocity = 0, 0
if len(self.flames) != 0:
self.startFlame()
def on_touch_down(self, touch):
self.tank.activated = True
class FlameApp(App):
def build(self):
game = FlameGun()
Clock.schedule_interval(game.update, 1.0 / 60.0)
return game
if __name__ == '__main__':
FlameApp().run()
как я могу переписать приведенный выше код, используя gsl для максимальной производительности?






Трудно точно сказать, почему ваш код работает медленно, не профилируя его, но вполне возможно, что это связано с чрезмерным использованием виджетов. Старайтесь как можно чаще использовать инструкции холста Kivy — это требует больше ручного управления тем, что именно и куда идет, но позволяет избежать значительных накладных расходов на виджеты (что не имеет значения для большинства приложений, но является проблемой, когда у вас очень большой количество виджетов).
Как оказалось, это именно то, о чем вы спрашивали: Kivy - это набор инструментов opengl, а инструкции холста напрямую управляют состоянием gl с относительно небольшими накладными расходами. Пример, на который вы ссылаетесь, делает еще больше ручных действий, но пока вам не нужно заходить так далеко.