使用gls提高性能

2024-05-23 20:45:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我的游戏动画性能不够快,所以我试图寻找一种提高速度的方法,并找到了Shoot em up,但游戏似乎使用GLSL脚本和画布,我真的不明白它们是如何工作的。如何使用上述方法(glsl脚本和画布)重写代码

这是我的慢速脚本,在移动设备(android和iOS)上每秒10-12帧,在桌面上每秒48-58帧

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重写上述代码以获得最快的性能


Tags: fromimportselfsizeifdefcanvascenter
1条回答
网友
1楼 · 发布于 2024-05-23 20:45:58

如果不对代码进行分析,很难说清楚为什么代码很慢,但很可能是因为过度使用了小部件。尽可能多地尝试使用Kivy canvas指令-这需要更多的手动管理,以准确地管理要去哪里,但避免了大量的小部件开销(这对大多数应用程序来说并不重要,但当您有大量小部件时,这是一个问题)

事实上,这正是您所要问的:Kivy是一个opengl工具包,canvas指令以相对较小的开销直接操作gl状态。您链接的示例执行了一些更为手动的操作,但您现在不需要走那么远

相关问题 更多 >