Hem MonoGame API'sını hem de temeldeki grafik API'sını kullanırsanız hangi sorunlar ortaya çıkabilir?


10

MonoGame ile oyun yapıp temeldeki grafik API'sını da aramaya başlarlarsa ne gibi sorunlar yaşanabilir?

Örneğin, bir MonoGame projesinde MonoGame'nin mutlaka desteklemediği bir şey yapmak istedim veya bunun için uygun belgeleri / örneği bulamadım, ancak OpenTK'da nasıl yapılacağına dair bir örnek bulabilir miyim? başka bir yerde MonoGame API kullanırken doğrudan OpenTK kullanarak uygularsam sorun için kendimi ayarlamak? Özellikle, bununla sonuçlanabilecek ve çok nadir durumlarda ortaya çıkacak belirsiz bir şey olmayan herhangi bir büyük sorun olup olmadığını öğrenmek istiyorum.

Google ve GD.SE sitesi aracılığıyla biraz araştırma yapmayı denedim ve fazla bir şey bulamadım. Belki MonoGame, üslerinin çoğunu gerçekten kapladı, ancak olağanüstü sorunlarından biri veya henüz uygulanmayan bir özellik üzerinde elle çalışmak istersem ne olur?

Eğer öyleyse ne tür sorunlar ortaya çıkabilir ve bu sorunların azaltılmasına yardımcı olacak yollar var mı?

Yanıtlar:


12

Çoğu durumda bu sorunlar "tanımlanmamış davranış" kategorisine girer (C ++ anlamında değil, daha geniş bir anlayışla).

