2013-06-20 36 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毫秒)應該使用計時器來實現,以便程序保持交互。