Platformlar arası oyunlar oluşturmak için herhangi bir ipucu? [kapalı]


Yanıtlar:


44

Soyutlama katmanlarının arkasına platforma özgü her şeyi gizleyin

Bu, oluşturma, ses, kullanıcı girişi ve dosya GÇ gibi şeyler anlamına gelir. Bir çalışma zamanı performans cezası yaratmadan, platforma özgü uygulama dosyalarına sahip platform-agnostik başlıklar olduğunu çıkarmak için yaygın bir püf noktası:

// FileSystem.h
class FileSystem {
public:
    FileHandle OpenFile(const char * path);
    // other stuff...
}

// FileSystemWindows.cpp
FileHandle FileSystem::OpenFile(const char * path) {
    // call windows API...
}

Ardından, her platform için yapıları uygun .cpp dosyasına karşı oluşturulacak şekilde yapılandırın.

İçerik boru hatlarınızı platformdan bağımsız varlıklar olarak okutun ve her platform için platforma özgü içeriği çıkarın

Örneğin, dokularınızı .tga veya sadece .psd olarak yazınız, daha sonra bunları otomatik olarak ihtiyacınız olan farklı platforma özel formatlara dönüştürebilen bir boru hattınız olacaktır.

Verilerinizde belirli bir bellek düzeni veya endianness olduğunu varsaymayın

Platformlar bayt sırası, dolgu, hizalama ve kelime boyutuna göre değişebilir. Bunu önemseyen herhangi bir kod tüm platformlarda iyice test edilmelidir.

Her zaman tüm platformlarda test edin

Sen edecek platforma özel böcek tarafından ısırıldı. Hemen şimdi ısırılmayı mı tercih edersin yoksa oyunu kapıdan çıkarmaya çalışırken mi?


2
#ifdef PLATFORM_WINftw eksikliği
tenpn

Bundan asla kaçamayacaksın. En aza indirmeyi umabilirsin.
munificent

8
Bunu yapmanın iyi bir yolu, tüm platforma özel kodları aynı arayüze sahip bir set paylaşımlı kütüphaneye taşımaktır, ardından # ifdef's'i platform için doğru kütüphaneyi önyüklemek üzere sınırlayabilirsiniz.
Neel,

1
+1, harika yorum. STL'nin bile platforma bağımlı olduğunu (ve evet, bazı fonksiyonların farklı derleyicilerde farklı şeyler yaptığını) unutmayın.
Simon,

Elbette ekstra bir fonksiyon çağırmak performansı düşürür mü? CPU hala yavaş veya yavaş olan bellekten veri yüklemeli veya taşımalıdır. Bir sistem çağrısı yeterli olmaz mı?
TheBlueCat

10
  • Platformdan platforma giderken size asgari güçlük verecek opengl / sdl benzeri bir api kullanın.

  • Hangi platformları desteklemek istediğinizi bildiğinizden emin olun. Opengl'i kullanmayın, çünkü gelecekte çoklu platformları desteklemek isteyebileceğinizi düşünüyorsunuz. Devam etmek istediğin gibi başla.

  • Desteklemek istediğiniz platformların her birinde hangi donanım sınırlamalarının olduğunu öğrenin.


İkinci nokta yeterince vurgulanamaz. Oyunun kime yönelik olduğunu bildiğinizden emin olun (yani, eğer sıradan bir oyundursa, en azından OSX ve Windows'ta olmasını istersiniz, bu nedenle OpenGL en iyi seçenek olacaktır). Üçüncü noktaya gelince - ve burası motorun devreye girdiği yer - aynı zamanda önemlidir. Bir DS oyunu yapmak için Unreal gibi zengin özelliklere sahip, kaynak ağırlıklı bir motor kullanmak mantıksız olurdu. Mesele, ikincisi ile ilgili söylediklerimle de ilgilidir: Oyunun kimin için amaçlandığını belirleyin. Sıradan bir oyuna gidecekseniz, çoğu insanın bilgisayarları parçacıklar gibi işlemez.

7

#if defined(_FOO_) ... #elif defined(_BAR_) ... #else ... #endifKodun her yerine saçılmasını önlemek için deneyin .

Bazen kolay yol gibi gözükse de, uzun vadede size sıkıntılar yaşatır. Her platform uygulamasının kendi kendine yetmesi için onları kendi dosyalarıyla sınırlandırmaya çalışmalısınız.

Bir platform eklemek çoğunlukla yeni uygulama dosyaları eklemek ve gerekli olan az sayıdaki dosyayı değiştirmekle ilgili olmalıdır.


4

Kendileri platformlar arası pek çok kütüphane var; herhangi bir yerde çalışmak için doğrudan OpenGL'ye yazmanıza gerek yoktur. OGRE, isimlendirmek isteyeceğiniz herhangi bir platformda çalışan bir oluşturma motoruna harika bir örnektir.

Tecrübelerime göre en büyük endişe sizin yapı sisteminizdir. Windows'ta Visual Studio ile geliştirirseniz, kodunuz Linux'ta derlenebilir, ancak kolayca oluşturmak için zor zamanlar geçirirsiniz . Platforma özgü proje dosyaları oluşturmak için aynı derleme talimatlarını kullanabilen CMake gibi derleme sistemlerine bakın (linux'taki dosyalar, pencerelerde VS Projeleri, Mac'te XCode Projeleri, vb.).


4

Dosyaları kaydetmek ve yüklemek veya bir ağ üzerinden iletişim kurmak için işlevlerinizi yazarken, endianness'i unutmayın .

Fread / fwrite veya bunun gibi düşük bir seviyeye tek bir çağrı ile büyük bir yapı okumak yerine, bir ReadByte / WriteByte ve ReadFloat / WriteFloat oluşturun. Ardından, daha sonra farklı bir platform hedeflemeye karar verirseniz, değişiklik yapacak daha az yeriniz olur.


+1 * 9000. Bu gerçekten modern / kullanılmış mimariler (RISC) açısından cep telefonları için geçerli olacağını tahmin ediyorum; ama yine de çok önemli.
Jonathan Dickinson
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.