Yapacağınız şey esasen MonoGame tarafından sağlanan soyutlamayı atlatmaktır (örnek olarak, bu elbette bu tür üst düzey API'ler için geçerlidir). Bunu yaparken, sınıf değişmez garantilerinin ihlal edilmesine neden olabilirsiniz, bu da MonoGame yazarlarının kodlarını yazabileceği varsayımlarının artık doğru olmayabileceği ve kodun beklenmedik şekilde davranabileceği anlamına gelir. Kendi kodunuz artık onları kırdığınız için soyutlamanın değişmez garantilerine artık güvenemez.

Bu beklenmedik davranış, basit oluşturma yapaylıklarından çökmelere veya bellek bozulmasına kadar bu tür davranışların tüm gamını içerecektir.

  • Örneğin, MonoGame'in kendi etrafında son yayınlayarak bazı oluşturma API'si durumuyla uğraşırsanız, bu durum değişikliğini tespit edemeyebilir (çünkü muhtemelen temel API'yı değişiklikler için kirletmeyecektir, basitçe API'yi kontrol eden kişi olduğunu varsayar ve bu değişiklikleri izler). Sonuç olarak, bir sonraki render geçişinde, aslında güncellenmesi gereken bir şeyin güncellenmesi gerekmediğine ve sahnenizin doğru bir şekilde oluşturulmayabileceğine karar verebilir.

  • Yoksa yatan API ile karışıklık olabilir ve erken monogame altında serbest veya yanlışlıkla alabilirsiniz demek olduğunu bazı cihaz nesnesi (varsayarak D3D), başvuru sayısı değiştirmez değil olası bir çarpışma veya kaynak sızıntısı kaynaklanan yayınladı.

  • Veya işe yarayan bir şey yapabilirsiniz, ancak desteklenmeyen bir şekilde ve belgelenmemiş özelliklerle veya beklenmedik erişim kalıplarıyla uğraştığınız için, kodunuzu bir sonraki sürümde korkunç bir şekilde kırık bulabilirsiniz.

  • Ya da bir şeyler yapabilirsin, birkaç sürüm için iyi çalışır, ancak daha sonra başka bir hatayla karşılaşırsın ve onu izlemekte zorluk çekersin, bu yüzden MonoGame arkadaşlarından yardım istersin, belki de bir hata raporu gönderirsin. kodlarında bir sorun var. Elbette hatayı yeniden üretemezler ve nihayetinde bu garip doğrudan erişimli hackery'i ve o noktada - hack'inizin hatanın kök nedeni olup olmadığına bakılmaksızın yaptığınız ortaya çıkıyor - onlar Muhtemelen desteklenmeyen bir şey yaptığınız için (ya da en azından muhtemelen sizi önceliklendireceklerdir) düzeltmelerinizde kaynak harcamayı bırakabilirsiniz.

Tabii ki, bazı durumlarda kesinlikle olabilir var resmi yama zamanında serbest olmayacak olan yazılımlar gönderme belki bir hata etrafında işe, API atlatmak için. Kesinlikle varsa yapmak , yumuşak yaklaşımı benimsemelisiniz: doğrudan erişiminizi olabildiğince dar bir şekilde kapsamaya çalışın ve altta yatan API'nın durumunu mümkün olduğunca değişmeden bırakmaya çalıştığınızdan emin olun. . Bu bir başarı garantisi değildir, ancak yardımcı olabilir.

İdeal olarak, bu tür şeylerden tamamen kaçınacaksınız.


3

Josh'un cevabına tamamen katılıyorum ama bazı düşünceler eklemek istiyorum.

MonoGame'in amacı, XNA API'sını birçok platforma getirmektir. Doğrudan OpenTK kullanıyorsanız, kendinizi yalnızca onu destekleyen platformlarla kısıtlıyorsunuz. Bu nedenle, soyutlamayı kullanmanın ana avantajlarından birini kaybedebilirsiniz.

MonoGame tarafından desteklenmeyen bir şey yapmak istediğinizi düşünüyorsanız veya belgeleri bulmakta sorun yaşıyorsanız, önce ne yapmaya çalıştığınızla ilgili daha spesifik bir soru sorun. Bunu zaten yapmanın bir yolu olduğunu veya belki de henüz uygulanmamış planlanmış bir özellik olduğunu görebilirsiniz.

Görüştükten sonra, sizin ya da bir başkasının MonoGame'deki eksik özellikleri herkesin yararına uygulayabilirsiniz.


3

Bu iki fikrin birleştirilmesinden kaynaklanan sorunların nasıl azaltılacağı ile ilgili olarak:

MonoGame açık kaynak kodludur, doğrudan değiştirin ve her ikisini de kullanmaktan endişe etmenize gerek yoktur.

İçinde ek şeylere ihtiyacınız olduğunu düşünüyorsanız, elbette: bir çatal oluşturun. Bu temel kodu kullanın ve üzerine kendi kodunuzu ekleyin. MonoGame'i yeniden derleyin ve işte böyle. Bu ayrıca, güncellendiğinde MonoGame çatalını güncellemenize izin verir (elbette süreçte ortaya çıkabilecek çatışmaları düzeltmeniz gerekir).


Kim oy verdiyse, lütfen nedeninizi söyleyin, böylece bir dahaki sefere yanlış bir şey yazdığımı düşünüyorsanız öğrenebilirim.
Timotei

1
How does this answer the question?

1
Well, one could circumveit any problems arising from combining those two (monogame + the underlining API) by modifying directly the monogame source (that is, in a single place). Please note his last question: "If so what sort of problems might arise and are there any ways to help mitigate these issues?"
Timotei

İyi nokta Timotei, cevabını biraz daha açık hale getirmek için küçük bir düzenleme yaptım.
MichaelHouse

Bu noktayı seviyorum. Monogame içinde bir özelliği uygulamak için uygun bir yer bulmaya çalışmak, özellikle kendi oyun kütüphanenize uygulamaktan daha mantıklı olacağını düşünüyorum. Monogame'yi doğru bir şekilde anlamamanın ve hala yanlış bir şekilde uygulamamanın bariz tuzakları vardır, ancak bu tamamen başka bir sorundur.
SpartanDonut
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.