2010-07-14 2 views
1

저는 재미있는 프로젝트로 다른 게임을 구축 할 수있는 기반으로 상당히 견고한 2D 게임 엔진을 개발하고 있습니다. (이미이 작업을 수행하고 있지만 이미 알고 있습니다. 재미 없어).C++ 예외와 같은 메시지 전달

나는 엔진 내에서 클래스 간의 메시지 전달을 수행하는 좋은 방법을 찾아 내려고하고있다. 처음에는 예외의 계층 구조를 사용하고 필요할 때마다 예외를 던지려고 생각했습니다. 그러나 그런 식으로 개발하면서 상당히 일반적인 예외 (경로 찾기 및 단위 찾기 기능을 처리하는 서브 루틴의 일부와 함께 상태를 테스트해야하는 항목)에 예외가 많이 발생했습니다. 게임 보드 많이). 예외가 길 찾기에서 유닛을 가로 질러 왔고 주변을 돌아 다닐 필요가있는 것과 같은 경우에 예외가 사용되면 TileOccupied 예외가 발생하고 길 찾기가 정상적으로 처리하고 계속 진행할 수 있습니다. 예상 할 수 있듯이 이로 인해 많은 예외가 생겼습니다.

인터넷에서 예외 처리는 수행해야하는 모든 런타임 처리로 인해 비용이 많이들 것이라고 말했습니다. 하지만 그들은 내가 필요로하는 것을 완벽하게 처리합니다. 이것은 어떤 일이 발생했거나 예상했던 것과 다른 일이 발생했음을 나타 내기 위해 분기 서브 루틴을 통해서도 호출자에게 메시지를 전달할 수 있습니다.

C++에서 이것을 수행하는 깨끗하고 효율적인 방법이 있습니까? 또는이 유형의 알림을 사용하는 경우 매우 잘못 구성됩니다. 난 아직 배우는 중이에요, 그래서 어떤 제안을 크게 감상 할 수있다 (그리고 난 당신이 내 길을 던질 수있는 참조를 배울 수 읽기/기꺼이) 나는 BTW 표준 C++에서이 작업을 수행하기 위해 노력하고있어

을 편집을 . 나는 그것을 리눅스에 쓰고 있는데, 그것을 컴파일하고 실행 가능한 플랫폼 독립적으로 만들고 싶다. 현재 Boost를 사용 중입니다.

+1

예외적 인 경우 예외를 사용해야합니다. "정상적인"프로그램 논리에 사용하지 마십시오. – Cogwheel

+0

나는 그것을 지금 깨달았다. 그래서 예외를 사용하지 않고 동일한 스타일의 사용을 처리 할 수있는 더 나은 방법을 찾으려고합니다. – Veaviticus

+0

프레임 워크를 사용하고 있습니까? 부스트, 닷넷 등? – Caladain

답변

2

명시 적 등록이 필요하지만 콜백 (예 : Boost.Function으로 수정) 또는 신호 (예 : Boost.Signals/Signals2)를 원하는 것처럼 들립니다.

+0

약간의 연구가 끝나면 Boost 구현을 사용하거나 libsigC++를 사용하여 곧바로 사용할 것을 권장하겠습니까? 가능한 한 많은 런타임 효율성을 찾고 있는데,이 기사는 효율성이 훨씬 떨어지는 것 같습니다. http://marc.info/?l=libsigc-list&m=112279476018630 ​​ – Veaviticus

+0

@vea : 성능에 신경 쓰면 사용 사례에 맞게 측정해야하며이 측정 값은 2004 년부터 나온 것임을 유의하십시오. 개인적으로는 거기에 성능 문제가 실제로 있지 않는 한 이미 구성 요소를 사용하고 있다면 Boost를 사용하십시오. –

+0

@ 조지 내가 화제와 도로 길을 조금 알고 있지만 그런 타이밍을하는 방법에 대한 제안이 있습니까? – Veaviticus

0

이벤트 대기열 및/또는 관찰자 설정을 사용하지 않은 이유가 있습니까?

+1

주된 이유는 무엇인지 모르겠습니다. 내가보기 시작한다 – Veaviticus

0

예외가 잘못된 방법입니다. 일반적인 제안은 직접적인 이벤트/청취자 디자인 일 것이지만, 사소한 시스템에서는 빨리 벗어나게됩니다. 느슨한 통신에 대해서는 whiteboard design을 가리키고 있습니다.

관련 문제