Özel bir motor kullanarak birden fazla platformda nasıl çalışabilirim?


13

Unity ve Unreal gibi oyun motorları birden fazla platformda çalışabilir. Bunu nasıl yaptıklarını merak ediyorum.

Bir süredir C ++ ve OpenGL kullanıyorum ve aradığım şey, yeniden yazmadan farklı platformlarda çalışmama izin verecek bir şey entegre etmek için kaynaklar. Bir temel API kullanarak kod yazdığınız ve daha sonra API bunu HTML, Android, iOS, vb. Alanlarına dönüştüren LibGDX gibi bir şey. Kendi motorumu yazmak yerine başka bir motor kullanabileceğimin farkındayım ama öğrenme deneyimiyle ilgileniyorum.

Yanıtlar:


26

Motorunuzu her platforma taşıyın. Bu konuda özel bir şey yok. Eğer bazı kodunuz varsa, Windows okunur, ardından ya dosyasında bazı #Ifdef mantığı eklemek veya (eğer olurdu böylece ikinci bir dosya eklemek FooWindows.cppve FooLinux.cppya neyse) uygular diğer OS üzerinde özellik (ler) umursadığın o .

Unity gibi bir motorun tek tıklatmayla yayınlanmasına izin verilir, çünkü Unity'nin kendisi hiçbir zaman son kullanıcı tarafından değiştirilmez. Sadece komut dosyaları ve veriler yazıyorsunuz, bu nedenle motorun tüm platformlar için önceden oluşturulmuş ikili dosyaları var ve yayınla düğmesi bu ikili dosyaları verilerle birlikte paketliyor.

Diğer motorlar, oyun dışı herhangi bir çapraz platform uygulamasında yaptığınız gibi, gerektiğinde derlenen oyunu oluşturmak için derleme sistemlerine ve çapraz derleyicilere güvenir.

HTML5 gibi şeyler için, JavaScript'te çalışacak bir C ++ uygulamasını derleyebilen emscripten gibi araçlar vardır. Temelde sadece emscripten için motorunuzun başka bir portunu yapmanız gerekir (çünkü herhangi bir keyfi C ++ kütüphanesi / özelliği kullanamaz).

Tüm oyununuzu yeniden yazmak zorunda değilsiniz, ancak kesinlikle desteklemek istediğiniz her yeni platform için çok fazla geliştirme, kodlama ve taşıma işi yapmanız gerekecek.


14
Crossplatform yazılımı ile çalışma deneyimime göre (en büyük proje HotSpot olurdu) gerçekten kod aracılığıyla ifdefs atılmasını önlemek istiyorum. share/os/<linux>(Veya share/cpu/x86) gibi bir şeye sahip olmak ve platforma özel tüm kodu oraya koymak ve daha sonra koşullu içerir yapmak kesinlikle daha iyidir . En azından gcc, HotSpot ve Linux çekirdeği bunu yapıyor (kesinlikle zor bir kural değil). Evet, platforma bağımlı olan tek bir işlevle başlayabilir ve aşırıya kaçtığını düşünebilirsiniz, ancak asla böyle kalmaz ve aksi halde hızlı bir şekilde karışıklık haline gelir.
Voo

14

Burada sihirli mermi yok. Oyununuzun birden çok platformda çalışmasını istiyorsanız, birden çok platform için kod yazmanız gerekir (veya bunu sizin için zaten yapan üçüncü taraf kitaplıklardan yararlanmanız gerekir).

İstediğiniz şeyler uyuşmuyor: diyorsunuz (benimkini vurgulayın)

aradığım şey, yeniden yazmadan farklı platformlarda çalışmama izin verecek bir şeyi entegre edecek kaynaklar.

ama aynı zamanda (yine benimkini vurgula)

Kendi motorumu yazmak yerine başka bir motor kullanabileceğimin farkındayım ama öğrenme deneyimiyle ilgileniyorum .

Hemen hemen bir veya diğerini yapmak zorunda kalacaksınız: Sizin için platformlar arası destek sağlayan üçüncü taraf bir kütüphane, motor ve / veya araç zinciri kullanmayı seçin veya platformlar arası kod yazarak ( kullanabileceğiniz platformlar üzerinden kendi soyutlamanız ve bu soyutlamayı her platform için uygulayarak).

Bu da uygun platform soyutlama karşı kodunuzu yeniden derlemek destekleyecek ya da bir platforma özgü sürücüsü yürütülebilir gelen yük kendi iç API'leri karşı bir kitaplık veya DLL inşa gerektirir Unreal veya birlik gibi Oyun motorları onlar uygun için derledik platformudur.


2

