Unreal'da, C ++ 'ın float ve FFloat32 arasındaki farklar nelerdir?


17

UE4'ün bazı derin yönlerini öğrenmeye çalışıyorum ve birçok örnek kodu ve motorun kaynak tabanını okurken, bazen insanların (ve çok kaynak kodunun) standart C ++ floatilkelini kullandığını, ancak bazen UE4'ün özel uygulamasını kullandığını fark ettim. FFloat32.

Sonra merak ettim: Unreal ile bir oyun programlarken, bu 2 seçeneği kullanma arasındaki farklar nelerdir ve muhtemelen standart C ++ ilkelini motorun uygulanması lehine düşürmesi gereken ana durumlar nelerdir?


1
Gerçekten kullandığını bulduğunuz örnekleri okumak isterim FFloat32.

@JoshPetrie Bazıları çevrimdışıydı, bir çift çevrimiçi. Evde vakit geçirir bitirmez, paylaşacaklarını arayacağım
Kim Shutter

Yanıtlar:


17

float, iyi, bir C ++ kayan nokta. FFloat32bir şamandıranın yanı sıra (bir birlik aracılığıyla) o şamandıranın işareti, mantis ve üs parçaları için ayrıştırılmış bit alanlarını temsil eden bir yapıdır.

Aşağıdaki durumlar dışında genellikle asla kullanmamalısınız FFloat32:

  • bir API bekleyen FFloat32 (bunlar çok nadirdir) ya da
  • kayan nokta değerine sahip bir tür düşük seviyeli bit hackery yapmanız gerekir (bu günlerde oldukça nadirdir)

Öyle değil FFloat32 ise kötü o gerçekten size noktası kullanımını kayan genel amaçlı gerekiyordu şey sunmuyor bu sadece var, haddi zatında.

Eski bir ovadan daha az yaygındır floatBazı küçük okunabilirlik etkisine sahip olan (diğerleri bir bakışta ne için olduğunu hemen bilmeyebilir). Ayrıca örtük olarakfloat bu yüzden something.FloatValueçok fazla yazacaksınız, bu da büyük bir anlaşma değil, ama sıkıcı olabilir.

Son olarak, sendikaları ve bit alanlarını kullanımı taşınabilir değildir ve uygulama tanımlıdır (aşağıya bakınız). Bu değil senin probleminiz , türün tüm desteklenen uygulamalar için kullanılabilir olacak şekilde yapılandırıldığından emin olmak Epic'in işi, ancak yeni bir derleyici olduğunda türün uygulanmasında bir sorun yakalayamazlarsa potansiyel bir hata kaynağıdır. sürümü yayınlandı veya desteklenen derleyiciler listesine eklendi.

Bu nedenle, kayan nokta gösteriminde ayrı bitlerle oynamaya ihtiyacınız yoksa, muhtemelen kaçınmalısınız FFloat32(kuzeni, FFloat16standart 16 bit C ++ kayan nokta tipi olmadığı için biraz daha fazla faydaya sahip olabilir).

Eskiden bileşenlerini " hız " için tamsayı temsili yoluyla manipüle etmek yaygındı . Modern bilgisayarlar, birçok platform için bu ihtiyacının çoğunu ortadan kaldırır ve bu tür şeyleri yapmak için kullanılabilecek çeşitli tipte kurnaz teknikler, herhangi bir olayda performans veya doğruluk için zararlı olabilir.

Unreal'ın GitHub deposunda yapılan bir aramanın FFloat32türün çok az kullanımını ortaya çıkardığını söylemek gerekir . Hepsi, FFloat32 kendi ya da tanımındadır FFloat16.


özellikle, FFloat32 C ++ standardının söylediği iki şey yapar. O:

  • sendikanın birden fazla üyesi aynı anda aktifmiş gibi davranmanıza izin verir; kayan nokta üyelerine yazmanız ve tamsayı üyelerinden birinden okumanız beklenir (9.5.1, [class.union])
  • birleşim içindeki bitfield tahsisinin bir IEEE kayan nokta değerinin bit tahsisi ile eşleşmesini bekler; bununla birlikte, bir sınıf tipi içinde bitfield üyelerinin tahsisi ve hizalanması uygulama tanımlıdır (9.6.1, [class.bit])

Unreal, standart C ++ 'da yazılmaz, yazdığı belirli derleyiciler için yazılır, böylece standart beklenen şeyleri yaptıkları sürece önemsizdir.
user253751

Bir IEEE standardı tarafından tanımlandıkları için bu bitfield'lerin standart C / C ++ 'da bile oldukça taşınabilir olmasını beklerim ve farklı bir düzen kullanan herhangi bir derleyici IEEE 754 uyumlu kırmızı işaret (ve birçok mevcut yazılımla uyumluluk sorunları floatelde etmez) ).
Dmitry Grigoryev

3
(Bilgiçlik) sorunu, bu bit alanlarının yazılı sırasının IEEE standardıyla eşleşebilmesidir, ancak C ++ derleyicisi bunları yeniden sıralayabilir veya yeniden hizalayabilir. Epic'in işi ile uğraştığından beri bu sadece küçük bir dipnot. türün doğru çalıştığını doğrulamak için her yeni derleyici sürümünü izlemelidir.

@JoshPetrie Noktası alındı, açıklama için teşekkürler.
Dmitry Grigoryev

1
@JustinLardinois Fakat FFloat32 sendikada bir floatüye içeriyor , bu yüzden eğer floataslında 32 bitten büyükse FFloat32, birlik de en büyük üyeyi alacak kadar büyük olması gerektiğinden , genel de iyi olacaktır. Şamandıraların dört bayttan büyük olduğu durumlarda Epic, sendikanın bit alanı bölümlerini de değiştirmek için değiştirmek zorunda kalacaktı, aksi takdirde tüm şamandırayı eşlemeyecekler.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.