c – GLFW鼠标事件滞后与窗口拖动
我试图在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); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |