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.

TRtrolPublished 5 min read

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şımDiğer modlarla birlikte var olur mu?Oyun güncellemelerinden kurtulur mu?Şunlar olarak gönderilir mi?
Derlenmiş oyunu elle düzenleHayır, tek bir çatallama kazanırHayır, herhangi bir değişiklikte bozulurTam bir değiştirilmiş jar
Mixin enjeksiyonuEvet, yamalar üst üste binerGenellikle, yöntem hayatta kalırsaBir 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çıklamaNe yaparNe zaman başvurmalısınız
@InjectKodunuzu hedef yöntemin içindeki seçtiğiniz bir noktada çalıştırırVarsayılan; en az invaziv, en çok güncellemeye karşı dayanıklı
@RedirectHedefteki belirli bir yöntem çağrısını değiştirirBir yöntem yeniden yazmadan tek bir çağrıyı değiştirin
@ModifyArgHedefteki bir çağrıya iletilen bir argümanı değiştirirBir çağrıya giden bir değeri ayarlayın
@ModifyVariableYöntem içinde yerel bir değişkeni yeniden yazarZaten hesaplanmış durumu ayarlayın
@OverwriteTüm bir yöntemi değiştirirSon ç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

Terminus'u yakala

Built on clean Mixin hooks, not a hacked-up jar.