zoukankan      html  css  js  c++  java
  • GTK/DirectFB两个闪烁的问题

    GTK/DirectFB两个闪烁的问题


    转载时请注明出处和作者联系方式
    作者联系方式:李先静 <xianjimli at hotmail dot com>

    窗口闪烁的主要原因并不是屏幕刷新慢,而是先刷了一个黑屏,然后才显示正常窗口,所以让人感觉屏幕在闪烁。GTK+(2.6)/DirectFB有几个常见的情况会闪烁:


    误用gtk_window_present。gtk_window_present的功能是把已经存在的窗口提到前面来,因为前提是窗口存在而且已经绘制好了,所以它不会发送EXPOSE消息,如果用gtk_window_present代替gtk_widget_show,那么在窗口第一次显示时会出现闪烁,后面再显示时恢复正常。

    gdk_window_begin_paint_region/gdk_window_end_paint的实现有问题。因为处理EXPOSE消息时,widget不会绘制子widget占用的区域,这是在gdk_directfb_clip_region中处理的。而gdk_window_end_pain中却是把widget整个区域都刷新到屏幕上了,而此时子窗口可能还没有绘制,所以就会先出现黑屏,再才显示子窗口。可以这样修改:

    在gdk_window_begin_paint_region增加paint_region的clip处理:

    1.   if(region != NULL && region->numRects == 1)
    2.   {
    3.      GdkRegion* clip_region = gdk_directfb_clip_region(GDK_WINDOW_OBJECT (window)->impl, NULL, region->rects);
    4.      gdk_region_destroy(impl->paint_region);
    5.      impl->paint_region = clip_region;
    6.   }

    在gdk_window_end_paint中只刷新clip的区域:

    1.           int i = 0;
    2.           for(i = 0; i < impl->paint_region->numRects; i++)
    3.           {
    4.              DFBRegion reg = { impl->paint_region->rects[i].x1,
    5.                                impl->paint_region->rects[i].y1,
    6.                                impl->paint_region->rects[i].x2 - 1,
    7.                                impl->paint_region->rects[i].y2 - 1};
    8.             _gdk_directfb_update (impl, ®);
    9.           }

    ~~end~~

  • 相关阅读:
    SharePoint 2013 中的SQL Server 安全
    SharePoint 2013 的HTML5特性之响应式布局
    SharePoint 2013 一些小技巧
    SharePoint 2013 排错之"Code blocks are not allowed in this file"
    SharePoint 2013 创建搜索中心及搜索设置
    SharePoint 2013 使用PowerShell创建State Service
    SharePoint 2013 内容部署功能简介
    SharePoint 使用PowerShell恢复误删的网站集
    SharePoint 自定义WebPart之间的连接
    linux之misc及使用misc创建字符设备
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167632.html
Copyright © 2011-2022 走看看