Как остановить зависание gl после нескольких (7) кадров? - PullRequest
0 голосов
/ 16 апреля 2019

Используя OpenGL и X11, у меня есть программа, которая обновляет окно X11 для создания анимации, но анимация зависает после нескольких кадров.Как это исправить?

Я пробовал glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_ACCUM_BUFFER_BIT) и XClearWindow, но безрезультатно.

Полный код здесь: * 1006является частью проблемы:

int plot_network(nw)
  struct network nw;
{
  Display               *dpy;
  Window                win;
  Bool                  doubleBuffer = True;
  XVisualInfo           *vi = NULL;
  Colormap              cmap;
  XSetWindowAttributes  swa;
  GLXContext            cx;
  XEvent                event;
  int                   screen_num, t_ind, ori_ind;
  unsigned int          display_width, display_height, size; 
  float                 delta;
  static Bool           displayListInited = False;

  if(!(dpy = XOpenDisplay(NULL)))
    fatalError("could not open display");
  if(!(vi = glXChooseVisual(dpy, DefaultScreen(dpy), dblBuf))) {
    if(!(vi = glXChooseVisual(dpy, DefaultScreen(dpy), sngBuf)))
      fatalError("no RGB visual with depth buffer");
    doubleBuffer = False;
  }
  if(vi->class != TrueColor)
    fatalError("TrueColor visual required for this program");
  if(!(cx = glXCreateContext(dpy, vi, None, True)))
    fatalError("could not create rendering context");
  screen_num = DefaultScreen(dpy);
  display_width = DisplayWidth(dpy, screen_num);
  display_height = DisplayHeight(dpy, screen_num);
  if (display_width < display_height) {
    size = display_width*0.8;
  } else {
    size = display_height*0.8;
  }
  delta = 2.0/nw.dim;
  cmap = XCreateColormap(dpy,RootWindow(dpy,vi->screen),vi->visual,AllocNone);
  swa.colormap = cmap;
  swa.border_pixel = 0;
  swa.event_mask = ExposureMask | ButtonPressMask | StructureNotifyMask;
  win = XCreateWindow(dpy,RootWindow(dpy,vi->screen),0,0,size,size,
    0,vi->depth,InputOutput,vi->visual,
    CWBorderPixel | CWColormap | CWEventMask,
    &swa);
  XSetStandardProperties(dpy,win,"V1 Model","V1 Model",None,None,0,NULL);
  glXMakeCurrent(dpy, win, cx);
  XMapWindow(dpy, win);

  glEnable(GL_DEPTH_TEST);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glOrtho(0.0,1.0,0.0,0.0,0.0,1.0);

  t_ind = 0;
  while(t_ind < nw.n_steps) {
    XNextEvent(dpy, &event);
    //XClearWindow(dpy, win);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_ACCUM_BUFFER_BIT);
    for(int i=0;i<nw.dim;i++){
        for(int j=0;j<nw.dim;j++){
            float v = 0;
            for (int k=0; k < nw.oris; k++) {
                v += nw.cols[i][j].ns[k].v[t_ind];
            }
            v /= (float) nw.oris;
            float x = nw.cols[i][j].ns[0].x*delta-1;
            float y = nw.cols[i][j].ns[0].y*delta-1;
            draw_box(red(v), green(v), blue(v), x, y, delta, delta);
        }
    }
    if(doubleBuffer)
      glXSwapBuffers(dpy, win); 
    else
      glFlush();
    printf("Time: %i\n", t_ind);
    usleep(500000);
    t_ind++;
  }
  XCloseDisplay(dpy);
  return(0);
}

Я ожидаю, что анимация будет продолжаться в течение n_steps количество временных точек >> 7, но она всегда зависает после нескольких (7) обновлений анимации.

1 Ответ

2 голосов
/ 16 апреля 2019

Возможно, проблема в том, что вы используете XNextEvent;С одной стороны, если вы создаете события быстрее, чем рендеринг, вы не очистите свою очередь событий.С другой стороны, если в очереди событий нет событий, вы будете зависать в этой функции до тех пор, пока не сделаете.

Вместо этого попробуйте

for(int i = 0; i < XEventsQueued(dpy, QueuedAlready); ++i) {
  XNextEvent(dpy, &event);
  // handle event here
}

.Отказ от ответственности: возьмите с собой кусочек соли, как я никогда не использовал Xlib непосредственно в моей жизни.

...