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