Kivy - 画布压力测试



在本章中,我们将了解图形引擎的效率如何。这可以通过向 Kivy 对象的画布添加大量图形指令来实现。

下面给出的程序测量了图形引擎绘制一万个随机位置和随机颜色值的矩形所需的时间。因此,它将评估画布可以承受多少压力。

语法

使用以下语法在任何 Kivy 小部件的画布上绘制矩形指令:

with self.root.canvas:
   Color(r,g,b,a)
   Rectangle(pos, size)

我们将为 RGB 以及矩形的 x 和 y 坐标生成随机值,并显示 10,000 个矩形。使用 perf_counter() 函数计算为此花费的时间。

t1=perf_counter()
with self.root.canvas:
   for i in range(10000):
      Color(r,g,b,a)
      Rectangle(pos, size)
      t2=perf_counter()

绘制所需的时间将是“t2 - t1”。它将显示在 Kivy 应用窗口的标题栏上。

示例

完整的程序如下所示:

from kivy.app import App
from kivy.graphics import *
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from random import random as r
from time import perf_counter
from kivy.core.window import Window

Window.size = (720, 400)

class StresstestApp(App):
   def add_rects(self, *args):
      self.t1 = perf_counter()
      with self.root.canvas:
         for i in range(10000):
            Color(r(), 1, 1, mode='hsv')
            Rectangle(
               pos=(r() * self.root.width + self.root.x, r() * self.root.height + self.root.y),
               size=(20, 20)
            )
            self.t2 = perf_counter()
      self.title = str(self.t2 - self.t1) + "Sec. to draw 10000 rectangles"
      
   def build(self):
      main = GridLayout(cols=1)
      self.root = FloatLayout(size=(Window.width, 100))
      self.btn1 = Button(
         text='start', size_hint=(1, None),
         pos_hint={'center_x': .5, 'center_y': .1}
      )
      self.btn1.bind(on_press=self.add_rects)
      self.root.add_widget(self.btn1)
      main.add_widget(self.root)
      return main
      
StresstestApp().run()

输出

运行程序并点击“开始”按钮。

Kivy Canvas Stress

您将在标题栏中看到绘制所需的时间,如下面的图所示:

Kivy Canvas Stress Title Bar
广告