Oyunlarda küçük ve büyük endianness


16

Bir oyunu programlama sürecinde bayt siparişleri hakkında endişelenmeli miyiz? Oyun konsolları farklı bayt siparişleri kullanıyor mu?


1
Şu anda veya sadece genel olarak üzerinde çalıştığınız belirli bir projeden endişe duyuyor musunuz? Çoğunlukla, bir konsol için bir oyun yazıyorsanız, büyük olasılıkla XNA gibi iyi belgelenmiş bir takım araçlar kullanacaksınız ve giriş ve çıkış belgesinde ele alınacaktır.
AturSams

4
Bu konuda endişeleriniz varsa gerçekten Rob Pike'ın The Byte order fallacy'yi öneriyorum - byte sırası hakkında endişelenmeye çalışmak genellikle sizi görmezden gelmekten ve gerçekten endiandan bağımsız kod yazmaktan daha fazla belaya neden olur.

1
İyi bir okuma, ama Rob daha karmaşık yazma ihtiyacı pahasına basitleştirilmiş okumalar alabileceğinizi gösteriyor. Yazıyı yapan sen değilsen, harika!
Kylotan

Yanıtlar:


14

Ağ kodu yazıyorsanız, bu genellikle uğraşmanız gereken bir şeydir, evet.

Ayrıca, dosya biçimindeki bayt sıralamasının platformunuzun kullandığı şey olmaması mümkündür, bu yüzden bazen orada da önemlidir.


8

Bunun için endişelenmen gerekiyor mu? Muhtemelen hayır. Oyun programlamasının büyük çoğunluğu, endianitenin soyutlanacağı bir seviyede olacak. Ağ oluşturmada bile, neredeyse kesinlikle ağ protokolleri için bir kütüphane kullanacaksınız. Bunun farkında olmanız iyi, ama bununla ilgili bir sorunla karşılaşacağınızdan şüpheliyim.


5

Çoğu zaman, hayır.

Endianess genellikle bir oyun motorunun yüksek seviye modüllerinde soyutlanır ve günlük olarak endişelenmenize gerek yoktur. Eğer soyutlanmazsa, motorun ciddi bir sorunu vardır ve düzeltilmelidir, çünkü bu bir oyun yaparken endişelenmeniz gereken ayrıntılar değildir.

Ancak bir C / C ++ çok platformlu motorun bazı düşük seviyeli parçaları üzerinde çalışıyorsanız, bununla uğraşmanız gerekebilir. Mevcut üç gen konsolu da big-endian olan bir PowerPC mimarisi kullanırken PC'de kullanılan x86 mimarisi küçük-endian. Bu nedenle, veri yapılarına (ikili serileştirme, ağ ...) koymak için bir yerden ham bayt okuyan bir kod üzerinde çalışıyorsanız, evet bununla uğraşmanız gerekecek.

Örneğin, C / C ++ 'da, bu tür bayt değişimini çalışırken görmek yaygındır (test edilmemiştir, düzeltmeleri memnuniyetle karşılar):

// Assume bytes comes ordered as big-endian
u16 u16FromBytes(void* data)
{
#if BIG_ENDIAN
    return (u16(data[0]) << 8) + u16(data[1]);
#else // LITTLE_ENDIAN
    return (u16(data[1]) << 8) + u16(data[0]);
#endif
}

Bir kez daha, bu düşük seviyeli kodda sorun yok, ama bu her yerde kullanılan bir şey olmamalı.


3

Hedeflediğiniz platformlara bağlıdır. Örneğin, PS3'ün büyük bir şey olduğuna inanıyorum, bu yüzden hedeflerinizden biri ise, o zaman bilmeniz gereken bir şey, evet.

Ev bilgisayarı alanında "Big 3" (Windows, Linux, Mac) bu günlerde Intel x86 / x64 mimarilerinde yalnızca veya tamamen hariç, hepsi bu nedenle, endişe endişeleri artık geçerli değil.


Artık alakalı değil misiniz? Deneyimlerime göre (birkaç şirket ve 7 yıl boyunca 2-3 oyun, her iki MMO ... istatistiksel olarak geçerli olmaktan çok anekdot) PS ve Xbox pazarlarının her biri Windows pazarının yaklaşık iki katı büyüklüğündeydi, Mac'ler küçük bir fraksiyondu ve Linux fark edilir derecede daha küçüktü. Oyununuz bir konsolda çalışamazsa, PC'lere bağlı kalarak kârınızın% 80'ini yerinde bırakıyorsunuz. Cross-endian kodu ayrıca sunucularınızın istemcilerinizden tamamen farklı makinelerde olabileceği anlamına gelir (örneğin, şimdiye kadarki her istemci-sunucu konsolu oyunu).
Mark Storer

@MarkStorer - Aslında yazdıklarımı tekrar okumalısınız.
Maximus Minimus
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.