문제

저는 휴대용 하드웨어(Pandora)를 대상으로 C++로 RTS 게임을 작업 중입니다.참고로 Pandora에는 ~600Mhz의 단일 ARM 프로세서가 있으며 Linux를 실행합니다.우리는 (내부 및 외부 모두) 좋은 메시지 전달 시스템을 확립하려고 노력하고 있으며 이는 나에게 새로운 영역입니다.

우리가 전달하고 싶은 메시지의 예를 들어보면 도움이 될 수 있습니다.유닛은 모델을 메모리에 로드하기 위해 다음 호출을 할 수 있습니다.

sendMessage("model-loader", "load-model", my_model.path, model_id );

그 대가로 유닛은 특정 model_id에 대한 모델 객체를 포함하는 일종의 메시지를 기대할 수 있으며, 이는 그래픽 시스템에 전달될 수 있습니다.이 sendMessage 기능은 결코 최종 기능이 아닙니다.이는 단지 메시지 전달 시스템에 대한 나의 현재 이해를 반영할 뿐이며 아마도 정확하지 않을 것입니다. :)

내가 알 수 있는 바에 따르면 두 가지 매우 뚜렷한 선택이 있습니다.하나는 메모리에 메시지를 전달하고 외부 시스템과 통신해야 할 때만 네트워크를 통과하는 것입니다.오버헤드가 낮아 보이기 때문에 이 아이디어가 마음에 들지만 여기서 가장 큰 문제는 메시지 대기열에서 뮤텍스 잠금을 광범위하게 사용해야 한다는 것입니다.가능하다면 과도한 잠금을 피하고 싶습니다.나는 잠금 없이 간단한 큐를 구현하는 몇 가지 방법을 읽었습니다. int 작업) 그러나 이는 대기열에 판독기와 기록기가 각각 1명만 있다고 가정합니다.객체의 큐에는 많은 작성자와 한 명의 판독기가 있으므로 이는 우리의 특별한 경우에는 유용하지 않은 것 같습니다.

다른 선택은 네트워크 계층을 완전히 넘어서는 것입니다.이것은 거의 무료로 비동기 메시지 전달을 얻는 것과 같은 몇 가지 재미있는 이점을 가지고 있습니다.또한 로컬로 전달하는 것과 동일한 호출을 사용하여 다른 시스템에 메시지를 전달하는 기능을 얻습니다.그러나 이 솔루션은 아마도 내가 완전히 이해하지 못하기 때문에 잘못된 방향으로 가고 있습니다. 메시지를 보내고 받을 모든 개체에 소켓이 필요합니까?그렇다면 이는 과한 것 같습니다.특정 게임에는 수천 개의 개체가 있습니다.Pandora와 같이 성능이 다소 부족한 장치의 경우 네트워크를 남용하면 병목 현상이 발생할 수 있다는 우려가 있습니다.하지만 아직 어떤 테스트도 실행하지 않았으므로 이것은 단지 추측일 뿐입니다.

MPI는 메시지 전달에 인기가 있는 것 같지만 확실히 우리가 원하는 것에 비해 과잉이라고 느껴집니다.이 코드는 클러스터를 건드리거나 무거운 계산을 수행할 필요가 없습니다.

이를 달성하기 위해 어떤 옵션이 있는지에 대한 통찰력을 주시면 감사하겠습니다.

도움이 되었습니까?

해결책

네트워크도 잠금을 사용합니다.OS 커널에서 볼 수 없는 곳에 있을 뿐입니다.

내가 할 일은 필요에 따라 다시 작성할 수 있는 메시지 대기열 개체를 만드는 것입니다.간단하게 시작하고 필요에 따라 더 좋게 만드세요.이렇게 하면 나머지 코드를 변경하지 않고도 뒤에서 원하는 구현을 사용하도록 할 수 있습니다.

앞으로 수행하고 싶은 몇 가지 가능한 구현을 살펴보고 해당 조건에 따라 구현하기로 결정한 경우 모든 구현을 효율적으로 처리할 수 있도록 API를 설계하세요.

정말 효율적인 메시지 전달을 원한다면 일부 오픈 소스 L4 마이크로커널을 살펴보세요.그 사람들은 많은 빠른 메시지 전달에 시간이 걸립니다.

다른 팁

이것은 작은 플랫폼이므로 두 가지 접근 방식을 모두 타이밍 할 가치가있을 수 있습니다.

그러나 일종의 큰 속도 문제를 제외하고는 항상 코드가 더 간단한 접근 방식을 갈 수 있습니다. 수신자가 어디에 있든 동일한 코드가 될 것이므로 네트워크 스택을 사용하게 될 것입니다. 상호 제외, 메시지 버퍼링, 할당 등을 수동으로 코딩하고 배제 할 필요가 없습니다.

너무 느리다는 것을 알게되면 나중에 메모리를 사용하여 항상 로컬 항목을 다시 코딩 할 수 있습니다. 그러나 왜 시간을 낭비하지 않아도 될까요?

가능할 때마다 메시지를 메모리로 전달하는 Zan의 추천에 동의합니다.

한 가지 이유는 마샬링 및 Unmarshal (Serialize and De-Serialize)없이 복잡한 객체 C ++를 전달할 수 있기 때문입니다.

세마포어로 메시지 대기열을 보호하는 비용은 네트워킹 코드 호출 비용보다 적을 것입니다.

잠금이없는 알고리즘으로 메시지 대기열을 보호하는 경우 (자신이 암시 한대로 원자 연산을 사용) 커널 안팎으로 많은 컨텍스트 전환을 피할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top