在 Gtk+ 中绘制图像最快的方法是什么?

发布于 2024-07-23 06:15:58 字数 501 浏览 6 评论 0原文

我有一个 image/pixbuf,我想将其绘制到 gtk.DrawingArea 中并经常刷新,因此位图传输操作必须很快。 简单的方法:

def __init__(self):
  self.drawing_area = gtk.DrawingArea()
  self.image = gtk.gdk.pixbuf_new_from_file("image.png")

def area_expose_cb(self, area, event):
  self.drawing_area.window.draw_pixbuf(self.gc, self.image, 0, 0, x, y)

但是会导致性能非常慢,这可能是由于 pixbuf 不是显示颜色格式造成的。

我在 Cairo 上也没有成功,因为它似乎仅限于 24/32 位格式,并且没有 16 位格式(FORMAT_RGB16_565 不受支持且已弃用)。

除了在 Gtk+ 中快速绘图之外,还有哪些替代方法?

I have an image/pixbuf that I want to draw into a gtk.DrawingArea and refresh frequently, so the blitting operation has to be fast. Doing it the easy way:

def __init__(self):
  self.drawing_area = gtk.DrawingArea()
  self.image = gtk.gdk.pixbuf_new_from_file("image.png")

def area_expose_cb(self, area, event):
  self.drawing_area.window.draw_pixbuf(self.gc, self.image, 0, 0, x, y)

However leads to very slow performance, likely caused by the pixbuf not being in the displays color format.

I had no success with Cairo either, as it seems limited to 24/32bit formats and doesn't have a 16bit format (FORMAT_RGB16_565 is unsupported and deprecated).

What alternatives are there to drawing pictures quickly in Gtk+?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

垂暮老矣 2024-07-30 06:15:58

尝试创建使用与绘图区域相同的颜色图的像素图。

dr_area.realize()
self.gc = dr_area.get_style().fg_gc[gtk.STATE_NORMAL]
img = gtk.gdk.pixbuf_new_from_file("image.png")
self.image = gtk.gdk.Pixmap(dr_area.window, img.get_width(), img.get_height())
self.image.draw_pixbuf(self.gc, img, 0, 0, 0, 0)

并将其绘制到屏幕上使用

dr_area.window.draw_drawable(self.gc, self.image, 0, 0, x, y, *self.image.get_size())

Try creating Pixmap that uses the same colormap as your drawing area.

dr_area.realize()
self.gc = dr_area.get_style().fg_gc[gtk.STATE_NORMAL]
img = gtk.gdk.pixbuf_new_from_file("image.png")
self.image = gtk.gdk.Pixmap(dr_area.window, img.get_width(), img.get_height())
self.image.draw_pixbuf(self.gc, img, 0, 0, 0, 0)

and drawing it to the screen using

dr_area.window.draw_drawable(self.gc, self.image, 0, 0, x, y, *self.image.get_size())
暖风昔人 2024-07-30 06:15:58

您真的没有产生足够的原始速度/吞吐量吗? 或者只是您看到闪烁?

如果是后者,也许您应该研究双缓冲来执行更新? 基本上,其想法是绘制到不可见的缓冲区,然后告诉显卡使用新的缓冲区。

也许查看此页面,其中有一些有关双缓冲的信息

Are you really not generating enough raw speed/throughput? Or is it just that you're seeing flickering?

If it's the latter, perhaps you should investigate double buffering for perfomring your updates instead? Basically the idea is to draw to an invisible buffer then tell the graphics card to use the new buffer.

Maybe check out this page which has some information on double buffering.

安穩 2024-07-30 06:15:58

可能值得做一些基准测试 - 如果你用小区域绘制,它仍然很慢吗?

如果是的话,可能值得在 pygtk 或 gtk 邮件列表上询问......

It may be worth doing some benchmarking - if you draw with a small area is it still slow?

If it is, it may be worth asking on pygtk or gtk mailing lists...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文