场景刷新冻结
Posted
技术标签:
【中文标题】场景刷新冻结【英文标题】:Scene refresh frozen 【发布时间】:2012-07-11 18:33:44 【问题描述】:我渲染 2D(基于图块)场景并注册按键。按下箭头键时,我移动相机。尽管按键注册得很好,我的场景在我切换到另一个窗口并返回之前不会更新。
你能告诉我是什么导致了问题吗?
PS。我正在 Linux 上工作,在 glut (freeglut) 的帮助下开发 OpenGL 应用程序。
我的渲染函数:
void render()
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
if (s_map)
for (int i = s_iCameraX; i < sc_iTilesY + s_iCameraY && i < s_map->usiHeight; i++)
for (int j = s_iCameraY; j < sc_iTilesX + s_iCameraX && j < s_map->usiWidth; j++)
short val = s_map->data[i][j];
if (val == 0x0010) glBindTexture(GL_TEXTURE_2D, texture[0]);
else if (val == 0x0020) glBindTexture(GL_TEXTURE_2D, texture[1]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex2f(j-s_iCameraX, i-s_iCameraY);
glTexCoord2f(1.0f, 0.0f); glVertex2f(j-s_iCameraX+1.0f, i-s_iCameraY);
glTexCoord2f(1.0f, 1.0f); glVertex2f(j-s_iCameraX+1.0f, i-s_iCameraY+1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex2f(j-s_iCameraX, i-s_iCameraY+1.0f);
glEnd();
glutSwapBuffers();
我的特殊按键处理功能:
void keyproc(int key, int x, int y)
switch (key)
case GLUT_KEY_UP:
printf("UP: %d %d\n", s_iCameraX, s_iCameraY);
if (s_iCameraY - 1 >= 0) s_iCameraY--;
break;
case GLUT_KEY_DOWN:
printf("DOWN: %d %d\n", s_iCameraX, s_iCameraY);
if (s_map && s_iCameraY + 1 < s_map->usiHeight) s_iCameraY++;
break;
case GLUT_KEY_RIGHT:
printf("RIGHT: %d %d\n", s_iCameraX, s_iCameraY);
if (s_map && s_iCameraX + 1 < s_map->usiWidth) s_iCameraX++;
break;
case GLUT_KEY_LEFT:
printf("LEFT: %d %d\n", s_iCameraX, s_iCameraY);
if (s_iCameraX - 1 >= 0) s_iCameraX--;
break;
default: break;
【问题讨论】:
你能展示你的主循环吗? 我没有。我使用了 glutglutMainLoop()
函数。
按下一个键后是否仍然调用render()
(你可以用printf()
跟踪它?你的空闲回调是什么?
render() 在按下一个键并切换一个窗口后调用(如果我理解你的话)并且我没有 IDLE 回调。是必须的吗?
【参考方案1】:
以下可能值得一试:添加空闲回调:
void idle(void)
// Force GLUT to render the scene
glutPostRedisplay();
【讨论】:
以上是关于场景刷新冻结的主要内容,如果未能解决你的问题,请参考以下文章
[troubleshoot][archlinux][X] plasma(KDE) 窗口滚动刷新冻结(约延迟10s)(已解决,root cause不明,无法再次复现)
在 3ds Max 中更新进度条后,环境和效果 UI 不刷新
ECSlidingViewController 冻结 UIRefreshControl