gpt4 book ai didi

python - 为什么我的简单 python gtk+cairo 程序运行如此缓慢/断断续续?

转载 作者:太空狗 更新时间:2023-10-29 18:27:05 27 4
gpt4 key购买 nike

我的程序绘制了在窗口上移动的圆圈。我想我一定是遗漏了一些基本的 gtk/cairo 概念,因为对于我正在做的事情来说,它似乎运行得太慢/断断续续。有任何想法吗?感谢您的帮助!

#!/usr/bin/python

import gtk
import gtk.gdk as gdk
import math
import random
import gobject

# The number of circles and the window size.
num = 128
size = 512

# Initialize circle coordinates and velocities.
x = []
y = []
xv = []
yv = []
for i in range(num):
x.append(random.randint(0, size))
y.append(random.randint(0, size))
xv.append(random.randint(-4, 4))
yv.append(random.randint(-4, 4))


# Draw the circles and update their positions.
def expose(*args):
cr = darea.window.cairo_create()
cr.set_line_width(4)
for i in range(num):
cr.set_source_rgb(1, 0, 0)
cr.arc(x[i], y[i], 8, 0, 2 * math.pi)
cr.stroke_preserve()
cr.set_source_rgb(1, 1, 1)
cr.fill()
x[i] += xv[i]
y[i] += yv[i]
if x[i] > size or x[i] < 0:
xv[i] = -xv[i]
if y[i] > size or y[i] < 0:
yv[i] = -yv[i]


# Self-evident?
def timeout():
darea.queue_draw()
return True


# Initialize the window.
window = gtk.Window()
window.resize(size, size)
window.connect("destroy", gtk.main_quit)
darea = gtk.DrawingArea()
darea.connect("expose-event", expose)
window.add(darea)
window.show_all()


# Self-evident?
gobject.idle_add(timeout)
gtk.main()

最佳答案

其中一个问题是您一次又一次地绘制相同的基本对象。我不确定 GTK+ 缓冲行为,但也请记住,基本函数调用会在 Python 中产生成本。我已经在您的程序中添加了一个帧计数器,并且使用您的代码,我得到了大约 30fps 的最大值。

您可以做几件事,例如在实际调用任何填充或描边方法之前组合更大的路径(即在一次调用中将所有弧线)。另一种速度要快得多的解决方案是在屏幕外缓冲区中合成球,然后将其重复绘制到屏幕上:

def create_basic_image():
img = cairo.ImageSurface(cairo.FORMAT_ARGB32, 24, 24)
c = cairo.Context(img)
c.set_line_width(4)
c.arc(12, 12, 8, 0, 2 * math.pi)
c.set_source_rgb(1, 0, 0)
c.stroke_preserve()
c.set_source_rgb(1, 1, 1)
c.fill()
return img

def expose(sender, event, img):
cr = darea.window.cairo_create()
for i in range(num):
cr.set_source_surface(img, x[i], y[i])
cr.paint()
... # your update code here

...
darea.connect("expose-event", expose, create_basic_image())

这在我的机器上提供了大约 273 fps。因此,您应该考虑使用 gobject.timeout_add而不是 idle_add

关于python - 为什么我的简单 python gtk+cairo 程序运行如此缓慢/断断续续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2172525/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com