언리얼에서 C ++의 float과 FFloat32의 차이점은 무엇입니까?


17

UE4의 더 깊은 측면을 배우려고 노력했으며 많은 예제 코드와 엔진의 소스베이스를 읽는 동안 때때로 사람들 (그리고 소스 코드)이 표준 C ++ float프리미티브를 사용하지만 때로는 UE4의 커스텀 구현을 사용한다는 것을 알았습니다 FFloat32.

그런 다음 궁금한 점이 있습니다. 언리얼로 게임을 프로그래밍 할 때이 두 가지 옵션을 사용하는 것의 차이점과 엔진 구현을 위해 표준 C ++ 프리미티브를 삭제해야 할 주요 사례는 무엇입니까?


1
실제로 사용하는 예제를 읽는 데 관심이 있습니다 FFloat32.

@JoshPetrie 그들 중 일부는 오프라인 상태였으며, 한 쌍은 온라인 상태였습니다. 집에 시간이
Kim Shutter

답변:


17

floatC ++ 부동 소수점입니다. FFloat32는 플로트의 부호, 가수 및 지수 부분에 대한 분해 비트 필드뿐만 아니라 플로트뿐만 아니라 플로트를 나타내는 구조입니다.

당신은 일반적으로해야 결코 사용하지 않는 FFloat32경우를 제외하고는 :

  • 당신은 FFloat32(매우 드물다) 기대하는 API를 사용하고 있거나
  • 부동 소수점 값을 가진 일종의 저수준 비트 해커를 수행해야합니다 (요즘 상당히 드문 경우)

그것은이 아니다 FFloat32입니다 나쁜 그것이 정말 당신이 포인트 사용을 부동 범용 필요한 것 아무것도 제공하지 않습니다 단지, 그 자체를.

평범한 오래된 것보다 덜 일반적입니다. float 가독성에 약간의 영향을 미칩니다 (다른 사람들은 한 눈에 무엇을 즉시 알지 못할 수도 있습니다). 또한 암시 적으로 변환되지 않으므로 많이 float입력 할 것 something.FloatValue입니다.이 또한 큰 문제는 아니지만 지루할 수 있습니다.

마지막으로 공용체와 비트 필드의 사용은 이식 가능하지 않으며 구현 정의되어 있습니다 (아래 참조). 이것은 아니다 당신의 문제 , 지원되는 모든 구현에 사용할 수 있도록 유형이 구조화되어 있는지 확인하는 것이 Epic의 일이지만, 새로운 컴파일러 일 때 유형 구현에 문제가 없으면 버그의 잠재적 원인입니다. 버전은 지원되는 컴파일러 목록에 릴리스되거나 추가됩니다.

따라서 부동 소수점 표현에서 개별 비트로 재생할 필요가 없다면 피해야합니다. FFloat32 (사촌, FFloat16표준 16 비트 C ++ 부동 소수점 유형이 없으므로 약간 더 유용 할 수 있습니다).

" 속도 "에 대한 구성 요소의 정수 표현을 통해 플로트를 조작하는 것이 일반적이었습니다 . 최신 컴퓨터는 많은 플랫폼에 대한 필요성과 다양한 이러한 종류의 작업을 수행하는 데 사용할 수있는 유형 제거 기술은 실제로 모든 이벤트에서 성능이나 정확성에 해로울 수 있습니다.

Unreal의 GitHub 리포지토리를 검색하면 해당 FFloat32유형의 사용이 거의 없음을 알 수 있습니다. 그들 모두의 정의에 FFloat32 자체의 정의 또는의 정의에있다 FFloat16.


구체적으로 특별히, FFloat32 C ++ 표준이 요구하는 두 가지 작업을 수행합니다. 그것:

  • 한 번에 둘 이상의 노조 구성원이 활동중인 것처럼 행동 할 수 있습니다. 부동 소수점 멤버에 쓰고 정수 멤버 중 하나에서 읽어야합니다 (9.5.1, [class.union])
  • 유니온 내 비트 필드 할당이 IEEE 부동 소수점 값의 비트 할당과 일치 할 것으로 예상합니다. 그러나 클래스 유형 내에서 비트 필드 멤버의 할당 및 정렬은 구현에 따라 정의됩니다 (9.6.1, [class.bit])

언리얼은 표준 C ++로 작성되지 않고 표준과 관련이없는 것으로 예상되는 한 특정 컴파일러 용으로 작성되었습니다.
user253751

이 비트 필드는 IEEE 표준으로 정의되어 있기 때문에 표준 C / C ++에서도 이식성이 뛰어날 것으로 예상되며 다른 레이아웃을 사용하는 컴파일러 floatIEEE 754 호환 레드 마크 가 아니며 많은 기존 소프트웨어와의 호환성 문제가 발생 하지 않습니다. ).
Dmitry Grigoryev

3
(pedantic) 문제는 해당 비트 필드의 작성된 순서가 IEEE 표준과 일치 할 수 있지만 C ++ 컴파일러는 재정렬하거나 재정렬 할 수 있다는 것입니다. 비록 그것을 다루는 것이 에픽의 일이지만, 이것은 단지 작은 각주입니다. 형식이 올바르게 작동하는지 확인하기 위해 각각의 새 컴파일러 버전을 모니터링해야합니다.

@JoshPetrie 포인트를 가져 주셔서 감사합니다.
Dmitry Grigoryev

1
@JustinLardinois 그러나 FFloat32에는 Union의 float멤버가 포함되어 있으므로 float실제로 32 비트보다 큰 경우 FFloat32Union은 최대 멤버를 보유 할 수있을만큼 커야하므로 전체 도 마찬가지입니다. float가 4 바이트보다 큰 경우 Epic은 유니언의 비트 필드 부분을 수정하고이를 해결하기 위해 수정해야했습니다. 그렇지 않으면 완전한 float을 매핑하지 않습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.