2D Vector 클래스의 플로트, 더블 또는 둘 다?


11

저는 현재 스튜디오 용 소형 크로스 플랫폼 OpenGL 기반 2D 게임 엔진을 작성 중입니다. 사용할 2D Vector 클래스를 조사 할 때 세 가지 디자인 패러다임을 발견했습니다.

  • 플로트 및 통화별로 값처럼 이 가마 수트라 기사 . 빠르지 만 정확도는 거의 없습니다 ( 이 Thread 참조 ). Pro : 빠르고 휴대 가능하며 대부분의 라이브러리와 호환됩니다.

  • 더블 앤 레퍼런스. 위의 기사를 올바르게 이해하면 4 개의 부동 소수점 숫자 대신 2 개의 배정 밀도 변수를 사용할 수도 있습니다. 위의 스레드에 따르면 double은 여전히 ​​float보다 느립니다.

  • 이중 및 부동을위한 템플릿 : 널리 사용되는 책 " Game Engine Architecture "는 템플릿을 사용하여 필요에 따라 부동 및 이중을 사용할 수있게합니다. 명백한 단점은 코드 팽창입니다. 또한 기본적으로 두 클래스를 작성하지 않고도 코드를 최적화 할 수 있다고 의심합니다.

사내 엔진에서 어떤 솔루션을 사용하고 있고 인기있는 게임 엔진과 같은 정밀함을 알게되어 엔진에서 어떤 솔루션을 구현할지 결정할 수 있습니다. 현재 나는 부동 소수점 정밀도를 사용하고 그것에 대해 생각하고 있습니다.


천천히 어디 ? 특정 아키텍처와 관련이없는 경우 속도에 대해 이야기 할 수 없습니다.
o0 '.

2
@ Lo'oris : double이 float보다 빠른 아키텍처는 없습니다.

자신의 벡터 클래스를 작성하는 대신 Sony ( bulletphysics.org/Bullet/phpBB3/… ) 사용을 고려하십시오 . 이미 마이크로 최적화 된 쉬운 드롭 인 헤더 전용 "라이브러리"이며 모든 벡터 라이브러리는 기본적으로 동일한 외부 인터페이스입니다.

@ 조 : 4 수레 대신 2 배?
o0 '.

@ Lo'oris : 질문이 조금 이상하다고 생각됩니다. 심지어 질문자가 혼란 스럽거나 단지 당신인지 모르겠습니다. 레지스터가 128 비트 너비이기 때문에 SIMD를 처리 할 때 4 개의 플로트 대신에 두 개의 더블을 사용하십시오. 여전히 같은 수의 숫자를 처리해야하며 절반 속도로 처리해야합니다.

답변:


9

int64_t를 사용할 이유가 없으면 int를 사용하는 것처럼 double을 사용할 이유가 없으면 항상 float을 사용합니다.

부동 소수점은 최대 24 개의 정확한 정수 연산을하는 데 아무런 문제가 없습니다 . 이는 대부분의 사람들이 (비이성적으로) 두려워하는 것입니다. 복식은 공통 값을 정확하게 표현할 수 없다는 문제를 해결하지 못합니다. 0.10000001 또는 0.10000000000000001을 얻든 상관없이 코드에서 0.09999999와 "동일한"것으로 간주해야합니다.

게임 작성에 관심이있는 모든 플랫폼에서 두 배가 느리고 메모리 대역폭을 두 배로 늘리며 사용 가능한 특수 CPU 명령어가 적습니다.

단 정밀도 플로트는 C / C ++ 측 및 내부 셰이더 모두에서 하드웨어 그래픽 인터페이스의 표준으로 유지됩니다.

언젠가는 이중 벡터가 필요할지 모르지만 필요할 때 기본적으로 사용되지 않아야합니다.

템플릿 화와 관련하여-맞습니다. 최대 성능을 위해서는 템플릿을 수동으로 전문화해야합니다. 그 외에도 주말 동안 템플릿 코드에 대해 몇 가지 테스트를 수행하여 (4 ple IntRect 및 FloatRect 만들기) 템플릿 코드 버전은 코드를 반복하는 것보다 컴파일하는 데 약 20 배 더 오래 걸린다는 것을 알았습니다. 약 15 줄 . 반복은 빨라지지만 컴파일을 기다리는 것은 더 빨라집니다. StringRect 또는 FooRect가 필요한 것은 아닙니다.


" 모든 플랫폼에서 복식이 더 느립니다 […] "– 인용이 필요했습니다.
천정

3

Microsoft XNA 게임 프레임 워크에는 float를 사용하는 Vector2 클래스가 있습니다. 이것이 XNA 팀의 지혜와 경험이 나의 것보다 훨씬 뛰어나다는 것을 믿기 때문에 이것이 플로트를 다루는 가장 큰 개인적 이유 일 것입니다.

이 스택 오버플로 질문에서 "Float vs Double Performance" 의 답변을 읽는 것이 다소 흥미 롭습니다 . GPU의 이중 성능에 대한 논의가 있는 gamedev.net 스레드 도 있습니다 . 적어도 많은 GPU에서 double이 float보다 느리다고 가정하는 것이 안전하다고 생각하며 개인적으로 항상 double Openpart에 float OpenGL 함수를 사용했습니다. 이것은 오늘날에는 적용되지 않을 수 있지만 게임을 실행하는 모든 사람이 기본 이중 지원 기능을 갖춘 최신 GPU를 가지고 있지 않다고 생각한다면 이것이 플로트를 사용하고 여분의 성능을 얻는 데 충분한 이유라고 생각합니다.


1
SO 질문에서 : "x86 프로세서에서, float와 double은 각각 FPU에 의해 처리를 위해 10 바이트 단위로 변환됩니다." 이는 사실이지만 SIMD 명령어와 추가 메모리 (= 캐시 일관성, 메모리 대역폭 증가) 요구 사항을 두 배로 모두 무시합니다. 둘 다 실제 테스트에서 부동보다 느리게 만듭니다.

캐치가 있다고 생각했습니다. SO 답변에 대해 의견을 말해야합니다.
Ricket

댓글로 이미 존재합니다.

1
XNA를 가져 왔으므로 Direct2D도 단 정밀도 부동 소수점을 사용한다는 것을 알 수 있습니다.
Mike Strobel

그리고 완벽 함을 위해 OpenGL에는 부동 및 이중 버전의 메소드가 있으므로 이러한 의미에서 중립적입니다.
Ricket
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.