Taşınabilirlik Nasıl Sağlanıyor?
-
Platformlar arası taşınabilirlik nasıl sağlanıyor? Alt katmanda her platform için ayrı katmanlar yazılıp daha sonra bir üst katmanda bu farklılıklar saklanıyor mu?
Konuyu anlatabilmem için GTA5 örneğini vereyim. PS3, PS4, Windows, XBOX üzerinde çalışıyor bildiğimiz gibi. Bu oyunda kullanılan motorda RAGE.
Şimdi bu RAGE motoru yazılırken her platform için farklı katmanlar mı var? Windows için win apilerini kullanan bir katman, ps3 için bu cihazın özel apileri, xbox için cihaza özel apiler kullanılıp daha sonra bir ek katmanla tüm bu farklılıklar kaldırılıyor mu?
Bu konuda bilgisi olan mürid var mı? Araştırmam için anahtar kelimeler neler?
Konu C/C++ ile ilgili olduğu için buraya açtım.
SkynetX tarafından 21/Şub/16 16:03 tarihinde düzenlenmiştir -
C++ için preprocessor commands.
İşin olayı şu SOYUTLAMA. Mesela OpenGL de çizgi çiz diye bir fonksiyon var, DirectX dede aynı karşılığı var ama kullanımları farklı.
Adamlar öyle bir fonksiyon yazıyor ki, cizgiCiz diye. windows da ise directx in komutlarını, linuxde ise opengl 3 komutlarını, mobildeyse opengl ES komutlarını, xboxda ise directx i kullanıyor...
Diğer taraftan ortak kod kullanmak gerek. Standartları bilmek burada çok önemli..
http://stackoverflow.com/questions/33238345/are-c-applications-cross-platform
Bir örnek:
ifdef _WIN32 //define something for Windows (32-bit and 64-bit, this part is common) #ifdef _WIN64 //define something for Windows (64-bit only) #endif #elif __APPLE__ #include "TargetConditionals.h" #if TARGET_IPHONE_SIMULATOR // iOS Simulator #elif TARGET_OS_IPHONE // iOS device #elif TARGET_OS_MAC // Other kinds of Mac OS #else # error "Unknown Apple platform" #endif #elif __linux__ // linux #elif __unix__ // all unices not caught above // Unix #elif defined(_POSIX_VERSION) // POSIX #else # error "Unknown compiler" #endif
-
Standartlar var. Örneğin C'deki printf işlevi her platformda aynı işi yapar, aynı parametrelerle çalışır çünkü standartta belirtilmiştir. Görevi standart çıkışa biçimlendirilmiş şekilde karakter katarı göndermektir. Bu şu demek, X platformunda standart çıkış ekrana gönderirken y'de ise bir dosyaya yazabilir çünkü y'nin ekran gibi bir birimi yoktur. Zaten konsol olayı hep burada karıştırılır. printf denince biz ekrana yazı yaz anlarız ama aslında ekran C için bir akıştan daha fazlası değildir. Zaten C ekranın ne olduğunu bilmez. Bizim terminal emülatörleri stdout'u kendine yönlendirir ve gösterir.
Kısa bir deyişle: Standarda uyan ve platforma özgü hiçbir yeteneği (API, kesme...) kullanmayan kod parçacığı, standarda uyan derleyici ile her zaman derlenir.
Bir gui toolkiti ele alalım. Toolkit'in arayüzü standartlaştırılmış olsun. Bu gui alt seviye işlemleri Windows'ta winapi kullanarak (DC'ler vs.), Linux ve Unix'te ise X sunucusunu kullanarak gerçekleştirir. Programcı alt seviye işlemlerin nasıl gerçekleştiği ile ilgilenmez sadece gui'nin kendi sunduğu olanakları (arayüz de diyebiliriz NYP'ye selam çakarak) bilse yeterlidir.
Sizin durumda şöyle gerçekleşmiştir: Oyun motorunun (RAGE) arayüzü bellidir (karakter sağa git, zıpla, uç vs.). G/Ç işlemleri için motorun alt seviye parçacıkları (joystickten bilgi oku, ekrana karakteri çiz) platforma özgü yazılır. Oyun hangi platformda derlenecekse o platformun derleyicisi (ya da çapraz derleyicisi) çalıştırılarak amaç program üretilir.
-
Anladım. Sonuçta her platform için illa bir katman yazılacak.
Teşekkür ediyorum.