Bu sayfa, onlarla başa çıkmak için genel performans problemleri ve bunlara mitigasyon için en iyi pratikleri açıklar.
Kript Hesaplama
Lua kodunda pahalı işlemler işlem süresini daha uzun süre işleyebilir ve bu nedenle görüntü kare hızını etkileyebilir. Eğer paralel olarak yürütülmediyse, Lua kodu asenkron olarak çalışır ve görüntü kare hızının üstesinden gelene kadar anahtarı bloke eder.
Sıradan Sorunlar
Masa yapıları üzerinde yoğun işlemler. - Serileştirme, şifre çözme ve deri klon gibi kompleks işlemleri, büyük tablo yapıları üzerinde yüksek performans maliyeti oluşturur, özellikle büyük tablo yapıları üzerinde itiraz edilir. Bu özellik özellikle ifade edilir ifade edilir.
Yüksek frekans etkinlikleri - Fiyatlandırma moduna sahip etkinlikleri RunService ile çerçeveli pahalı işlemleri bağlayarak çerçeveli pahalı işlemleri tekrarlar - bu genellikle işlem süresi için gereksiz bir artışa neden olur. Bu etkinlikler dahil:
Mitigasyon
- Kodu RunService etkinliklerinde yavaşça çağırın, yüksek frekans çağrısının gerekli olduğu durumlara sınırlı olarak kullanımını kısıtlayın (örneğin, kamerayı güncelleme). Diğer kodu diğer etkinliklerde veya daha az sıklıkta bir döngüde çalıştırabilirsiniz.
- Çalışmayı birden fazla karede dağıtmak için task.wait() kullanarak büyük veya pahalı görevleri bölün.
- Gereksiz pahalı işlemleri belirleyin ve optimize edin ve birden çok şerit kullanın, veri modeline erişmeye gerekmeyen hesaplama görevleri için hesaplama için birden çok şerit.
- Belirli sunucu-taraflı kodlar Yerelleşik Kod Oluşturma , bir basit baytcode olarak değil makine kodu olarak bir kodu derleyen bir baytcode'i yararlanabilir.
MicroProfiler Gözlükleri
Mira | İlişkili Hesap |
RunService.Ön İzleme | Ön İşlem etkinliğinde çalıştırılan kod |
RunService.PreSimulation | Adım atlayan etkinlikte kod çalıştırılıyor |
RunService.PostSimulation | Kalp atışı etkinliğinde çalışan kod |
RunService.Heartbeat | Kalp atışı etkinliğinde çalışan kod |
MicroProfiler kullanılarak özel kodları depilerken için için, özellikleri takip etme ve ayrıca özellikleri artırmak için etiketleri içeren debug kütüphanesine bakın, which includes functions for tagging specific code and further increasing specificity, such as debug.profilebegin ve debug.profileend .
Kullanılan Önyükleme
Hafıza sızdırmaları, hafıza toplayucunun artık kullanılamayacağında hafıza tüketen yazılımların oluşturduğu hafıza tıkanıklığından kaynaklanabilir. Sızdırmalar, özellikle sunucuda, çok günlük olarak çevrimiçi olabilir, bir klien oturumu ise çok daha kısa.
Aşağıdaki bellek değerleri Geliştirici Konsolu içinde, sorunun daha lütfen araştırma gerektiren bir sorun olduğunu gösterebilir:
- LuaHeap - Yüksek veya büyüyen tüketim bir hafıza kaybı gösterir.
- InstanceCount - Konsantrasyonlu olarak artan sayılar kaynaklarınızda bazı kaynakların toplanmadığını gösterir.
- PlaceScriptMemory - Hafıza kullanımının kısmi olarak kaynağını sağlar.
Sıradan Sorunlar
Bağlantılar bağlantılardan ayrılır - Motor, bağlantılara bağlanan olayları asla toplmaz. Bu nedenle, bağlantılardaki olaylar ve kodlar, bağlantılara bağlanan bağlantılar, bağlantılara bağlanan işlevler ve bağlantılara bağlanan değerler, bağlantıların hafıza toplayucusu için hala etkili değildir, hatta olaylar baş
Oysa ki etkinlikler oluşturduğunuz oyunun yok olduğunda bağlantılar kesilse de, bir yaygın hata oyunun temsilcisi olan Player nesnelerine ve kar
Masalar - Masalara objeleri girmeye kalkışır, ancak artık gerekli olmadığında kaldırmazsa gereksiz hafıza kullanımı oluşur, özellikle katılırken kullanıcı verilerini takib eden masalar için. Örneğin, aşağıdaki kod örneği, bir kullanıcı katılınca kullanıcı bilgilerini her seferinde ekleyen bir masa oluşturur:
Örneklocal playerInfo = {}Players.PlayerAdded:Connect(function(player)playerInfo[player] = {} -- bazı bilgilerend)Bu girişler artık gerekli olmadığında, tablo hala büyür ve kullanıcılar oturumuna katılır. Bu tablo üzerinde itelenen herhangi bir kod da dahil olmak üzere tüm kodlar daha büyük olur.
Mitigasyon
Hafıza sızdırmalarını önlemek için tüm kullanılan değerleri temizlemek için:
Tüm bağlantıların kesilmesini sağlayın - Kod tabanınızı geçin, her bağlantının temizlenmesini sağlayın bir yolundan biri aracılığıyla:
- Disconnect() işlevini kullanarak manuel olarak bağlantıyı kesiyor.
- Etkinliğin sahip olduğu instansı Destroy() işleviyle yok ediyor.
- Bağlantının takip ettiği özgün kodu yok ediyor.
Oyundan ayrıldıktan sonra oyun objelerini ve karakterlerini kaldır - Kodu uygulayın, bir kullanıcının ayrıldıktan sonra koneksiyonların süreceğinden emin olmak için kodu uygulayın, aşağıdaki örnekte gösterildiği gibi:
ÖrnekPlayers.PlayerAdded:Connect(function(player)player.CharacterRemoving:Connect(function(character)task.defer(character.Destroy, character)end)end)Players.PlayerRemoving:Connect(function(player)task.defer(player.Destroy, player)end)
Fizikler Hesaplama
Aşırı fiziksel simülasyon, hem sunucudaki hem de istemcideki her bir kare için artan hesap süresi nedeniyle bir anahtar neden olabilir.
Sıradan Sorunlar
Aşırı fiziksel zaman hızı frekansı - Standart olarak, hızlandırma davranışı uyarlanabilir modunda, fiziksel adımlar herhangi bir 60 Hz, 120 Hz veya 240 Hz'de hızlanır, fiziksel mekanizmanın karmaşıklığına bağlı olarak.
Ayrıca, artırılmış fiziksel doğruluklu düzeltilmiş bir sabit modu da mevcut, bu da tüm fiziksel bileşenlerin 240 Hz'de (her kare 4 kat) adım atmasını zorunludur. Bu, her karede daha fazla hesaplama sonuçlarına yol açar.
Simüle edilen nesnelerin çok fazla karmaşıklığı var - Simüle edilen 3D assemblelerinin daha fazla olması, her kareyi daha uzun sürecek fiziksel hesapların alınmasıdır. Genellikle deneylerin, daha fazla kısıtlayıcı ve bağlantıyı gerektiren mekanizmaları olmayan nesneleri simüle etmesi gerekir.
Aşırı keskin çarpışma algılama özelliği - Mesh parçaların çarpışma algılama özelliğinde bir CollisionFidelity özelliği vardır, bu da çeşitli performans seviyeleriyle çarpışma algılarını sunar. Mesh parçaların çarpışma algılama özelliğindeki en y
Mitigasyon
Simülasyon gerektirmeyen parçaları bağla - Statik NPC'ler gibi sürülmeye gerekmeyen tüm parçaları bağla.
Uyarlanabilir fizikleri kullanın - Uyarlanabilir adımlar fiziksel mekanizmalar için fiziksel hesaplama oranını dinamik olarak ayarlar, böylece bazı durumlarda fiziksel güncellemelerin daha az sıklıkta yapılmasına izin verir.
Mekanizma karmaşıklığını azalt * Mümkün olduğunda, bir montajda fiziksel kısıtlamaların veya bağlantıların sayısını azaltın.
- Kısıtlayıcı veya çarpıştırıcı olmayan sınırlarınızı uygulayarak ragdoll uzuvlarının birbirleriyle çarpışmasını önlemek için bir mekanizmanın kendi kollukları içindeki kolluk kısıtlamalarını azaltın.
Keskin çarpışma güvenliğinin kullanımını azaltır * Kullanıcılar nadiren farkı fark edebileceği küçük veya etkileşim olmayan nesneler için kutu güvenilirliğini kullanın.
Küçük orta boyutlu nesneler için kutu veya gövde güvenilirliğini kullanın, şekiline bağlı olarak.
Büyük ve çok karmaşık nesneler için, mümkün olduğunda görünmez parçaları kullanarak özel çarpıştırmalar oluşturun.
Çarpışma gerektirmeyen nesneler için çarpışma devre dışı bırakın ve kutu veya küreklilik kaynağını kullanın, çarpışma geometrisi hala bellekte saklanıyor.
Studio'da 3D görüntüleyicisi üzerindeki Çarpışma gerçekliği butonunu etkinleştirerek çarpışma geometrisi için debug amaçlında çarpışma geometrisi yapabilirsiniz.
Alternatif olarak, CollisionFidelity = Precise filtresini Explorer şuna uygulayabilirsiniz, bu da kesin doğrulukla tüm malzeme parçalarını gösterir ve onları kolayca seçmenizi sağlar.
Doğruluk ve performans gereksinimlerinizi dengeleyen çarpışma gerçekliği seçimi için bir yerleşik yürüyüşe nasıl katılacağınız konusunda ayrıntılı bir bakış için, Fizikleri ve Rendering Ayarlarını Ayarla bakın.
MicroProfiler Gözlükleri
Mira | İlişkili Hesap |
fizikler | Genel fiziksel hesap |
dünyaAdım | Her kareye düzgün fiziksel adımlar atılır |
Fizikler Hafıza Kullanımı
Fiziksel hareket ve çarpışma tespiti, hafızayı tüketir. Mesh parçalarının bir CollisionFidelity özelliği vardır, bu, çarpışma sınırlarını değerlendirmek için kullanılan yaklaşımı belirler.
Sıradan Problem
Varsayılan ve daha iyi çarpışma algılama modları, daha düşük güvenirlikli çarpışma şekilleriyle iki diğer moddan daha fazla hafıza tüketir.
Fizikler bölümleri altında yüksek seviyelerde hafıza tüketimi görürseniz, deneyiminizdeki nesnelerin çarpışma gerçekliğini azaltmak için araştırmanız gerekebilir.
Mitigasyon Yöntemleri
Çarpışma güvenliği için kullanılan hafizayı azaltmak:
- Çarpışması gerekmeyen parçalar için, çarpışmalarını devre dışı bırakmak için BasePart.CanCollide, BasePart.CanTouch ve BasePart.CanQuery değerlerini 2>2> ve 5>5> arasında ayarla.
- Çarpışma gerçekleştirme kalitesini azaltmak için CollisionFidelity ayarını kullanın. Box en düşük hafıza üstünlüğüne sahiptir ve Enum.CollisionF
- Genellikle herhangi bir küçük sabit parçanın çarpışma gerçekliğini Box ile ayarlamak güvenlidir.
- Çok karmaşık büyük mesaflar için, kutu çarpışma gerçekliğiyle daha küçük nesnelerden kendi çarpışma meshesini oluşturmak isteyebilirsiniz.
İnsanoidler
Humanoid bir oyuncu ve oyuncu olmayan karakterler için geniş bir işlevselliği sağlayan bir sınıftır. Güçlü olmasına rağmen, bir Humanoid önemli bir hesaplama maliyetiyle geliyor.
Sıradan Sorunlar
- NPC'lerdeki tüm HumanoidStateTypes'i kapatmak için - NPC'lerde bazı HumanoidStateTypes etkinleştirilmişken bir performans ücreti var. Kapatmak için gerekli olmayan herhangi bir şeyi devre dışı bırakın. Örneğin, NPC'nizin merdiven
- Sık sık insanoidlerle modelleri yeniden oluşturulur, değiştirilir ve yeniden doğar * Bu, motorun işlemesi için yoğun olabilir, özellikle bu modeller Katmanlı kıyafetleri kullanıyor . Bu ayrıca, avatar'lar sık sık yeniden doğduğunda sorunlu olabilir.
- In the MicroProfiler , uzun updateInvalidatedFastClusters etiketleri (4ms'den fazla) genellikle avatar'ın anlıklatılma/modifikasyonunun aşırı olarak geçersizleştirmeleri tetiklediği bir sinyaldir.
- Gerekli olmadığı durumlarda kullanılan insanoidler - Genel olarak hareket etmeyen statik NPC'lerin Humanoid klasına ihtiyacı yok.
- Sunucudaki birçok NPC'ye animasyon oynatıyor animasyonları - Sunucudaki animasyonlar, sunucuda çalışan animasyonların simüle edilmesi ve müşteriye kopyalanması gerekir. Bu gereksiz bir üstelik olabilir.
Mitigasyon
- NPC animasyonlarını klipten oynat - Büyük sayıda NPC'nin olduğu deneyimlerde, klipten Animator oluşturmayı ve animasyonları yerel olarak çalıştırmayı düşünün. Bu, sunucudaki yükü azaltır ve gereksiz yeniden yüklemeyi önler. Ayrıca ek g optimiz
- Humanoid'lar için performans dostu alternatifleri kullanın - NPC modelleri gerekli olmayan bir insanoid nesneyi içermez.
- Statik NPC'ler için basit bir AnimationController kullanın, çünkü hareket etmeleri gerekmiyor sadece animasyon oynatmak gerekiyor.
- NPC'leri hareket ettirmek için kendi hareket kontrolcünüzü uygulayın ve animasyonlar için bir AnimationController kullanın, NPC'lerinizin karmaşıklığına bağlı olarak.
- Kullanılmamış insanoid devletlerini devre dışı bırakın - Humanoid:SetStateEnabled() kullanın, her insanoid için sadece gerekli devletleri etkinleştirin.
- NPC'lerin sık yeniden doğmasıyla ilgili havuz modelleri - Yerini yeniden doğuran bir NPC'yi yerleştirme modu yerine, bir NPC'yi hızlıca yüzmeye gönderin. Bu yol, bir NPC'nin yeniden doğması gerektiğinde, sadece bir NPC'yi havuzdan yeniden doğurmanızı sağlar. Bu iş
- Sadece kullanıcılar yakın olduğunda NPC'leri oluşturur - Kullanıcılar menzilden uzaktaysa NPC'leri oluşturmayın ve kullanıcılar menzilden ayrıldığında temizleyin.
- Avatar hiyerarşisine değişiklik yapmayın - Belirli bir avatar hiyerarşisine olan bazı değişikliklerin performansı önemli ölçüde artırır. Birkaç optimizasyon mevcut:
- Özel prosedür animasyonları için, JointInstance.C0 ve JointInstance.C1 özelliklerini güncellemeyin. Bunun yerine, Motor6D.Transform özelliğini güncelle.
- Avatar'a herhangi bir BasePart nesneleri bağlamak zorundaysanız, avatarın Model hierarşisinin dışında bunu yapın.
MicroProfiler Gözlükleri
Mira | İlişkili Hesap |
İnsanoid | İnsanoid kontrol ve fiziği |
adım animasyonu | İnsanoid ve Animatör animasyon |
güncellemeInvalidatedFastClusters | Bir avatarı başlatmak veya değiştirmekle ilgili |
Oluşturulan Rendering
Klientin her kareyi rendeleme sırasında haritadaki bir sahneyi görüntülemesi gereken önemli bir kısmı, sahneyi mevcut karede görüntülemesi içindir. Sunucu herhangi bir render yapmaz, bu nedenle bu bölüm sadece klient içindir.
Çek Çizme
Bir çizim çağısı, motorun GPU'suna bir şeyi görüntülemek için verilen bir dizi talimdir. Çizim çağlarının üstesinden gelmek genellikle gereksiz yüksek performans gerektirir. Genel olarak, her kare için kaç çizim çağı görüntülenmesi gerektiğine bağlı olarak, kağıt bir görüntülenmesi gerektirir.
Stüdyo'da Görüntü İstatistikleri > Zamanlayıcı öğesi ile birçok çizim çağrısının meydana geldiğini görebilirsiniz. Klientte Görüntü İstatistikleri nı görmek için 1>Shift1> > 3>F23>'ye basın.
Belirli bir kare içinde sahnenizde çizilmesi gereken daha fazla nesne, daha fazla çizim çağrısı yapılır. Ancak, Roblox motoru, aynı dokunuş özelliklerine sahip mesajları tek bir çizim çağrısına katmak için instancing adlı bir işlemi kullanır. Özellikle, aynı <
- SurfaceAppearances ve Class.SurfaceAppearance|SurfaceAppearance|Appearance|Appearance|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil|Şekil
- Malzemeler, SurfaceAppearance ve MeshPart.TextureID olmadığında iki şey de aynıdır.
Diğer Sık Sorunlar
Aşırı objel yoğunluğu - Eğer bir bölgeye birçok nesne yoğunlaştırılmışsa, bu alanın sahnenin geri kalanındaki görüntülenmesi daha fazla çizim çağrısı gerektirir. Eğer belirli bir nesne parçasının görüntülenmesinde çerçeveleriniz düşüyorsa, bu, bu alanın yoğunluğunun çok yük
Resimler, görünümler ve parçacıklar gibi nesneler iyi gruptelenmez ve ekstra çizim çağrılarını giriştirir. Bu nesne türlerine özellikle sahneninizde dikkat edin. Özellik değişikliği ParticleEmitters için, sözleşme imzalamaetkileyebilecek kadar dramatik bir etkiye sahiptir.
Kaçırılan İstemeleri Önlemesi - Genellikle, bir sahnenin aynı şekilde çok kez yeniden kullanılan bir mesha dahil olmasına rağmen, bir mesha'nın her kopyasında farklı bir çizgi veya doku özelliği ID'si vardır. Bu, yeniden kullanımı önler ve gereksiz çekim çağrılarına yol açabilir.
Bu sorunun yaygın nedeni, bir bütün sahnenin Roblox'a tek seferde ithal edilmesi ve ardından post-ithal edilmesi, sahneyi birleştirmek için bireysel kaynakların Roblox'a ithal edilmesidir.
Aşırı nesne karmaşıklığına sahip olmakla birlikte, sahnenin bir sahne oluğu, bir çerçevenin render etme süresini etkiler - Çok sayıda kompleks meshes'i olan sahneler genel bir sorundur, aynı şekilde MeshPart.RenderFidelity özelliği
Aşırı gölge oluşturma - Gölgeleri işlemek pahalı bir işlemdir ve gölgeleri oluşturan yüksek sayıda ve yoğunluklu ışık nesnesi içeren haritalar (ya da gölgelerin etkisi altındaki küçük parçaların yüksek sayıda ve yoğunluklu nesneleri içeren haritalar) performans sorunlarına neden olabilir.
Yüksek şeffaflık özelliğiyle yeniden çekme yapılır - Objeleri birbirlerine yakın yerleştirmek, motoru üst üste yapılan pikseli görüntülemek zorur, bu da sözleşme imzalamabozabilir. Bu sorunu tanımlayıp düzeltmek için, Katmanlı Şeffaflıkları Sil bakın.
Mitigasyon
- Aynı özellikli malzemeleri oluşturmak ve aynı malzemelerin miktarını azaltmak - Eğer tüm aynı malzemelerin aynı alt altyapı kimliklerine sahip olduğundan eminseniz, motor onları tek bir çekim çağrısında tanı ve görüntü
- Kısaltma - Kısaltma, nihai render alanına katılmayan nesneler için çekim çağrılarının işlemesini açıklar.Varsayılan olarak, motor çekim çağrılarının nesnelerin kapasitesi dışındaki nesneler için geç
- İç ortam için, hiện kullanılmayan herhangi bir kullanıcının gizli kalmasını sağlayan bir oda veya portal sistemi uygulayın.
- Görüntü kalitesini azaltıyor - Görüntü kalitesini Otomatik veya Performans olarak ayarla. Bu, şekillerin çizilmesi gereken çizgi sayısını azaltabilir.
- Uygun yerlerde gölge oluşturmayı devre dışı bırakmak - Gölge oluşturma özelliklerini aydınlatma nesnelerine ve parçalara seçici olarak devre dışı bırakarak komplikasyonu azaltılabilir. Bu, düzenleme zamanı veya dinamik olarak çalışma sırasında yapılabilir. Birkaç örnek:
Gölgelerin görünmez olmasını sağlamak için BasePart.CastShadow özelliğini kullanın. Bu, uzaktaki gölgelerin görünmesi olası olmayan yerlerde gölgelerin görünmesini devre dışı bırakabilir. Bu özellik özellikle uzaktaki kameradan uzak olan parçalar için özellikle etkili olabilir.
Mümkün olduğunda hareketli nesnelerin gölgelerini devre dışı bırakın.
Nesnenin gölgeleri oluşturması gerekmeyen ışık instanslarında Light.Shadows kapatın.
Işık instanslarının menzili ve açısını sınırlar.
Daha az sayıda ışık instansı kullanın.
MicroProfiler Gözlükleri
Mira | İlişkili Hesap |
Hazırlan ve Gerçekleştir | Genel Görüntüleme |
Performans/Sahne/computerLightingPerform | Ağız ağı ve gölge güncellemeleri |
LightGridCPU | Voxel ışık kümesi güncellemeleri |
GölgeHaritaSistemi | Gölgeleme |
Göster/Sahne/GörüntüGüncelleme | Render ve Particle güncellemeleri için hazırlık |
Göster/Sahne/RenderView | Görüntü ve post işlemleri |
Ağ ve Replikasyon
Ağ ve kopyalama, verilerin sunucudan bağlantılı kliklere gönderilmesi için olan süreci açıklar. Her karedeki klien ve sunucu arasında gönderilen bilgi, ancak daha büyük miktarda bilgi daha fazla işlem süresi gerektirir.
Sıradan Sorunlar
Aşırı uzaktaki trafik - RemoteEvent veya RemoteFunction nesneleri aracılığıyla büyük miktarda veri göndermek veya onları çok sık çağırmak, her karede gelen paketlerin işlenmesi için büyük miktarda CPU süresi olabilir. Ortak hatalar şunları içerir:
- Yeniden kopyalanması gerekmeyen her kareyi veri olarak kopyalar.
- Asla sınırlandırmak için kullanıcının girdiği verileri kopyalamak.
- Gerekenden fazla veri gönderiyor. Örneğin, bir öğeyi satın aldıklarında oyuncunun tüm envanterini göndermek yerine, sadece satın alınan öğenin ayrıntılarını göndermek gibi.
Sunucudaki veri modeline yapılan değişikliklerin kaynağı oluşturulur / kaldırılır. Bu, büyük istemci ağları gibi haritaların çalışma zamanında yaratılıp yok edilmesi gibi olabilir. Bu, büyük istemci ağlarının yaratılıp yok edilmesi gibi olabilir. Bu, büyük istemci ağlarının yaratılıp yok edilmesi gibi olabilir.
Buradaki yaygın bir suçluya, oyun yayınlandığından ve animasyon modeli düzenli olarak klonlandığından bu animasyon verileri oyunun yayınlandığından önce kaldırılmaz. Bu gibi bir yük gereksiz yere yeniden yazılır.
- Sunucu-Taraflı TweenService - Eğer TweenService bir nesnenin sunucu tarafından tween edilmesini kullanırsa, tween edilen özellik her kareye tüm müşteriler için yeniden yansıtılır. Bu sadece gecikme olarak tween'in jitterli olmasına neden olmaz, ancak çok fazla ağ trafiği yaratır.
Mitigasyon
Gereksiz kopyalamayı azaltmak için aşağıdaki taktikleri kullanabilirsiniz:
- Uzun miktarda veri göndermek yerine, uzaktaki etkinlikler aracılığıyla büyük miktarda veri göndermeyin . Bunun yerine, sadece gerekli verileri daha düşük bir frekansda gönderin. Örneğin, bir karakterin durumunu yeniden oluşturmak için, tüm kareleri değil sadece gerekli verileri yeniden oluşturun.
- Böylece bunların işini dağıtmak için haritalar gibi parçalara ayrılır like maps and load them in pieces to distribute the work replicating these across multiple frames.
- Animasyon metadılarını temizle , özellikle kaynakların animasyon dizinini, ithal edildikten sonra temizleyin.
- Gereksiz istanza kopyalama sınırına kısıtlamak, özellikle sunucunun oluşturulan instansların bilgisi olması gerekmeyen durumlarda. Bu içerir:
- Patlama veya büyülü bir bıçıltma gibi görsel efektleri. Sunucunun sadece sonucu belirlemek için yerini bilmesi gerekir, bu yüzden müşteriler yerel olarak görüntüler oluşturabilir.
- Birinci kişi öğe görüntüsü modelleri.
- Sunucudaki değerleri yerine kullanıcı üzerinde değerleri eğit.
MicroProfiler Gözlükleri
Mira | İlişkili Hesap |
Süreç Paketleri | Etkinlik çağrıları ve özellik değişiklikleri gibi gelen ağ paketleri işleniyor |
Bant Genişliğini Ayrıntı ve Göndericileri Çalıştır | Sunucularda ilgili olan giden olaylar |
Varlık Hafıza Kullanımı
Yaratıcıların klien belleğini artırmak için kullanabileceği en yüksek etki mekanizması, İstem Gösterimi etkinleştirmektir.
İstemci Yayını
İstek bağlantısıyla yüklenen bazı verit modu parçaları, gerekli olmayanların yüklenmesini seçici olarak yüklemeye izin verir, cezalandırma olmadan kliği aşırı yüklemeye izin verir.
Eğer hafıza sorunlarıyla karşılaşıyorsanız ve istemci yayınını devre dışı bırakırsanız, deneyiminizi güncellemenizi düşünün, özellikle 3D dünyanız geniş ise. İstemci yayını 3D alanındaki mesafeye dayanır, böylece daha büyük dünyalar doğal olarak bunun üzerinden daha fazla yararlanır.
Eğer istemci yayınlanması aktifleştirilmişse, onun agresivitesini artırabilirsiniz. Örneğin, şunu göz önünde bulundurun:
- Kalıcı StreamingIntegrity kullanımını azaltıyor.
- yayınlanma çevresini azaltıyor.
Yayın seçenekleri ve yararları hakkında daha fazla bilgi için Yayın Özellikleri bakın.
Diğer Sık Sorunlar
- Varlık kopyalama - Ortak bir hata, aynı varlık kopyalanması sonucu farklı varlık kimlikleri oluşturan çok sayıda yüklemeyi yapmaktır. Bu, aynı içeriğin belleğe birçok kez yüklenmesine neden olabilir.
- Aşırı miktarda varlık hacmi - Aynı varlığı yeniden kullanma ve hafıza kaydedilmesi fırsatları kaçırılan durumlar vardır.
- Ses dosyaları - Ses dosyaları, özellikle bir bölüm deneyiminin bir kısmı için gerekenleri yüklemeyi aşağıdakilerden daha da iyi bir katkıda bulunabilir: tüm dosyaları aynı anda yüklemeyi, gerektiğinde sadece gerekenleri yüklemeyi. Stratejiler için, Yükleme Sürelerini görün.
- Yüksek çözünürlüklü yapılar - Bir yapının boyutu, diskinizdeki yapının büyüklüğüne ilişkin olmayan grafikler için grafiklerin tüketimini artırır, ancak yapının piksel sayısını değil.
- Örneğin, 1024x1024 piksel dokunuşu, 512x512 dokunuşunun grafiklerini dört kat daha fazla tüketir.
- Roblox'a yüklenen görüntüler transkodlanmış bir biçime dönüştürülür, böylece bir renk modeline bağlı olarak daha az bit başına görüntü yüklemek için bir memeaj yoktur. Aynı şekilde, görüntüleri yüklemeden önce veya alfa kanalını
- Grafik kaynağı tüketimini belirlemek için, Grafikler Kategorisi kısmını Geliştirici Konsolu içinde genişletin.
Mitigasyon
- Sadece bir kez varlık yükleyin - Aynı varlık kimliğini nesneler arasında tekrar kullanın ve aynı varlıkları, özellikle gölgeleri ve görüntüleri, birden fazla kez yüklenmez.
- Aynı malzemeleri bul ve düzelt - Farklı ID'lerle yüklenen aynı malzemeleri veya metinürleri ara.
- Aynılığı algılamak için otomatik olarak herhangi bir API yoksa, yerinizdeki tüm görüntü varlık kimliklerini toplayabilirsiniz (herhangi biri manuel olarak veya bir senaryoda), onları indirebilir ve dışarıda karşılaştırma araçlarını kullanarak karşılaştırabilirsiniz.
- Mesh parçaları için en iyi strateji, eşsiz mesafe ID'lerini almak ve onları boyut olarak manuel olarak duplikatları belirlemek.
- Farklı renkler için ayrı tekstürler kullanmak yerine, bir tekstür yükle ve SurfaceAppearance.Color özelliğini kullanarak çeşitli tonları uygula.
- Harita üzerindeki varlıklar ayrı ayrı ithal edilir - Haritanın bütünü yerine, haritanın bir parçasını veya bir parçasını ayrı ayrı ithal eder ve onu yeniden inşa eder. 3D ithalleyici hiçbir çizgi üzerinde duplik
- Görüntülerin piksel sayısını mümkün olduğunca fazla değil, sadece gerekli miktara sınırlayın. Eğer bir görüntü büyük miktarda fiziksel alanı kaplıyorsa, genellikle 512x512 pikselden daha küçük olmalıdır. Çoğu daha az görüntü 256x256 pikselden daha küçük olmalıdır.
- Trim Sheets'ı kullanarak maksimum tekstür tekrar kullanılırını garantiye almak için 3B haritalarda. İpuçları ve örnekler için Trim Sheets'ı Oluşturma bakın.
Yükleme Zamanları
Birçok deneyim özelleştirilmiş yükleme ekranlarını destekler ve ContentProvider:PreloadAsync() yöntemini kullanarak görüntüler, sesler ve mesaşlar arka plan olarak indirilir.
Bu yaklaşımın avantajı, pop-in olmadan deneyiminizin önemli kısımlarının tamamen yüklendiğinden emin olmanızı sağlar. Ancak, yaygın bir hata bu yöntemi aşırı kullanmak, gerekenlerden daha fazla varlık önce yüklemeyi denemektir.
Bir kötü uygulamanın bir örneği, tüm birWorkspace yüklemek. Bu, tekstür pop-in'i önlemek için önleyebilir, ancak yükleme süresini önemli ölçüde artırır.
Bunun yerine, sadece ContentProvider:PreloadAsync() ı gerektiğinde kullanın, bunlar arasında şunlar vardır:
- Yükleme ekranındaki görüntüler.
- Buton arka planları ve ikonlar gibi deneyim menünüzdeki önemli görüntüleri İçe aktarın.
- Başlangıç veya oluşturma alanındaki önemli kaynaklar.
Büyük sayıda varlığı yüklemeniz gerekiyorsa, bir Yüklemeyi Geç düğmesi sağlayın.