raf*_*lak 4 c++ gtk gtkmm cairo
我写了一个使用Cairo在屏幕上绘制内容的应用程序(准确地说是在Gtk :: DrawingArea上).它需要经常重绘所有内容.事实证明,尽管绘制的字形非常简单,但X服务器在重绘时使用了大量的CPU,而且应用程序运行速度非常慢.有什么方法可以加快速度吗?或者也许我不应该使用DrawingArea和其他一些小部件?
我绘制的是一组矩形,用户可以通过鼠标拖动来移动它们.整个绘图是使用on_expose_event完成的,但是当鼠标指针移动时(按下按钮),我调用queue_draw()来刷新绘图.
只需要检查几件事:
你的绘画是在曝光事件中完成的吗?
将图像绘制到开罗表面,然后在曝光事件中,只需从该表面复制到窗口小部件的表面.
你是否只剪裁和绘制必要的区域?
expose事件为您提供X, Y, width, height了需要重绘的区域.在cairo中,使用这些尺寸在表面上创建一个矩形并调用,clip这样您就不会浪费时间重绘不需要的东西.
我最终通过使用锁定标志强制使用最大 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 毫秒一次。
| 归档时间: |
|
| 查看次数: |
2915 次 |
| 最近记录: |