Animation issue on X11 window

元气小坏坏 提交于 2020-01-06 04:03:15

问题


I'm struggling to get X11 redrawing events right in a cross platform C++ application.

Everything works great on Windows (I just issue some InvalidateRect calls when I need the window to redraw), but on Linux I keep having redrawing stuttering (probably when I send too many redraw events as follows)

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

the same happens when I resize the window.

This is the code I'm using

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);
}

I tried several approaches to solve this issue including:

  • Having a 200 ms delay between every redraw event sending (stuttering still happening.. resize still issues a LOT of events)
  • Having a secondary thread issuing a redraw call every 50ms (this saturates X11's buffer immediately and crashes the whole thing)

Unfortunately I have animated controls which call redraw() anytime they need another redrawing of part of the window (I handle painting regions of the window separately).

How can I solve stuttering during resizing and too many redrawing events while ensuring my animated controls remain smooth?

来源:https://stackoverflow.com/questions/36365528/animation-issue-on-x11-window

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!