Diğer iki cevabın aksine (haklı olarak C ++ 'a özgü) başka bir yol daha var. Akla gelen bazı mimariler:

  • Motorunuzu taşıyın: Kodu, birden fazla platformda çalışacak şekilde değiştirin veya yazın. Bu, yukarıdaki cevaplarda ele alınmaktadır.
  • Platformlar arası kitaplığın üzerine bir şeyler yazın: Bu, Java üzerinde çalışan libGDX örneğidir. Java, Masaüstü, Android ve iOS'ta (RoboVM aracılığıyla) çalışır. Java gibi bir şey kullanarak, temel kütüphane / araç bunları desteklediğinde ücretsiz ek platformlardan yararlanabilirsiniz. Bu durumda, RoboVM ortaya çıktığında libGDX (neredeyse) iOS'ta "çalışır".
  • Bir kod üreticisi yazın: Bu, Haxe ve diğer araçların yaklaşımıdır. Bir çekirdek diliniz var (örn. Haxe / AS3) ve diğer diller için çıktı üreten dönüştürücüler yazıyorsunuz. Örneğin. Haxe Masaüstü için C ++, Android için Java (sanırım) vb.

Şahsen, libGDX yaklaşımının en basit olduğunu düşünüyorum: ihtiyaçlarınızı karşılayan bir dil veya platform bulun ve üstüne yazın. Kod üretimi ve taşınabilir motorlar karmaşıktır ve iyi yazılması zordur.

libGDX aslında hem büyük cep telefonlarına, masaüstüne hem de web'e (uygulama veya Google'ın web derleyicisi aracılığıyla) çarptığı için mükemmel bir seçimdir.


Java veya C # ile bile, platformlar arası kodu sihirli bir şekilde almazsınız; platform bağımlılıkları olabilen üçüncü taraf kütüphanelerinin hala farkında olmanız gerekir (örneğin, SlimDX veya SharpDX, platformlar arası bir C # projesi için kötü bir seçim olacaktır).

@JoshPetrie kesinlikle kendi C ++ motor haddeleme ve platformlar arasında taşıma kıyasla "ücretsiz" bir sürü olsun.
ashes999

@ ashes999 cevap için teşekkürler, libGDX parlak kullanıyorum ama bunu kullanacağım, bu yüzden çapraz platform çalışıyor sonra CMake kullanıyor, meydan okuma için daha önce var olan bir kütüphane veya motoru kullanmaktan daha fazlasıyım
DanielCollier

2

Şu anda bir platformlar arası oyun motoru inşa ediyorum. Acıyı hafifletmek için grafik uygulamaları oluşturmak için mükemmel (ve uygun şekilde düşük seviyeli) bir çapraz platform kütüphanesi olan SDL kullanıyorum.

Bunun ötesinde, her platform için bir çok "özel kod" vardır. Bunu yapman lazým. Şimdiye kadar geliştirme süremin çok küçük bir kısmı olarak buldum, çoğunlukla yerel Linux'um kadar tanımadığım sistemler için doküman aramakla geçirdim.

#ifdefKodunuz boyunca her yerde kullanmaktan vazgeçiririm . Bunun yerine, temel ilkellerin etrafında soyutlamalar oluşturun (böyle bir ilkel örneği bir TCP soketi olabilir).

Ortam başına farklı çözümler gerektiren yeni bir sorunla karşılaştığınızda kendinize "bu sorunu yalnızca önceden oluşturduğum platformlar arası ilkelleri kullanarak çözebilir miyim?" Cevabınız evet ise: voila, basit platformlar arası kod. Aksi takdirde hangi ilkelleri kaçırdığınızı bulun ve uygulayın.


0

Bunu "sıfırdan" bir öğrenme deneyimi olarak yapmak istiyorsanız, MSDN'de ve OpenGL wiki'de bir pencere ve OpenGL içeriği açma hakkında bilgi bulabileceğiniz Win32 API'sını kullanmanız gerekir ( http: // www .opengl.org / wiki / Creating_an_OpenGL_Context_ (WGL) ). Linux için O'Reilly Xlib Programlama Kılavuzu ve Xlib Referans Kılavuzunun ikinci el kopyasını alın ve ayrıca GLX'te (X Pencere Sistemine OpenGL Uzantısı) okuyun. Ayrıca bkz. Http://www.opengl.org/wiki/Tutorial:_OpenGL_3.0_Context_Creation_(GLX)

Ardından, uygulamanıza aynı şeyi yapan (örn. Bir pencere açın) ancak her platform için farklı uygulamalara sahip aynı API'yi sağlamanız yeterlidir. Motorunuzun bazı bölümlerini farklı platformlar için yeniden yazarsınız. Sonra motoru kullanarak yazdığınız bir oyun sadece bir kez yazmak zorundasınız ama farklı platformlarda çalışacak.


cevap için teşekkürler ama ben sadece pencereleme, çapraz platformu ve kullanımı çok kolay SDL2 kullanmayı tercih ederim. LibGDX'in pencereleme için LWJGL'yi nasıl kullandığı
DanielCollier
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.