加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – GLFW鼠标事件滞后与窗口拖动

发布时间:2020-12-16 10:07:57 所属栏目:百科 来源:网络整理
导读:我试图在GLFW中拖动一个未修饰的窗口,但遇到一些事件滞后,即使我使用的是glfwWaitEvents() 我有一个光标位置回调和一个简单的循环: // register a cursor position callbackglfwSetCursorPosCallback(win,cursor_pos_callback);// then loop..while(!glfwWi
我试图在GLFW中拖动一个未修饰的窗口,但遇到一些事件滞后,即使我使用的是glfwWaitEvents()

我有一个光标位置回调和一个简单的循环:

// register a cursor position callback
glfwSetCursorPosCallback(win,cursor_pos_callback);

// then loop..
while(!glfwWindowShouldClose(win)) {
  glfwWaitEvents();
  ... some rendering...
  glfwSwapBuffers(win);
}

我的光标回调会对增量进行一些简单的跟踪并更新窗口位置.

cursor_pos_callback(GLFWwindow *win,double xpos,double ypos) {
  // figure out delta_x and delta_y based on cursor previous position
  int delta_x,delta_y;

  // update window position
  if (window_drag_active) {
     int x,y;
     glfwGetWindowPos(window,&x,&y);
     glfwSetWindowPos(window,x + delta_x,y + delta_y);
  }
}

当我拖着一条直线时,这就是三角洲的样子

delta_x:  10    delta_y:   0    |    xpos:   649    ypos: 55
delta_x:   5    delta_y:  -1    |    xpos:   654    ypos: 54
delta_x:   5    delta_y:   3    |    xpos:   659    ypos: 57
delta_x:   5    delta_y:   2    |    xpos:   664    ypos: 59
delta_x:  -5    delta_y:  -2    |    xpos:   659    ypos: 57
delta_x:   4    delta_y:   0    |    xpos:   663    ypos: 57
delta_x:   2    delta_y:   0    |    xpos:   665    ypos: 57
delta_x:  -3    delta_y:  -3    |    xpos:   662    ypos: 54
delta_x:   2    delta_y:   1    |    xpos:   664    ypos: 55
delta_x:   2    delta_y:   0    |    xpos:   666    ypos: 55
delta_x:   3    delta_y:   2    |    xpos:   669    ypos: 57
delta_x:   1    delta_y:  -1    |    xpos:   670    ypos: 56
delta_x:   2    delta_y:  -1    |    xpos:   672    ypos: 55
delta_x:   7    delta_y:   3    |    xpos:   679    ypos: 58
delta_x:   2    delta_y:  -1    |    xpos:   681    ypos: 57
delta_x:  -2    delta_y:  -3    |    xpos:   679    ypos: 54
delta_x:   0    delta_y:  -2    |    xpos:   679    ypos: 52
delta_x:   3    delta_y:   3    |    xpos:   682    ypos: 55
delta_x:  -5    delta_y:  -3    |    xpos:   677    ypos: 52

xpos按原样递增,然后每隔一段时间递增一次(陈旧事件?)

也许我的窗口移动没有与光标同步?

结果是当我拖动窗户时,它猛烈摇晃,我几乎无法将它移动到任何地方……

更新:我也尝试将glfwSetWindowPos逻辑移动到主循环中也没有成功 – 我仍然得到相同的震动和口吃.

更新:当我注释掉glfwSetWindowPos()时,窗口不再移动(当然),但事件流现在是一致的.

这使我认为,当快速完成时窗口的移动会引起猛拉动作(即前进2步,后退1步).

解决方法

我怀疑你的问题是cursor_pos_callback接收相对于窗口的光标位置,移动窗口会立即影响该位置.

假设您以恒定速率对角移动光标.如果超过一个刻度,光标从相对位置(100,100)移动到(105,105),则计算delta_x = 5和delta_y = 5.然后移动窗口.移动窗口的过程然后立即将相对坐标从(105,105)改回(100,100),并在下一个刻度上,即使您已移动到相对于原始窗口位置的位置(110,110),您只是在相对于新窗口位置的相对位置(105,因此您可以从先前位置计算delta_x = 0和delta_y = 0(加上一些随机抖动噪声),即使您实际上已经沿每个轴移动了5个单位.

相反,修改算法以保持恒定的相对光标位置.在拖动开始时,存储相对光标位置(例如(100,100)).现在,在每个刻度线处,计算您需要定位窗口的位置,以将光标移回到固定的相对位置.因此,如果光标移动到(112,108),则将窗口移动(12,8)以将光标放回(100,100).在稍后的刻度中,如果光标移动到(108,106),则不要尝试从(112,108)计算增量;相反,将它与原始(100,100)起点进行比较,并将窗口移动(8,6).它将类似于以下内容:

cursor_pos_callback(GLFWwindow *win,double ypos) {

  // update window position
  if (window_drag_active) {
     int delta_x = xpos - window_drag_starting_xpos;
     int delta_y = ypos - window_drag_starting_ypos;
     int x,y + delta_y);
  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读