2009-08-25 3 views
4

나는 Gambit-C Scheme에서 세트를 사용하지 않기로 제한함으로써 기능적 프로그래밍을 조금 배우고 있습니다. 이 환경을 사용하여 약간의 OpenGL 게임을 작성하는 것이 재미있을 거라 생각했는데 게임 개발에 도움이되는 것 같습니다.기능적 GLUT?

그러나 OpenGL 및 GLUT를 사용할 때 기능적 스타일을 고수하고 전역 상태를 피하는 것이 어려울 것으로 보입니다. 필자는 이것이 게임 프로그래밍의 근본적인 한계라고 생각하지 않지만 GLUT와 같은 콜백 기반 API는 함수형 프로그래밍에서는 잘 작동하지 않는 것 같습니다.

예를 들어 세계를 타임 스탬프 및 사용자 입력 이벤트의 인터리브 된 목록의 함수 인 변화하는 상태 벡터의 스트림으로 생각하려고합니다. 이 아이디어는 괜찮은 것처럼 보이지만 비동기 프로그래밍에서는 쉽게 진행되지 않습니다. 예를 들어 GLUT의 디스플레이 함수에 대한 콜백을 등록해야하는데,이 콜백은 어떻게 든이 스트림의 "현재"항목에 액세스 할 수 있어야합니다. 그 사이에 스트림을 앞으로 나아가게 할 수있는 방법은 없습니다.

이상적으로, 나는 일종의 "외부"GLUT, 어떤 점에서 어떻게 든 실행 된 다양한 GLUT 기능에 의존하는 (아마도 모날레) 주요 기능인 무언가가 필요합니다. 어떻게 GLUT를 중심으로 그런 게임 엔진 스타일을 개발할 수 있을까요? 아니면 다른 방법으로 물어볼 수있는 방법은 제가 GLUT를 내 엔진에서 성공적으로 분리 할 수 ​​있을까요? GLUT가 인터럽트 된 인터럽트리스트를 외부 프로 시저에 생성 할 수 있습니까? Haskell은 어떻게 이것을 처리합니까?

답변

3

기능적인 그래픽 시스템을 구현하는 데 어려움을 겪을 것입니다. GLUT에 대한 Haskell 바인딩조차도 IO 모나드를 통해 명령형 프로그래밍을 사용합니다. 당신이하려고하는 것에 대해 들었던 가장 가까운 것은 Functional Reactive Programming이지만 라이브러리는 아직 준비가되지 않았으며 실제 튜토리얼이 부족합니다.

1

상태가있는 OpenGL과 같은 상태 머신에는 꽤 근본적입니다!

부작용으로 인해 화면에 물건 모음이 표시 될 때 부작용이없는 기능 프로그래밍을 수행하는 방법을 알 수 없습니다.

+0

여기에있는 문제는 부작용이 많지는 않지만 GLUT가 무언가 완료해야 할 때 비동기 적으로 콜백한다는 사실을 처리하는 방법입니다 기능적 의존 관계를 확립하는 것. GLUT의 특정 관점에서 볼 때 그걸 어떻게 보이게 할 수있는 방법이 있는지 궁금 하네.하지만 어쩌면 그렇게 명확한 생각은 아닙니다. – Steve

+0

죄송 합니다만 OpenGL 용 글꼴 추가 기능을 능가하는 GLUT를 사용하지 않았습니다. 나는 OpenGL pop/push 상태를 생각하고 있었다. 정말 도움이되지 않습니다. –

+0

> 부작용으로 인해 화면에 물건 모음이 표시 될 때 부작용이없는 기능 프로그래밍을 수행하는 방법을 알 수 없습니다. 최종 출력 단계에서 내용 ("인쇄")이 나오지만 번호가있는 순수한 기능 방식으로 프로그램합니다. 마찬가지로, 기능적 그래픽의 핵심은 풍부하고 유용한 대수가있는 데이터 유형을 제공하는 것입니다. 여기서 구성 및 프로그래밍 모델은 정확한 & 다루기 쉬운 의미 및 부작용이 없습니다.그리고 숫자를 인쇄하는 방법에 대해 걱정하는 것 이상을 그리는 것에 대해 걱정하지 마십시오. – Conal

2

기능적 그래픽에 대한 아이디어가 있으시면 FieldTrip 라이브러리를 참조하십시오.

0

이 질문을 작성하면 조금 생각해 보았습니다. 그 대답이 공동 작업을 악용하는 데 있는지 궁금해지기 시작했습니다. 게임이 GLUT 유휴 및 디스플레이 호출에 의해 트리거되는 기능적인 공동 루틴이라면 GLUT 아키텍처와 게임 로직을 분리 할 수 ​​있습니다. 예를 들어, 매우 가능성이 높습니다! 피할 수는 없지만 사용 된 GLUT 콜백이 설정된 경우! 코 루틴으로 공급되는 스트림을 수정하기 위해서만 아주 좋은 경계를 만들 수 있습니다. 이것에 대한 어떤 생각? 더 많은 것을 알기 전에 공동 루틴에 대한 더 많은 경험을해야 할 것입니다.

+0

call/cc를 사용하여 공동 루틴의 구현을 읽은 것을 기억하면서, 나는 당신이 여전히 당신의 공동 루틴 라이브러리에서'set! 'way를 사용해야한다고 생각한다. 나는 너를 괴롭히지 않을 것이다. :) 가능한 한 많은 주 변경 사항을 숨기면 여전히 코드가 많이 정리됩니다. –

+0

예, 생각을 좋아하기 시작했습니다. 만약 내가 세트를 제거 할 수 없다면, 차선책은 가능한 한 GLUT에 가깝게 유지하는 것이고, 게으른리스트의 단일 함수처럼 보이는 것으로 표현함으로써 코드를 분산시키는 것이다. GLUT 부분은 단순히 게으른 이벤트 목록을 생성하는 것입니다. 어쨌든 그것을 작업 .. :) – Steve