使用Cairo绘图时,有什么方法可以加快/减少CPU使用率?

raf*_*lak 4 c++ gtk gtkmm cairo

我写了一个使用Cairo在屏幕上绘制内容的应用程序(准确地说是在Gtk :: DrawingArea上).它需要经常重绘所有内容.事实证明,尽管绘制的字形非常简单,但X服务器在重绘时使用了大量的CPU,而且应用程序运行速度非常慢.有什么方法可以加快速度吗?或者也许我不应该使用DrawingArea和其他一些小部件?

我绘制的是一组矩形,用户可以通过鼠标拖动来移动它们.整个绘图是使用on_expose_event完成的,但是当鼠标指针移动时(按下按钮),我调用queue_draw()来刷新绘图.

Joh*_*ter 9

只需要检查几件事:

你的绘画是在曝光事件中完成的吗?

将图像绘制到开罗表面,然后在曝光事件中,只需从该表面复制到窗口小部件的表面.

你是否只剪裁和绘制必要的区域?

expose事件为您提供X, Y, width, height了需要重绘的区域.在cairo中,使用这些尺寸在表面上创建一个矩形并调用,clip这样您就不会浪费时间重绘不需要的东西.


raf*_*lak 0

我最终通过使用锁定标志强制使用最大 25 fps。

bool lock = 0;
bool needs_redraw = 0;

void Redraw(){
    if(lock){
        needs_redraw = 1;
        return;
    }

    //draw image to a surface

    needs_redraw = 0;
    lock = 1;
    Glib::signal_timeout().connect(Unlock, 20);

    queue_draw();
}

bool Unlock(){
    lock = 0;
    if(needs_redraw) Redraw();
    return false;
}

void on_expose_event(something){
    //copy image from surface to widget's context
}
Run Code Online (Sandbox Code Playgroud)

这是示例代码,但这就是想法。它将禁止重绘频率超过每 20 毫秒一次。