
Blogumuzda zaten var , kendi Minecraft sunucunuzu nasıl oluşturabilirsiniz, ancak o zamandan bu yana 5 yıl geçti ve çok şey değişti. Bu kadar popüler bir oyunun sunucu kısmını oluşturmanın ve optimize etmenin güncel yollarını sizlerle paylaşıyoruz.
Minecraft, 9 yıllık geçmişi boyunca (çıkış tarihinden itibaren sayılır) hem sıradan oyuncular hem de meraklılar arasında inanılmaz sayıda hayran ve nefret kazandı. Bloklardan oluşan basit bir dünya kavramı, basit bir eğlence biçiminden iletişim kurmak ve gerçek dünyadan çeşitli nesneler yaratmak için evrensel bir ortama dönüştü.
Oyunun inşaatın yanı sıra yaratma yeteneği de var Minecraft'ta tam teşekküllü algoritmalar uygulamanıza izin veren. YouTube, büyük çaba harcayan ve çok zaman harcayan insanların şu veya bu elektronik cihazın bir kopyasını oluşturduğu veya ayrıntılı bir kopyasını oluşturduğu çok etkileyici videolarla doludur. и mimari yapılar. Her şey yalnızca oyuncunun hayal gücü ve oyun evreninin olanaklarıyla sınırlıdır.

