X11窗口上的动画问题

时间:2016-04-01 20:42:51

标签: c++ linux x11

我正努力在跨平台C ++应用程序中获取X11重绘事件。

一切都在Windows上运行得很好(我只需要在需要重绘窗口的时候发出一些InvalidateRect次调用),但在Linux上我一直在重绘口吃(可能是我发送了太多的重绘事件,如下所示)

event.type = Expose;
event.xexpose.window = window;
XSendEvent(display, window, False, ExposureMask, &event);

当我调整窗口大小时也是如此。

这是我使用

的代码
void Window::redraw() { // Called by any control which needs redrawing
  XEvent event;
  memset(&event, 0, sizeof(event));
  event.type = Expose;
  event.xexpose.display = display;
  XSendEvent(display, window, False, ExposureMask, &event);
}

void Window::resize(int width, int height) {
  this->Width = width;
  this->Height = height;
}

bool Window::wndProc(XEvent *evt) {
  switch (evt->type) {

      case Expose: {

        if (evt->xexpose.count == 0) { // handle last one only

            if (Width != Bitmap.width() || Height != Bitmap.height())
              Bitmap.resize(Width, Height);

          Renderer.drawOnBitmap(Bitmap);

          this->paint();
        }

        return true;

      } break;

      case ConfigureNotify: {
        this->resize(evt->xconfigure.width, evt->xconfigure.height);

        redraw();
        return true;
      } break;
  }
}

void Window::paint() {

    XImage image;
    sk_bzero(&image, sizeof(image));

//    .. boilerplate to initialize XImage...

    XInitImage(&image);
    XPutImage(display, window, fGc, &image,
              0, 0,
              0, 0,
              Width, Height);
}

我尝试了几种方法来解决这个问题,包括:

  • 每次重绘事件发送之间有200毫秒的延迟(口吃还在发生..调整大小仍会发出很多事件)
  • 让辅助线程每隔50ms发出一次重绘(这会立即使X11的缓冲区饱和,并使整个事情崩溃)

不幸的是,我有动画控件,只要他们需要重新绘制窗口的一部分(我分别处理窗口的绘制区域),就会调用redraw()

如何在调整大小和重绘过多事件的同时解决口吃问题,同时确保我的动画控件保持平滑?

0 个答案:

没有答案