Улучшение производительности с помощью glsl - PullRequest
0 голосов
/ 23 февраля 2019

моя анимация игры не достаточно быстра, поэтому я попытался найти способ улучшить скорость и нашел Shoot em up , но игра, похоже, использует GLSL-скрипт и холст, которые я действительно не понимаюкак они работают.Как я могу переписать свой код, используя вышеуказанный метод (glsl script и canvas)

Вот мой медленный сценарий 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()

как я могу переписать приведенный выше код, используя glsl для максимальной производительности?

1 Ответ

0 голосов
/ 23 февраля 2019

Трудно сказать, почему ваш код работает медленно, без его профилирования, но вполне возможно, что это связано с чрезмерным использованием виджетов.Попробуйте использовать как можно больше инструкций Kivy canvas - это требует большего ручного управления тем, что происходит, но избегает значительных накладных расходов на виджеты (что не имеет значения для большинства приложений, но является проблемой, когда у вас очень большой объем данных).количество виджетов).

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

...