while (!glfwWindowShouldClose(window))
{
processInput(window);
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwPollEvents는 키보드입력등 이벤트를 확인하고 윈도우상태를 업데이트하고 while (!glfwWindowShouldClose(window))
{
processInput(window);//esc키가 입력되면 윈도우가 glfwSetWindowShouldClose의 값이 true로 됨
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwPollEvents는 키보드입력등 이벤트를 확인하고 윈도우상태를 업데이트하고 정해진 함수들을 실행합니다 라고 설명이되있는대
예를들어 내가 esc를 누르면 이걸인식해서 현재 window에 esc가 눌러졌어! 라고 상태를 바꾼후 이바뀐상태를가지고 processInput(window)에 해당 window에 상태가 esc가 눌러졌다로 바꼈으니 glfwSetWindowShouldClose의 값이 true로 되고, glfwSetWindowShouldClose의 값이 true니까 glfwShouldClose를 통해 창이 닫히는건가?
예제는 이거 https://heinleinsgame.tistory.com/6?category=757483 참조함
입출력 다중화 기법 중에 select, poll 방식이 많이 쓰이는데,
https://www.joinc.co.kr/w/Site/Network_Programing/Documents/Poll
이 문서 꼭 보기 바람. glfwPollEvents 가 poll 의 래퍼 함수일 거임.
답변감사! 읽어보니 좋은자료인듯
glfwSetWindowShouldClose를 이용해 true를 설정하면 다른 건 하나도 안 바뀌고 오직 glfwWindowShouldClose의 return 값만 바뀐다. 두 함수 다 창을 닫는 기능과는 상관없이 그냥 한 bool 타입 변수의 getter와 setter일 뿐임. 실질적으로 창이 닫히는 흐름은 다음과 같음. "esc를 누름 -> processInput에서 변수 glfwSetWindowShouldClose를 이용해 변수를 true로 설정함 -> 루프문 다 돌고 다시 while 조건 평가 -> glfwSetWindowShouldClose 함수가 아까 설정한 변수의 값 true를 반환함 -> while 루프를 빠져나옴 -> main 함수 끝에 도달해 return"
오타다 "glfwSetWindowShouldClose 함수가 아까 설정한 변수의 값 true를 반환함" set windows가 아니라 getter 말하는 거임.
답변감사! 궁금한게 더있는대 processInput이 실행될때 processInput문에 있는 glfwGetKey(window,GLFW_KEY_ESCAPE)이함수 때문에 키입력 esc를 인식하는지 아니면 glfwPollEvents에서 현재 window 에 esc키입력을 인식하고 window의 상태를 바꾸고 이 바뀐상태의 윈도우가 processInput에 넘겨져서 glfwGetKey로 키입력을 판별하는지? 키가 입력됬다는걸 인식하는 주최가 궁금함
주최라기보다...int main(){ while (1) { ... poll(...) ... if (조건) callback() }}
https://www.glfw.org/docs/3.3/quick.html
여기 문서 보면 main() 내에 while {} 내에 glfwPollEvents() 이 함수가 돌아감. 그게 이벤트 루프임. 내가 볼 때는 poll() 을 이용하여 이벤트 루프를 만든거임. 궁금하면 glfwPollEvents() 소스코드 찾아서 보면 되고. 그런 류의 코드는 GTK, Qt, Tk, Efl 에도 있음.
참고로 GTK 에는 gtk_main(), gtk_main_iteration() 이런 류의 함수가 있음. 그런 류의 함수는 위에 얘기했듯이 select, poll, kqueue, epoll 같은 걸로 만드는 거니까 입출력 다중화를 알아야 함. 보통 GUI 툴킷 레퍼런스 API 문서에 이벤트 핸들링에 대한 문서가 있을터이니 그걸 찾아서 봐야지. 이벤트 핸들링 문서가 없는 GUI 툴킷은 없을거임. 이벤트 핸들링은 GUI 의 핵심이거덩
GLFW 공식 문서 보면, glfwGetKeys는 어떤 버튼의 가장 최근에 확인된 상태를 반환한다고 설명돼 있음. 그러니 아마 glfwGetKeys 함수가 키보드 눌린 상태를 직접 판별하진 않는다는 뜻일 거임. 소스코드 뜯어본 적은 없으니 추론만 해보건데 poll event 함수가 윈도우의 이벤트 큐에 들어 있는 정보를 이용해 키보드가 눌렸나 풀렸나 정보를 얻어서 내부적으로 저장하고 있을 거라 생각함.
방금 소스코드 읽어보고 왔다. glfwPollEvents 함수 안에 Windows OS가 전달하는 메시지를 처리하는 루틴이 있고, 여기서 esc가 눌렸다는 소식을 전달받은 뒤 GLFWwindow 구조체 안에 있는 배열 char keys[349] 안에 저장함. 그리고 glfwGetKey 함수는 이 배열의 값 하나를 읽어오기만 함.
두분다 답변감사드립니다 c/c++문법만 때고하는거라 이벤트나 입출력다중화부분은 따로해봐야겠내요 혹시 glfw소스코드 어디서 봤는지 알려주실수있나요?
https://github.com/glfw/glfw