Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Canvas 当绘制到窗口时,以前的内容通常会被丢弃吗?还有什么';保存它们的最好方法是什么?_Canvas_Gtk_Repaint_Redraw_Buffer Objects - Fatal编程技术网

Canvas 当绘制到窗口时,以前的内容通常会被丢弃吗?还有什么';保存它们的最好方法是什么?

Canvas 当绘制到窗口时,以前的内容通常会被丢弃吗?还有什么';保存它们的最好方法是什么?,canvas,gtk,repaint,redraw,buffer-objects,Canvas,Gtk,Repaint,Redraw,Buffer Objects,我正在尝试在Inkscape矢量图像编辑器中加速渲染(延迟和吞吐量方面),使其更适合艺术家 我正在尝试决定是直接绘制到窗口还是绘制到中间的屏幕外表面,然后将其复制到窗口 如果每次都必须重新绘制整个画布,那么通过节省内存带宽,直接绘制到窗口显然会更快。但不幸的是,Inkscape不进行GPU渲染,因此它无法重新绘制整个窗口,只有无效的矩形 假设我有两个需要重新绘制的矩形。 第一种方法是使用gdk_window_begin_draw_frame(rect)获取每个矩形的子曲面,然后绘制并发送到屏幕

我正在尝试在Inkscape矢量图像编辑器中加速渲染(延迟和吞吐量方面),使其更适合艺术家

我正在尝试决定是直接绘制到窗口还是绘制到中间的屏幕外表面,然后将其复制到窗口

如果每次都必须重新绘制整个画布,那么通过节省内存带宽,直接绘制到窗口显然会更快。但不幸的是,Inkscape不进行GPU渲染,因此它无法重新绘制整个窗口,只有无效的矩形

假设我有两个需要重新绘制的矩形。

第一种方法是使用gdk_window_begin_draw_frame(rect)获取每个矩形的子曲面,然后绘制并发送到屏幕。但缺点是不能并行绘制2,因为GTK一次只允许锁定1个矩形

我想到的第二种方法是向窗口系统(GTK)请求两个矩形的边界框。然后并行绘制2,并将结果发送到屏幕。但这里的问题是GTK没有保留窗口的旧内容-它清除了整个更新区域,在两个矩形之间的间隙中创建空白区域

因此,对于第二种方法,我可以要求GUI工具包保留窗口的内容,或者渲染到保留整个窗口的中间缓冲区。但这需要额外的复制。我想知道在画画时是否习惯于丢弃以前的内容?我知道丢弃具有性能优势,不必等待上一次渲染完成,也不必从GPU内存读回CPU内存。这个建议是针对OpenGL的glMapBuffer()和DirectX曲面的LockRect()给出的。但是glMapBuffer()确实有返回旧内容的选项。那么GTK也应该有这样的选择吗?还是这要求太高了

由于GUI工具包的限制,我面临的许多问题似乎都是人为的。例如,如果GUI工具包允许您并行地更新多个区域,那么第1种方法将工作并且更容易。OpenGL允许您使用glMapBufferRange()实现这一点


我想为GTK提供一个好的解决方案,但同时我想知道,如果您可以非常直接地访问GPU硬件,您将如何最有效地实现我描述的局部绘图?

如果OpenGl满足您的要求,为什么不在GTK(或类似)中使用OpenGl?为什么不直接调用
gtk\u widget\u queue\u draw\u area
gtk\u widget\u queue\u draw\u area
?@gtknerd-移植到OpenGL会很好,但实现具有如此多不同填充模式(实体、线性渐变、网格渐变等)的曲线路径渲染将是一项艰巨的任务。Cairo有一个OpenGL后端,但由于这些复杂性,它并不完整。NVIDIA为OpenGL提供了路径渲染扩展,但这些扩展也不支持所有SVG渲染模式。Adobe在Illustrator中使用它,所以他们一定扩展了它。我现在的重点是高效地将最终的软件渲染图像传输到窗口系统。@liberforce-我希望避免使用gtk_widget_queue_draw_area(),因为这些函数计划在将来重新绘制(曝光),而不是现在绘制,以获得最小的延迟。而且它不允许并行处理重画(暴露)事件,因为事件处理本质上是串行的。我不知道多个矩形同时失效的频率有多高(我想当你收缩一个矩形时),所以我可能过分强调了在| |中重画多个矩形的重要性。我认为只要你以足够高的频率重画,你就不在乎重画是否在未来。无论如何,你都会被绑定到屏幕延迟。以60fps的速度绘图的延迟更差,为16.7ms。调用
gtk_widget_queue_draw_region
一次调用所有需要重画的区域,并生成适当的事件来处理重画。确保这些区域最小是可以加速的,因为cairo将在绘制操作中将其用作剪切遮罩。