Kayan nokta sayılarının deterministik bir şekilde ele alınması hakkında
Kayan nokta deterministiktir. Olmalı. Karmaşık bir durum.
Kayan nokta sayılarıyla ilgili çok sayıda literatür var:
Ve nasıl sorunlu olduklarını:
Özet için. En azından, tek bir iş parçacığında, aynı sırayla gerçekleşen aynı verilerle aynı işlemler belirleyici olmalıdır. Böylece girdiler hakkında endişelenerek ve yeniden sırayla başlayabiliriz.
Sorun yaratan böyle bir girdi zamandır.
Her şeyden önce, her zaman aynı zamanlamayı hesaplamanız gerekir. Zamanı ölçmemeyi söylemiyorum, fizik simülasyonuna zaman geçirmeyeceğinizi söylüyorum, çünkü zamandaki değişimler simülasyondaki bir gürültü kaynağı.
Fizik simülasyonuna geçmiyorsanız neden zaman ölçüyorsunuz? Bir simülasyon adımının ne zaman aranması gerektiğini bilmek için geçen süreyi ölçmek ve - ne zaman uyuduğunuzu varsayarak - ne kadar uyuyacağınızı ölçmek istersiniz.
Böylece:
- Ölçüm süresi: evet
- Simülasyonda kullanım süresi: Hayır
Şimdi, talimat yeniden sipariş ediliyor.
Derleyici bununla f * a + b
aynı olduğuna karar verebilir b + f * a
, ancak bunun farklı bir sonucu olabilir. Ayrıca fmadd'i derleyebilir ya da bunun gibi birden fazla satırın birlikte olması ve SIMD ile yazmaları ya da şu anda düşünemeyeceğim başka bir optimizasyona karar vermeleri gerekebilir . Ve aynı işlemlerin aynı sırayla yapılmasını istediğimizi unutmayın, hangi işlemlerin gerçekleştiğini kontrol etmek istiyoruz.
Ve hayır, çift kullanmanız sizi kurtarmaz.
Özellikle ağdaki kayan nokta sayılarını senkronize etmek için derleyici ve yapılandırması hakkında endişelenmeniz gerekir. Yapıları aynı şeyi yapmayı kabul etmeleri gerekir.
Muhtemelen, yazı derleme ideal olacaktır. Bu şekilde hangi işlemin yapılacağına karar verirsiniz. Ancak, bu çoklu platformları desteklemek için bir problem olabilir.
Böylece:
Sabit nokta sayıları için durum
Yüzenlerin bellekte temsil edilmesinden dolayı, büyük değerler hassasiyetini kaybedecek. Değerlerinizi küçük tutmanın (kelepçeyi) problemi azaltmasının nedeni budur. Böylece, devasa hızlar ve geniş odalar yok. Bu da ayrı fizik kullanabileceğiniz anlamına gelir çünkü tünel açma riskiniz daha düşüktür.
Öte yandan, küçük hatalar birikir. Yani, kısalt. Yani, tamsayı tipine ölçek ve döküm. Bu şekilde hiçbir şey bilmediğini biliyorsun. Tamsayı tipinde kalarak yapabileceğiniz işlemler olacaktır. Kayan noktaya geri dönmeniz gerektiğinde, ölçeklendirme işlemini gerçekleştirir ve geri alırsınız.
Not Ölçeği söylüyorum. Buradaki fikir, 1 birimin aslında ikisinin gücü olarak temsil edileceğidir (örneğin 16384). Her ne ise, sabit yap ve kullan. Temel olarak sabit nokta numarası olarak kullanıyorsunuz. Aslında, bazı güvenilir kütüphanelerden uygun sabit nokta sayıları kullanabiliyorsanız, çok daha iyi.
Kısaltmak diyorum. Yuvarlama sorunu hakkında, oyuncu kadrosundan sonra elde ettiğiniz değerin son kısmına güvenemeyeceğiniz anlamına gelir. Bu yüzden, alçı ölçeğinden önce gerekenden biraz daha fazlasını elde etmek ve sonra kesmek için.
Böylece:
- Değerleri küçük tutun: Evet
- Dikkatli yuvarlama: Evet
- Mümkün olduğunda sabit nokta numaraları: Evet
Bekle, neden kayan noktaya ihtiyacın var? Yalnızca bir tamsayı türü ile çalışamaz mıydınız? Ah, doğru. Trigonometri ve radikalleşme. Trigonometri ve radikasyon için tabloları hesaplayabilir ve kaynağınızda pişirilmesini sağlayabilirsiniz. Veya bunların yerine sabit nokta sayıları kullanmak dışında bunları kayan nokta sayıları ile hesaplamak için kullanılan algoritmaları uygulayabilirsiniz. Evet, hafızayı, performansı ve hassasiyeti dengelemeniz gerekir. Yine de, kayan nokta sayıları dışında kalabilir ve deterministik kalabilirsiniz.
Orijinal PlayStation için böyle şeyler yaptıklarını biliyor muydunuz? Lütfen Köpeğimle Tanış Yamalar .
Bu arada, grafikler için kayan nokta kullanmadığını söylemiyorum. Sadece fizik için. Tabii ki, pozisyonlar fiziğe bağlı olacak. Ancak, bir çarpıştırıcının bildiğiniz gibi bir modelle eşleşmesi gerekmez. Modellerin kesilmesinin sonuçlarını görmek istemiyoruz.
Böylece: SABİT NOKTA NUMARALARI KULLANIN.
Açıkçası, kayan noktaların nasıl çalıştığını belirtmenize izin veren bir derleyici kullanabilirsiniz ve bu sizin için yeterliyse, bunu yapabilirsiniz. Bu her zaman bir seçenek değildir. Ayrıca bunu determinizm için yapıyoruz. Sabit nokta sayıları, hiçbir hata olmadığı anlamına gelmez, hepsinden sonra sınırlı hassasiyetleri vardır.
"Sabit nokta numarasının zor" olduğunu kullanmamak için iyi bir neden olduğunu sanmıyorum. Ve bunları kullanmak için iyi bir neden istiyorsanız, bu determinizm, özellikle de platformlar arasındaki determinizmdir.
Ayrıca bakınız:
Zeyilname : Dünyanın boyutunu küçük tutmayı öneriyorum. Bununla birlikte, hem OP hem de Jibb Smart, orijinal şamandıralardan uzaklaşmanın daha az hassas olduğu noktasını ortaya koymaktadır. Bu, dünyanın sınırından çok daha erken görülen fizik üzerinde bir etkiye sahip olacak. Sabit nokta sayıları, kesin olarak kesindirler, her yerde eşit derecede iyi (ya da istersen kötü) olacaklardır. Determinizm istiyorsak bu iyi. Ayrıca, genellikle fiziği yapma şeklimizin küçük farklılıkları yükseltme özelliğine sahip olduğunu da belirtmek isterim. The Incredible Machine ve Contraption Maker'da Kelebek Etkisi - Deterministik Fiziği görün .
Fizik yapmanın başka bir yolu
Düşündüm, kayan nokta sayısındaki küçük hassasiyetin artmasının nedeni, bu sayılar üzerinde yinelemeler yapmak olduğumuzdur. Her simülasyon aşaması, son simülasyon aşamasının sonuçlarını alır ve üzerlerinde bir şeyler yaparız. Hataların üzerine biriken hatalar. Bu senin kelebek efektin.
Aynı makinede tek bir iplik kullanarak tek bir yapı göreceğimizi sanmıyorum, aynı girdi tarafından farklı çıktılar veriyor. Ancak, başka bir makinede olabilir veya farklı bir yapı olabilir.
Orada test etmek için bir argüman var. İşlerin tam olarak nasıl çalışması gerektiğine karar verirsek ve hedef donanım üzerinde test yapabilirsek, farklı davranışa sahip yapılar ortaya koymamalıyız.
Ancak, çok fazla hata biriktiren uzakta çalışmamak için bir argüman var. Belki de bu, fiziği farklı bir şekilde yapmak için bir fırsattır.
Bildiğiniz gibi, sürekli ve ayrık bir fizik var, her ikisi de zaman aşımındaki her bir nesnenin ne kadar ilerleyeceği üzerinde çalışıyor. Bununla birlikte, sürekli fiziğin, bir çarpışmanın olup olmadığını görmek için farklı muhtemel instantları araştırmak yerine çarpışma anında çözülmesine imkan veren bir aracı vardır.
Bu nedenle, aşağıdakileri öneriyorum: her bir nesnenin bir sonraki çarpışmasının ne zaman olacağını, tek bir simülasyon adımından birinin çok daha büyük, büyük bir zaman adımıyla ne olacağını anlamak için sürekli fizik tekniklerini kullanın. Sonra en yakın çarpışma anını alırsınız ve her şeyin o anda nerede olacağını anlarsınız.
Evet, bu tek bir simülasyon adımının çok çalışmasıdır. Bu, simülasyonun hemen başlamayacağı anlamına gelir ...
... Ancak, her seferinde çarpışmayı kontrol etmeden sonraki birkaç simülasyon adımını simüle edebilirsiniz, çünkü bir sonraki çarpışmanın ne zaman olacağını zaten biliyorsunuzdur (veya büyük zaman diliminde çarpışma gerçekleşmez). Ayrıca, bu simülasyonda biriken hataların önemi yoktur, çünkü simülasyon büyük zaman adımına ulaştığında, önceden hesapladığımız konumları yerleştiririz.
Şimdi, bulduğumuz bir sonraki çarpışmayı hesaplamak için her simülasyon adımındaki çarpışmaları kontrol etmek için kullanacağımız zaman bütçesini kullanabiliriz. Bu, büyük zaman adımını kullanarak ileriye dönük bir simülasyon yapabiliriz. Kapsamı sınırlı bir dünya varsayalım (bu büyük oyunlar için işe yaramayacak), simülasyon için gelecekteki durumların bir sırası olmalı ve sonra sadece son durumdan diğerine enterpolasyona girdiğiniz her bir çerçeve olmalıdır.
İnterpolasyon için tartışırdım. Ancak, ivme olduğu göz önüne alındığında, her şeyi aynı şekilde enterpolasyon yapamayız. Bunun yerine her nesnenin ivmesini hesaba katarak enterpolasyon yapmamız gerekiyor. Bu nedenle, büyük zaman aşımı için yaptığımız gibi aynı pozisyonu güncelleyebiliriz (bu aynı zamanda daha az hata eğilimli olduğu anlamına gelir, çünkü aynı hareket için iki farklı uygulama kullanmayacağız).
Not : Bu kayan nokta sayılarını yapıyorsak, bu yaklaşım nesnelerin kökenlerinden daha farklı davranma sorununu çözmez. Ancak, kesinliğin orijinden uzaklaştıkça kaybolduğu doğru olsa da, yine de belirleyicidir. Aslında, bu yüzden başlangıçta bunu bile gündeme getirmedi.
ek
OP'deki yorumdan :
Buradaki fikir, oyuncuların makinelerini bir biçimde (xml veya json gibi) kaydedebilecekleri, böylece her bir parçanın konumu ve dönüşü kaydedilecek. Bu xml veya json dosyası daha sonra makineyi başka bir oyuncunun bilgisayarında çoğaltmak için kullanılacaktır.
Yani, ikili format yok, değil mi? Bunun anlamı, geri kazanılan kayan noktaların orijinaliyle uyuşup uyuşmadığı ile ilgili endişelenmemiz gerektiğidir. Bakınız: Şamandıra Hassasiyeti Tekrar Ziyaret Edildi: Dokuz Haneli Şamandıralı Taşınabilirlik