Ancak oyuncuların tam olarak ne yarattığı hakkında daha fazla konuşmayalım, uygulamanın sunucu kısmına bakalım ve yük altında çalışma sırasında ortaya çıkabilecek (bazen çok karmaşık) sorunları vurgulayalım. Sadece Java Edition’dan bahsedeceğimiz için hemen rezervasyon yaptıralım.
Sunucu türleri
En basit seçenek, oyun istemcisine yerleşik bir sunucudur. Bir dünya yarattık, tek tuşa bastık ve sunucuya yerel ağ üzerinden erişilebilir hale geldik. Bu seçenek herhangi bir ciddi yüke dayanamaz ve bu nedenle dikkate almayacağız bile.
Vanilya
Mojang Studios, oyunun sunucu kısmını Java uygulaması olarak ücretsiz olarak dağıtıyor . Bu, kendinizinkini oluşturmanıza olanak tanır ve kişisel dünya, gezegenin her yerinden bağlantı için erişilebilir hale geliyor. Bunu ilk kez yapanlar için harika bir fırsat var. , ilgili oyun Wiki'sinde mevcuttur.
Bu yaklaşımın ciddi bir dezavantajı vardır; yani, sunucunun işlevselliğini genişleten ve yalnızca birçok işlemi otomatikleştirmekle kalmayıp aynı zamanda performansı optimize etmeye de olanak tanıyan eklentileri bağlamak için kullanıma hazır yeteneklerin bulunmaması. Ek olarak, resmi sunucunun bağlı her oyuncu için oldukça büyük bir RAM tüketimi vardır.
bukkit
Vanilya versiyonuna dayalı olarak meraklılar tarafından oluşturulan bir sunucu uygulaması Eklentileri ve modları (değişiklikler) destekleyerek oyunun yeteneklerini önemli ölçüde genişletti. Sadece oyuna yeni bloklar eklemeye değil, aynı zamanda vanilya yazılımının erişemeyeceği çeşitli manipülasyonlar gerçekleştirmeye de izin verdi. İlginç bir şekilde, bu uygulama önemli ölçüde daha az bellek gerektiriyordu.
Bukkit'i kurmak zor değil; ilgili talimatlar kaynakta yer almaktadır; . Ancak 2014'ten bu yana Bukkit ekibi dağıldığından, proje geliştiricileri Mojang Studios'un çalışanları haline geldiğinden bu hiç mantıklı değil ve terk edilmiş. Dolayısıyla Bukkit fiilen öldü ve sonraki iki projeye dikkat etmek mantıklı.
SpigotMC
Eklenti geliştiricilerinin hayatını kolaylaştırmak için oyun dünyasıyla etkileşime girecek bir API'ye ihtiyaç vardı. Bu tam olarak yaratıcıların çözdüğü sorundur. Bukkit çekirdeğini alıp daha iyi güvenilirlik ve performans elde etmek için yeniden işliyor. Yine de, proje Dijital Binyıl Telif Hakkı Yasası nedeniyle engellendi () ve kaynak kodunu oradan indirmek imkansızdır.
Şu anda SpigotMC aktif olarak geliştirilmekte ve kullanılmaktadır. Bukkit için oluşturulan tüm eklentileri destekler ancak geriye dönük olarak uyumlu değildir. DMCA Yayından Kaldırma sorununu aşmak için BuildTools adı verilen zarif bir yöntem icat edildi. Bu araç, derlenmiş bir uygulamayı dağıtma ihtiyacını ortadan kaldırır ve kullanıcıların Spigot, CraftBukkit ve Bukkit'i kaynak kodundan derlemesine olanak tanır. Bütün bunlar DMCA yasağını işe yaramaz hale getiriyor.
PaperMC
Her şey harika görünüyordu ve Spigot harika bir seçenek haline geldi. Ancak bazı meraklılar için bu yeterli değildi ve "steroidler üzerinde" kendi Spigot çatallarını yarattılar. Açık en önemli avantajı "çok hızlı" olmasıdır. Gelişmiş ortaya çıkan sorunları hızlı bir şekilde çözmenize olanak tanır ve genişletilmiş API, ilgi çekici eklentiler oluşturmanıza olanak tanır. PaperMC'yi şurada verilen basit bir komutla başlatabilirsiniz: .
PaperMC mükemmel bir uyumluluğa sahiptir, bu nedenle SpigotMC için yazılan eklentiler PaperMC üzerinde kolayca çalışabilir, ancak resmi destek olmadan. SpigotMC ile geriye dönük uyumluluk da mevcuttur. Sunucu oluşturmaya yönelik çeşitli seçenekleri listelediğimize göre artık ortaya çıkabilecek performans sorunlarına geçebiliriz.
Sorunlar ve çözümleri
Anlamanız gereken en önemli şey, oyun dünyasının işlenmesiyle ilgili her şeyin fiziksel sunucunun yalnızca bir bilgi işlem çekirdeğinde işleneceğidir. Yani aniden bir düzine bilgi işlem çekirdeğine sahip mükemmel bir sunucunuz varsa, o zaman yalnızca bir tanesi yüklenecektir. Diğerleri neredeyse boşta kalacak. Uygulamanın mimarisi bu ve bu konuda yapabileceğiniz hiçbir şey yok. Yani sunucu seçerken çekirdek sayısına değil saat frekansına dikkat etmelisiniz. Ne kadar yüksek olursa performans o kadar iyi olur.
RAM kapasitesi konusuna gelince, aşağıdaki göstergelerden yola çıkmalıyız:
- planlanan oyuncu sayısı;
- sunucuda planlanan dünya sayısı;
- her dünyanın büyüklüğü.
Bir Java uygulamasının her zaman bir RAM rezervine ihtiyaç duyduğu unutulmamalıdır. 8 gigabaytlık bir bellek tüketimi bekliyorsanız aslında 12 gigabayta sahip olmanız gerekir. Rakamlar görecelidir ancak özü değişmez.
Sunucu kısmını başlatmak için yazıda belirtilen flagları kullanmanızı öneririz. . Bu "kara büyü", sunucunun "çöp toplayıcıyı" doğru şekilde yapılandırmasına ve RAM kullanımını optimize etmesine olanak tanır. Oyuncu akışının en yoğun olduğu dönemde sunucunun gerçekten tükettiğinden daha fazla bellek ayırmamalısınız.
Blok haritası oluşturma
“Gerçekten ayın yalnızca ona baktığınızda var olduğunu mu düşünüyorsunuz?” (Albert Einstein)
Tamamen yeni sunucu. Oyuncu ilk kez başarılı bir şekilde bağlanır bağlanmaz oyun karakteri genel toplanma noktasında belirir (doğma). Oyun dünyasının sunucu tarafından önceden oluşturulduğu tek yer burasıdır. Aynı anda client kısmı ayarlara bakıyor ve anahtar parametre çizim mesafesi oluyor. Parçalar halinde ölçülür (harita alanı 16×16 ve 256 blok yüksekliğindedir). Orada kaç parçanın belirtildiği, sunucudan tam olarak kaç parçanın isteneceği anlamına gelir.
Sunucu, dünyanın küresel bir haritasını saklar ve oyun karakterinin ortaya çıktığı noktada henüz oluşturulmuş bloklar yoksa, sunucu bunları dinamik olarak oluşturur ve saklar. Bu sadece büyük bilgi işlem kaynakları gerektirmekle kalmıyor, aynı zamanda dünya haritasının boyutunu da sürekli artırıyor. En eski anarşist sunuculardan birinde (2builders2tools) Haritanın boyutu şimdiden 8 Tb'yi aştı ve dünya sınırı 30 milyon blok civarında. Bu sunucuyla ilgili binlerce hikaye var ve dizide kendi makalesini hak ediyor.
Tek bir oyuncunun etrafında bir dünya yaratmak sorun değil. Yüzlerce oyuncunun etrafında bir dünya oluşturmak, kısa süreliğine küçük sunucu yavaşlamalarına neden olacak ve sonrasında yük azalacaktır. İstemci oluşturma mesafesi içinde yaklaşık bin oyuncuya yakın bir dünya oluşturmak, zaten sunucuyu "bırakmaya" ve zaman aşımı nedeniyle tüm istemcileri sunucunun dışına atmaya yetiyor.
Sunucu yazılımında şöyle bir değer vardır: TPS (Sunucu Başına Tik Sayısı - Saniye başına Tik Sayısı). Normalde 1 saat döngüsü 50 ms'ye eşittir. (Gerçek dünyanın 1 saniyesi, oyun dünyasının 20 tikine eşittir). Bir onayın işlenmesi 60 saniyeye çıkarsa, sunucu uygulaması kapatılacak ve tüm oyuncular atılacaktır.
Çözüm, dünyayı belirli koordinatlarla sınırlandırmak ve ön blok oluşturma işlemini gerçekleştirmektir. Böylece oyun sırasında dinamik üretim ihtiyacını ortadan kaldırıyoruz ve sunucunun yalnızca mevcut bir haritayı okuması yeterli olacak. Her iki sorun da tek bir eklentiyle çözülebilir .
En kolay yol, tek bir komutla dünya sınırını ortaya çıkma noktasına göre bir daire şeklinde ayarlamaktır (ancak bunu herhangi bir şekilde yapabilirsiniz):
/wb set <радиус в блоках> spawnOyuncu karakteri sınırı geçmeye çalışırsa birkaç blok geri itilecektir. Bu, sınırlı bir süre içinde birkaç kez yapılırsa suçlu, zorla ortaya çıkma noktasına ışınlanacaktır. Dünyanın ön-oluşturulması şu komutla daha da basit bir şekilde gerçekleştirilir:
/wb fillBu eylem potansiyel olarak sunucudaki oyuncuları etkileyebileceğinden, aşağıdakileri onayladığınızdan emin olun:
/wb confirmToplamda, Intel® Xeon® Gold 5000 işlemcide 40 blok (~2 milyar blok) yarıçaplı bir dünya oluşturmak yaklaşık 6240 saat sürdü. Bu nedenle, daha büyük bir haritayı önceden oluşturmak istiyorsanız şunu unutmayın. bu işlem oldukça zaman alacak ve sunucunun TPS'si ciddi şekilde azalacaktır. Ayrıca 5000 blokluk bir yarıçapın bile yaklaşık 2 GB disk alanı gerektireceğini unutmayın.
Eklentinin en son sürümünün Minecraft 1.14 sürümü için geliştirilmiş olmasına rağmen, sonraki sürümlerde harika çalıştığı deneysel olarak tespit edildi. Açıklamalarla birlikte komutların tam listesi mevcuttur .
Sorun blokları
Minecraft'ta çok çeşitli bloklar vardır. Ancak okuyucuların dikkatini böyle bir bloğa çekmek istiyoruz. TNT. Adından da anlaşılacağı gibi bu blok patlayıcıdır. (editörün notu - bu sanal dünyanın bir oyun öğesidir ve bu öğenin gerçek patlayıcılarla hiçbir ilgisi yoktur). Özelliği öyle ki, aktivasyon anında yerçekimi kuvveti onun üzerinde hareket etmeye başlıyor. Bu, blok düşmeye başlarsa sunucuyu tüm koordinatları hesaplamaya zorlar.
Birkaç TNT bloğu varsa, bir bloğun patlaması komşu bloklarda patlamaya ve yerçekiminin aktivasyonuna neden olarak onları her yöne dağıtır. Sunucu tarafındaki tüm bu güzel mekanikler, her bloğun yörüngesini ve komşu bloklarla etkileşimi hesaplamak için birçok işlem gibi görünüyor. Görev son derece kaynak yoğundur ve herkesin kolayca kontrol edebileceği bir görevdir. TNT bloklarından en az 30x30x30 boyutunda bir küp oluşturup patlatın. Ve eğer iyi ve güçlü bir oyun bilgisayarınıza sahip olduğunuzu düşünüyorsanız çok yanılıyorsunuz 😉
/fill ~ ~ ~ ~30 ~30 ~30 minecraft:tnt 
Intel® Xeon® Gold 6240'a sahip bir sunucuda yapılan benzer bir "deney", tüm blok patlama süresi boyunca ciddi bir TPS düşüşüne ve %80 CPU yüküne yol açtı. Dolayısıyla herhangi bir oyuncu bunu yapabilirse bu durumda performans sorunu sunucudaki tüm oyuncuları etkileyecektir.
Daha da zor bir seçenek - Kenar Kristalleri. TNT yine de sırayla patlarsa, Edge Crystal'ler aynı anda patlar ve bu da teorik olarak sunucu uygulamasının çalışmasını tamamen durdurabilir.
Bu senaryo ancak bu blokların oyun dünyasında kullanımının tamamen yasaklanmasıyla önlenebilir. Örneğin, eklentiyi kullanarak . Lütfen bu eklentinin başka bir eklenti olmadan tek başına çalışmadığını unutmayın. . Bu yüzden önce WorldEdit'i, ardından WorldGuard'ı yükleyin.
Sonuç
Bir oyun sunucusunu düzgün bir şekilde yönetmek kolay bir iş değildir. Özellikle oyun mekaniğini hesaba katmazsanız, her fırsatta zorluklar ve performans düşüşü sizi bekleyecektir. Her şeyi öngörmek imkansızdır çünkü oyuncular bazen sunucuyu amaçlanmayan bir şeyi yapmaya zorlamak konusunda çok yaratıcı olabilirler. Yalnızca riskler ve belirlenmiş kısıtlamalar arasında makul bir denge, sunucunun sürekli çalışmasına ve performansının kritik değerlere düşmemesine olanak tanır.
Karantina sırasında bazı çalışanlarımız en sevdikleri ofisleri özlediler ve onları Minecraft'ta yeniden yaratmaya karar verdiler. Siz de sağlığınızı tehlikeye atmadan, yolda vakit kaybetmeden gelip bizi ziyaret etme şansınız var.
Bunun için herkesi sunucumuza davet ediyoruz minecraft.selectel.ru (istemci sürümü 1.15.2), burada Tsvetochnaya-1 ve Tsvetochnaya-2 veri merkezleri yeniden oluşturuldu. Ek kaynakları indirmeyi kabul etmeyi unutmayın; bunlar bazı konumların doğru görüntülenmesi için gereklidir.
Görevler, promosyon kodları, Paskalya yumurtaları ve keyifli iletişim sizi bekliyor.
Kaynak: habr.com
