Thread overview
float - JSon - Photon
Jun 28, 2022
Salih Dincer
Jun 28, 2022
Ali Çehreli
Jul 04, 2022
Kerim G
Jul 05, 2022
Ali Çehreli
June 28, 2022

Merhaba,

Ragıp Hatunoğlu'nun, float - JSon - Photon şeklinde başlıklandırdığı yazısını paylaşmak istiyorum. Bu oyun geliştiren bir arkadaş ve konunun doğrudan D ile hiçbir ilgisi yok ama std.json ile basit bir deneme yapabiliriz.

>

Cins bir sorunun kronolojisi :) Biraz uzun bir yazı olabilir..)

1. Adım: Oyunda 1000m'lik yarışı kurguladığımda hata veriyordu. Sebebine baktığımda gönderilen JSon dosyasının karakter uzunluğunun 60K nın üzerinde olduğunu gördüm. Photon en fazla 41K civarına izin veriyormuş. Oyunun yapısı bu kadar basitken böyle büyük bir uzunluk nereden oluşuyor diye baktım. İki tane sebep çıktı; Vector3 ve float değişkenler. Örneğin bir pozisyon datası x:3.98203402384023, y:0.237450375927834... gibi baya uzun oluyor. Aynı şekilde float'lar da öyle. Mecbur kalmadıkça V3 göndermediğim için onlara dokunmadım. Dedim bir sürü float var, onların ondalık basamaklarını 2 haneye yuvarlayayım, baya bir tasarruf sağlanır. Öyle de yaptık.

2. Adım: float'ların hepsinin ondalık kısmını yuvarladık ama ilk defa keşfettiğim bir durumla karşılaştım. Örneğin float 3.00 yada 4.25 gibi bir şey ise JSon'a bu şekilde ekleniyorlar (V3 içindekilerde böyle). Ama float, benim yuvarladığım gibi 2.34 tarzındaysa JSon içinde 2.339384029340.. gibi gidiyor. Bu çok saçma geldi bana. Dedim bir yerde hata yapıyorum herhalde. Uğraştım didindim, baktım yok. Internete bakayım dedim; birisi, aynı sorunu yaşayan başka birine şöyle bir ifade kullanmış: "float'ın sorununu keşfetmişsin". Bana göre garabet.. (JSon kütüphaneleri arasında böyle sayıları otomatik yuvarlayanlar varmış ama uğraşmaya değmez dedim)

3. Adım: O zaman ben bu float'ları string'e çevireyim, garanti olsun diye aklıma geldi. Öyle de yaptım. JSon boyutu 20K'lara kadar indi. Dedim oh, sorunu çözdük. Bilgisayarda denedim, sıkıntısız. Telefona attım, onda da problem yok. Sonra telefon ile bilgisayardan karşılıklı oyun açtım, hobaaa.. Telefondan oyun kurunca bilgisayardaki sapıtıyor, bilgisayardan kurunca telefondaki sapıtıyor. Yani gönderilen datayı kim alıp oyunu kuruyorsa o karman çorman birşey kuruyor. Uzatmayım, sorunu aradım taradım en son şöyle buldum:

Bilgisayar, ondalıklı sayıları "." ile, telefon ise ondalıklı sayıları", ile ayırıyormuş. Mesela bilgisayarda bir diken engelinin uzunluğunu "7.35" diye telefona gönderdiğimde, string giden o yazıyı telefon float.Parse ile dönüştürmeye çalışınca, virgül ile ayrım yaptığı için (tabi sayıda da virgül olmadığından) çeviri 735 çıkıyor. Alana 735 metrelik bir diken koyuyor sonra.. "Ya bu nokta yada virgül olsa ne farkeder, illa çevirsin" dedim ama olmuyormuş öyle. Bazı kültürlerde, 2,345,564.00 gibi sayılar olduğu içün, kültürünü belirtmemiz gerekiyormuş..

4. Sonuç: En son gına gelince, ondalık basamağını 2'ye yuvarladığım sayıları 100 ile çarptım, int'e çevirdim, gönderip tekrar 100'e böldüm.. Bu ne be..

SDB@79

June 28, 2022
On 6/27/22 21:58, Salih Dincer wrote:

>> şöyle bir ifade kullanmış: "float'ın sorununu keşfetmişsin".

Tanıdık.

>> Bilgisayar, ondalıklı sayıları "." ile, telefon ise ondalıklı
>> sayıları", ile ayırıyormuş.

Evet, bir de o. :) Ona 'locale' diyoruz. Şansıma, hiç ilgilenmek zorunda kalmadım.

Ali

July 04, 2022

On Tuesday, 28 June 2022 at 04:58:26 UTC, Salih Dincer wrote:

>

...

Doğrudan binary veri göndermesine engel olan bir sınırlama mı var acaba? Eğer veri sadece iki cihaz arasında iletişim için kullanılacaksa ve gözle incelenecek/düzenlenecek türden bir veri değilse JSON kullanmak mantıklı değil.

Eğer JSON kullanmak zorundaysa da sayıların iki cihazda da IEEE754 formatında olduğunu varsayarsak (ki günümüzde oyun çıkarılabilecek tüm popüler cihazlar bu formatı kullanıyor) 16-lık formattaki bir string'e çevirip ("x": "0x4155eb85" gibi) yollarsa iki cihazda da verinin aynı olduğundan emin olabilir.

July 05, 2022
On 7/4/22 15:20, Kerim G wrote:

> Eğer veri sadece iki cihaz arasında iletişim için kullanılacaksa ve
> gözle incelenecek/düzenlenecek türden bir veri değilse JSON kullanmak
> mantıklı değil.

Bana da öyle geliyor. Ben, kullandığı araçların (framework?) (çatı?)) vs. json gerektirdiğini varsaydım.

Ali