2013-06-20 34 views
1

因此,我试图在每个绘图之间对这个程序进行延迟。 我尝试过使用Sleep(),但是如果在draw()函数上使用它,会给我一个错误,并且如果在别处使用它,则不起作用。OpenGL睡眠或每帧之间的延迟?

Xcode的编译文件,而是指向我这个错误运行时:

libsystem_kernel.dylib`__semwait_signal: 
0x7fff8fd7937c: movl $33554766, %eax 
0x7fff8fd79381: movq %rcx, %r10 
0x7fff8fd79384: syscall 
0x7fff8fd79386: jae 0x7fff8fd7938d   ; __semwait_signal + 17 
0x7fff8fd79388: jmpq 0x7fff8fd7a4c8   ; cerror 
0x7fff8fd7938d: ret  
0x7fff8fd7938e: nop  
0x7fff8fd7938f: nop 

代码:

void draw() 
{ 
GLint width; 

glClear(GL_COLOR_BUFFER_BIT); 
glPointSize(10); 

int x=0; int y=0; 
glBegin(GL_POINTS); 


for(x=0; x<500; x++) 
{ 
    for(y=0;y<500; y++) 
    { 
     glColor3f(rand()%255,rand()%255, rand()%255); 
     glVertex2i(rand()%500,rand()%500); 
    } 
} 
sleep(500); 
glEnd(); 
glFlush(); 
} 


int main(int argc, char** argv){ 


glutInit(&argc, argv); 
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); 
glutInitWindowSize (500, 500); 
glutInitWindowPosition (100, 100); 
glutCreateWindow ("Trabalho de Modelagem e Simulação de Processos"); 


glutDisplayFunc(draw); 
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); 
gluOrtho2D (0.0f, 500.0f, 0.0f, 500.0f); 
glutIdleFunc(draw); 
glutMainLoop(); 
return 1; 

}

+0

请注意您的大小写。如果这是Windows,它是'睡眠',而不是'睡眠'。另外,我不会把它放在即时模式的东西里面。把它放在'glFlush()'之后。如果您收到“错误”,向我们显示错误会有帮助。这样做也将帮助你进入*阅读*错误的例程。 – paddy

+0

嗯,我的道歉。我最初并没有看到这个错误,或者在我看完问题之后编辑它。尝试关于从即时模式部分删除睡眠的建议。我的猜测是,当你正在将数据传递给GL时,你的内核不想睡觉。 – paddy

+0

是的,使用睡眠或睡眠,而不是给我错误或运行时没有效果。 – Tehort

回答

0

即使它不解决您的眼前的问题,你应该考虑重组你的程序。首先,您应该仅从您向GLUT注册的显示回调中进行OpenGL调用,而不是从空闲回调中调用,这意味着:请勿将draw注册为空闲功能。相反,您应该注册一个专用功能,将glutPostRedisplayglutPostRedisplay本身称为空闲功能。任何类型的长期延迟(长期意味着长度超过10毫秒)应该使用计时器来实现,以便程序保持交互。