2010-04-27 1 views
8

게임 엔진에 네트워크 구성 요소가 필요한 비디오 게임 Humm and Strumm을 작성 중입니다. 나는 엔디안의 차이점을 쉽게 다룰 수 있지만, 나는 float 메모리 포맷을 다룰 때 벽을 치고있다. 현대 컴퓨터는 모두 표준 정수 형식을 가지고 있지만, 나는 그들이 모두 부동 소수점 정수에 대해 IEEE 표준을 사용하지 않을 수도 있다고 들었습니다. 사실입니까?비 IEEE C/C++ 플로트 형식의 최신 플랫폼이 있습니까?

물론 각 패킷에 문자열을 출력 할 수는 있지만 플랫폼에 관계없이 각 클라이언트의 "잘 알려진 형식"으로 변환해야합니다. printf()atod() 표준은 부적절 할 수 있습니다.

이 게임은 GNU/Linux, * BSD 및 Microsoft Windows에서 실행되는 Free/Open Source 소프트웨어 프로그램이므로 독점적 인 솔루션이나 단일 플랫폼 솔루션을 사용할 수 없습니다.

건배,
패트릭

답변

4

각 플랫폼에 의존 할 수있는 IEE-754 사양이 구현되어 있다고 가정하는 것이 안전하다고 생각합니다. 그러나 모두 동일한 사양을 구현하더라도 각 플랫폼이 완전히 동일하다는 보장이 없습니다 동일한 FP 컨트롤 플래그가 설정되거나, 동일한 최적화를 수행하거나, 동일한 비표준 확장을 구현합니다. 이것은 부동 소수점 결정을 제어하기가 매우 어렵고 이런 종류의 (FP 값을 네트워크를 통해 통신 할 곳)에 사용하기에는 다소 신뢰할 수 없습니다.

자세한 내용은 여기를 참조하십시오. read http://gafferongames.com/networking-for-game-programmers/floating-point-determinism/

부동 소수점 유닛이없는 클라이언트를 처리하는 데 또 다른 문제가 있습니다. 대부분의 경우 이들은 로우 엔드 CPU, 콘솔 또는 내장 장치가 될 것입니다. 목표를 설정하려면이 점을 고려해야합니다. FP 에뮬레이션은 수행 될 수 있지만 이러한 장치에서 매우 느려지므로 고정 소수점 계산을 수행해야합니다. 그래도 정교한 클래스를 추상 부동 소수점 및 고정 소수점 계산에 동일한 코드로 작성하는 것이 좋습니다. 그러나 대부분의 장치에서는 그렇지 않습니다. 고정 소수점 값을 처리 할 때 최대 정밀도와 성능을 짤 수 없습니다.

부동 소수점 값의 엔디안을 처리하는 또 다른 문제는 바이트를 스왑하고 부동 소수점 레지스터에 'm'을 다시 쌓을 수 없기 때문입니다 (바이트는 다른 의미를 가질 수 있습니다. http://www.dmh2000.com/cpp/dswap.shtml 참조).

나의 조언은 부동 소수점을 중간 값으로 변환하고 필요할 경우 엔디안 보정을 수행하여 전송하는 것입니다. 또한 서로 다른 시스템에서 두 개의 부동 소수점 계산이 동일한 결과를 산출한다고 가정하지 마십시오. 그들은하지 않습니다. 그러나 IEEE-754 이외의 부동 소수점 구현은 거의 없습니다. 예를 들어 GPU는 고정 소수점을 사용하는 경향이 있지만 요즘 IEEE-754의 하위 집합을 가질 가능성이 높습니다. 요즘 IEEE-754는 0으로 나누기 예외를 처리하기를 원하지 않기 때문에 반 부동 소수점에 대한 확장이있을 것입니다. 16 비트.

또한 이미이 문제 (게임 컨텍스트에서 저수준 데이터 형식 보내기)를 해결 한 라이브러리가 있다는 것을 알고 있습니다. 그러한 라이브러리 중 하나 인 RakNet은 특히 BitStream 클래스가 오버 헤드를 최소화하면서 이러한 종류의 데이터를 여러 플랫폼에 안정적으로 전송하도록 설계되었습니다. 예를 들어 RakNet은 문자열이나 벡터를 전송할 때 대역폭을 낭비하지 않도록 상당한 문제를 겪습니다.

+0

당신이 준 결정론은 매우 흥미 롭습니다. 나는 클라이언트가 동기화되었는지 확인하기 위해 더 큰 메시지를 사용하여이를 수행하려고 생각해 왔습니다. 위치가 충분히 가깝다면 (1 단위는 1 미터 임) 괜찮을 것입니다. 콘솔 플랫폼 및 대부분의 임베디드 시스템을 대상으로하지 않습니다. 내가 이것을 자유 소프트웨어로 할 수 있을지 확신 할 수 없다. 저사양 프로세서에 관해서는, 그것은 더 많은 관심사입니다. 바이트 스왑 문제는 매우 불행합니다 ... 간단히 기사를 건너 뛰었지만 나중에 읽어야합니다. 정보를 제공해 주셔서 감사합니다. –

+0

GP2X 및 Open Pandora와 같은 오픈 소스 소프트웨어를 게시 할 수있는 덜 알려진 (핸드 헬드) 콘솔이 있습니다. 부동 소수점 결정론 문제는 주로 물리 루틴을 분산 (예 : 클라이언트에서 실행)하거나 다른 시스템에서 오류를 아주 빨리 축적하는 경향이 있기 때문에 실행을 결정할 때 발생합니다. –

1

일부 임베디드 프로세서는 전혀 부동 소수점 하드웨어가 포함되어 있지 않습니다. 데스크톱 컴퓨터의 경우 전문가를 괴롭히는 세부 정보를 제외하고는 너무 많은 걱정할 이유가 없습니다 (sqrt은 Alpha에서 잘못 반올림 됨). 이러한 차이점은 작업 구현에있어 불편을 겪습니다. 어쨌든 형식이 아님).

플랫폼 간 변형은 denormals 처리와 관련이 있습니다. I asked a question about those a while back. 심지어 그것은 내가 예상했던 것만 큼 나쁘지 않았습니다.

+0

괜찮 았어, 고마워, 파스칼. 게임에서 float의 이진 형식에 대해 걱정할 필요가없는 것은 분명 도움이 될 것입니다. IEEE-754 수레가 내 인생을 훨씬 쉽게 만든다고 가정합니다.^_^ –

6

네트워크 인터페이스를 적절하게 추상화하면 float 데이터 유형을 직렬화 및 비 직렬화하는 함수/객체를 가질 수 있습니다. 필자가 생각할 수있는 모든 시스템에서 이들은 IEEE 표준이므로 데이터를 변경하지 않고 전달할 수 있습니다 (컴파일러는이를 최적화하여 성능을 잃지 않을 것입니다). 다른 형식의 시스템이있는 경우 이러한 기능의 일부 코드에서 조건부 컴파일을 수행하여 IEEE 표준을 기본 형식으로 변환하기위한 비트 해킹을 수행 할 수 있습니다. 한 곳에서 변경하면됩니다. 콘솔/핸드 헬드/등으로 들어 가지 않는 한, 그렇게하지 않아도됩니다.

+0

이것은 현재 내 시스템이 설계된 방식입니다. 비 IEEE 플로트가 얼마나 흔한 지 잘 모르겠습니다. 나는 당신의 조언을 따르고 그것을 지켜 드리겠습니다. 감사합니다. –