Learn · frameworks
Mixin Nedir? Bytecode Enjeksiyonu Açıklandı
Mixın, modların Minecraft'ın derlenmiş sınıflarını yükleme zamanında yamamasına olanak tanıyan bytecode enjeksiyon kütüphanesidir. Enjeksiyonun nasıl çalıştığı ve neden her modern modun buna ihtiyacı olduğu aşağıdadır.
Minecraft'ta Mixin Nedir?
Mixin, bir modun Minecraft'ın derlenmiş sınıflarını kaynak koduna dokunmadan, yükleme zamanında yamalamasına olanak tanıyan bir bytecode enjeksiyon kütüphanesidir. Bir mod, "bu kodu bu oyun metodunun bu kısmına ekleyin" diyen küçük bir sınıf yazar ve Mixin, hedeflenen sınıfın bytecode'una anında JVM yüklediği anda bu kodu örer. Fabric, bunu temel modlama mekanizması olarak kullanır.
Kısaca: Minecraft, derlenmiş Java olarak gelir. Mixin, bu derlenmiş sınıfları üzerine inşa ettiğiniz yüzey olarak ele alır ve oyun tek bir kare bile çalıştırmadan önce bunları bellekte düzenler.
Mixin'in bytecode enjeksiyonu nasıl çalışır?
Mixin, derleme ve çalıştırma arasındaki boşlukta çalışır. Oyun sınıfı zaten derlenmiştir, ancak JVM henüz yüklemedi. İşte Mixin'in kullandığı zaman dilimi. Bir mod, gerçek bir oyun sınıfını hedefleyen bir mixin sınıfını yükleyiciye verir ve bu oyun sınıfı yüklendiğinde, Mixin modun kodunu dahil etmek için bytecode'unu anında yeniden yazar.
Açıklamalar bütünüyle hile. Oyun dosyasının satır satır nasıl göründüğünü tanımlamazlar. Nereye inmek istediğinizi tanımlarlar: bir metodun üstü, dönüş, içindeki belirli bir çağrı, yerel bir değişken. Mixin, bytecode'da o noktayı bulur ve kodunuzu etrafına diker.
Minecraft'ın genişletilmek üzere tasarlanmadığı için bu gereklidir. Modların değiştirmek istedikleri şeylerin çoğu için resmi bir eklenti API'si bulunmuyor. Mixin, bu soruna bir çözüm sunar: oyun size bir kanca vermezse, siz onu derlenmiş koda kendiniz oyarsınız.
Modlar neden doğrudan oyunu düzenlemek yerine Mixin kullanır?
Tüm argümanı iki neden destekler: uyumluluk ve güncelleme dayanıklılığı.
Oyunun kaynak kodunu doğrudan düzenlerseniz, Minecraft'ın tam olarak değiştirilmiş bir kopyasını dağıtmanız gerekir. Başka kimse çatallamalarınız üzerine inşa edemez ve oyun güncellendiğinde dağılır. Mixin yamaları küçüktür ve cerrahi müdahale içerir, bu da onlarca modun aynı oyunu herhangi birinin tam bir klonunu göndermeden aynı anda yamalayabilmesini sağlar.
| Yaklaşım | Diğer modlarla birlikte var olur mu? | Oyun güncellemelerinden kurtulur mu? | Şunlar olarak gönderilir mi? |
|---|---|---|---|
| Derlenmiş oyunu elle düzenle | Hayır, tek bir çatallama kazanır | Hayır, herhangi bir değişiklikte bozulur | Tam bir değiştirilmiş jar |
| Mixin enjeksiyonu | Evet, yamalar üst üste biner | Genellikle, yöntem hayatta kalırsa | Bir avuç küçük sınıf |
İkinci sütun, sessiz bir süper güçtür. Bir mixin, "buraya enjekte et" demekle "dosya tam olarak şu şekildedir" demediği için, birçok mixin sıfır değişiklik ile sürümler arasında çalışmaya devam eder. Bu, bir varış noktasını tanımlamak ile bir haritayı ezberlemek arasındaki farktır.
Mixin, Fabric'e nasıl uyum sağlar?
Fabric, Mixin üzerine kuruludur, nokta. Yükleyici, her modun mixin yapılandırmasını okur, o yapılandırmada listelenen mixin sınıflarını toplar ve bunları sınıf yükleme sırasında uygulayabilmesi için Mixin'e teslim eder. Bunların hiçbirini elle ayarlamanıza gerek yoktur; mixin'lerinizi yapılandırmada beyan etmek, tüm entegrasyondur.
Tipik bir Fabric modu, çoğunlukla kendi normal sınıflarından ve değiştirmesi gereken birkaç oyun yöntemine müdahale eden küçük bir mixin setinden oluşur. Modun gerçek mantığı düzenli kodda yaşar. Mixin'ler, kontrolü doğru anlarda ele geçiren ince bir tabakadır.
Mixin enjeksiyon noktaları nelerdir?
Seçtiğiniz enjeksiyon türü, yamayı ne kadar agresif hale getireceğini ve diğer modlarla ne kadar uyumlu olduğunu belirler. Daha hafif dokunuşlar daha güvenli ve güncellemeye karşı dayanıklıdır. Daha ağır olanlar size daha fazla kontrol sağlar ancak kırılganlığa mal olur.
| Açıklama | Ne yapar | Ne zaman başvurmalısınız |
|---|---|---|
@Inject | Kodunuzu hedef yöntemin içindeki seçtiğiniz bir noktada çalıştırır | Varsayılan; en az invaziv, en çok güncellemeye karşı dayanıklı |
@Redirect | Hedefteki belirli bir yöntem çağrısını değiştirir | Bir yöntem yeniden yazmadan tek bir çağrıyı değiştirin |
@ModifyArg | Hedefteki bir çağrıya iletilen bir argümanı değiştirir | Bir çağrıya giden bir değeri ayarlayın |
@ModifyVariable | Yöntem içinde yerel bir değişkeni yeniden yazar | Zaten hesaplanmış durumu ayarlayın |
@Overwrite | Tüm bir yöntemi değiştirir | Son çare; ona dokunan başka bir şeyle çakışır |
@Inject işçidir çünkü dar ve naziktir. Tam olarak bu nedenle, yöntemin geri kalanını olduğu gibi bırakarak belirli bir noktada devreye girer ve bu nedenle genellikle güncellemelerden kurtulur ve diğer modlarla nadiren çatışır. @Overwrite diğer ucundadır: tüm yöntemi yok eder, bu nedenle o yöntemi isteyen başka bir mod da kaybeder. İyi mixin'ler kasıtlı olarak küçük bir ayak izi bırakır.
Temiz bir enjeksiyon noktası, bir modu kaldırmanın anında olmasının da nedenidir. Dosyalarınızda hiçbir şey yakılmadığı için, modu kaldırmak tüm değişiklikleri de beraberinde getirir.
Mixin'in Ciddi Bir Müşteri İçin Önemi Neden Önemli?
Bu, Terminus'un üzerine inşa edildiği temeldir. Birinci sınıf bir yardımcı istemci, oyuna ne kadar temiz bir şekilde entegre olduğuna bağlı olarak yaşar veya ölür ve Mixin, Minecraft'ın berbat bir kopyasını göndermeden bunu mümkün kılan şeydir. Dar enjeksiyon noktaları, zaten kullandığınız modlarla uyumluluğu korur ve oyun güncellendiğinde yama günlerinde bozulmak yerine sağlam kalır. Mixin'i anlamak, iyi yapılmış bir istemcinin oyunun bir parçası gibi hissettirilmesinin en hızlı yoludur, kırılgan bir eklenti gibi değil.
Sıkça Sorulan Sorular
Hayır. Mixin, modların oluşturulduğu bir kütüphanedir, ayrı olarak indirilen bir şey değildir. Fabric gibi bir yükleyici, Mixin'i dahili olarak gönderir ve oyun yüklendiğinde her modun beyan ettiği mixin'leri uygular.
Hayır. Tüm yamalar, sınıflar yüklendiğinde bellekte gerçekleşir. Disk üzerindeki jar dosyası hiçbir zaman değişmez; bu nedenle bir modu silmek, geride hiçbir şey bırakmadan tamamen davranışını ortadan kaldırır.
Yama aynı yöntemi çatışan şekillerde yamadığında, biri diğerini devre dışı bırakabilir. Genellikle suçlu @Overwrite'dir. @Inject gibi dar enjeksiyon noktaları kullanan mixin'ler çok daha güvenilir bir şekilde bir arada var olabilir.
Hayır. Mixin, genel amaçlı bir Java bytecode çerçevesidir. Minecraft modlamada en çok kullanıldığı yer burasıdır ve Fabric'in buna standart hale getirmesiyle ekosistem için varsayılan araç haline geldi.
Terminus'u yakala
Built on clean Mixin hooks, not a hacked-up jar.