- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的程序绘制了在窗口上移动的圆圈。我想我一定是遗漏了一些基本的 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/
我将简要介绍一下我的应用程序的所有元素: 我有一个将音频记录到 AVAudioPCMBuffer 的应用程序。然后将该缓冲区转换为 NSData,然后转换为 [UInt8]。然后通过 OutputSt
我正在用 Java 制作一个非常简单的乒乓球游戏,并且我正在使用 KeyListener 进行此操作。我想要它,所以当用户按下键盘上的向右或向左键时,乒乓 block 会朝那个方向移动。这是一个足够简
我正在用 Java 制作一个非常简单的乒乓球游戏,并且我正在使用 KeyListener 进行此操作。我想要它,所以当用户按下键盘上的向右或向左键时,乒乓 block 会朝那个方向移动。这是一个足够简
所以我一直遇到动画问题,尤其是当两个动画同时发生或在 Activity 加载时发生时。我知道这可能是资源问题,并且主线程中发生了很多事情,导致动画卡顿。 我发现了一些有趣的建议: 1.线程(Threa
我推一个ViewController其中包含的 View 不多,UIScrollView其中包含 10 个 View ,我有一个单例 ViewController并一次次推,不释放和再次分配ViewC
矩形应该向下移动,先向左然后向右。但出于某种原因,他们只是有点“跳跃”。谁能告诉我为什么? .imgbox { position: relative; float:left;
我的动画有问题。我正在写一个由标题、正文(对话框所在的位置)和输入字段组成的聊天。它的位置是这样的: .chatWindowContainer { display: flex; fle
我有一个项目正在渲染视频播放并对其应用 CIFilters。我知道我可以使用视频合成来获取带滤镜的视频,但问题是滤镜需要可滑动(预览下一个滤镜,因此我们对第一个 ImageView 使用 mask ,
我正在处理过渡,当过渡应用于不同函数中的选择时,我注意到有些卡顿和闪烁。但是,如果转换与方法链一起应用,它会完全按照规定工作。 下面是简单移动一些文本的小例子(Fiddle)。在过渡开始之前,最左边的
我的适配器正确地将图像应用到 RecyclerView 并正确滚动……直到我添加大量项目。然后它变得相当不稳定,我知道这是我的方法的问题。请看下面的代码: class FragmentMenuView
我试图在用户提交表单后滚动到页面底部。但是,当我执行以下代码时,浏览器会滚动到页面底部,但不允许我在没有锁定/关闭/抖动的情况下向上滚动(通过鼠标滚轮、滚动条或箭头键)。 var scrollToBo
问题 我正在尝试让 Canvas 上的图像从左向右平滑移动。它在 Chrome/Safari 上还不错(仍然有点卡顿),但在多台机器上的 Firefox 中有明显的卡顿(在 Windows 和 Mac
我无法在 SceneKit 中获得平滑的阴影。您将在下面找到将灯光和图片添加到我的场景的代码。我圈出了像素化的区域。 即使是 SceneKit 提供的基本几何图形也无法正确着色。 有谁知道我该如何解决
我正在制作一个简单的应用程序,允许用户每天写一两句话来描述他们的一天。 我有一个 UICollectionView 将每一天显示为一个单元格。在该单元格中,有一个 UITextView,用户可以在其中
我在使用 UITableView 时遇到了这个问题,tableView 的 cells 高度不同,自动布局约束设置不当。当您向下滚动到 tableView 的底部并加载更多数据(无论使用 reload
我正在尝试创建一个包含一堆 block 的页面(通常包含可以通过单击框展开的“溢出:隐藏”文本)。但是,当我单击该框以调整其高度(以显示所有文本)时,我还想通过使用 ScrollTop 使该框成为焦点
我的程序绘制了在窗口上移动的圆圈。我想我一定是遗漏了一些基本的 gtk/cairo 概念,因为对于我正在做的事情来说,它似乎运行得太慢/断断续续。有任何想法吗?感谢您的帮助! #!/usr/bin/p
目前我有一个 UITableView,里面有一个可以调整大小的 UITextView。该单元格正在使用 beginUpdates/endUpdates 自动调整大小,但是当它这样做时,表格 View
我是一名优秀的程序员,十分优秀!