Bu kılavuz, oyunda örnek akışı verimli ve etkili bir şekilde kullanmak için birkaç teknik özetlemektedir. Akışa dayalı bir oyun tasarlamak için "tek tip çözüm" yoktur, ancak bu yüksek düzeydeki adımları takip etmek sizi büyük ölçüde hedefinize ulaştıracaktır.
Akış özellikleri
StreamingEnabled Studio'daki Workspace nesnesi için açıldığında, ilgili özelliklerini aşağıdaki önerilen değerlere ayarlayın:
| Özellik | Öneri |
|---|---|
| EnableSLIMAvatars | Uygun olduğunda standart rig avatarlarını hafif, animasyonlu temsilciler olarak renderlamak için Enabled kullanın. Daha fazla bilgi için SLIM avatarları bölümüne bakın. |
| ModelStreamingBehavior | Models içindeki BasePart alt nesneleri için en verimli akışı sağlamak üzere Improved kullanın. |
| StreamingIntegrityMode | Gereksiz veya çok sık duraklatmadan oyun bütünlüğünü dengelemek için PauseOutsideLoadedArea kullanın. |
| StreamingMinRadius | Düşük seviye cihazlar için oyunun ne kadar küçültülebileceğini maksimize etmek üzere varsayılan 64 değerini kullanın. |
| StreamingTargetRadius | Yüksek seviye cihazlardaki oyuncular için görünürlük ile makul bir bellek ayak izi arasında iyi bir denge sağlamak için varsayılan 1024 değerini kullanın. |
| StreamOutBehavior | İstemcinin içeriği agresif bir şekilde çöp toplamasına izin vermek için Opportunistic kullanın, bu da bellek kullanımını önemli ölçüde azaltır ve bellek yetersizliği nedeniyle çökme olasılığını önlemeye yardımcı olur. |
Model detay seviyesi
Model.LevelOfDetail, akışa alınmamış Model içeriğini hafif kompozit veya sahte ağlarla doldurmaya yardımcı olur ve dünyayı görsel olarak tamamlar. SLIM (Ölçeklenebilir Hafif Etkileşimli Modeller) özellikle etkilidir, çünkü oyuncular genellikle bir SLIM ağını tam olarak akışa alınmış orijinalinden ayırt edemezler.
En iyi sonuçlar için:
- Mekansal ve mantıksal olarak ilişkili parçaları gruplandırın, örneğin bir arabanın tüm parçaları.
- Statik ağlar ve parçalar içeren modellerde LevelOfDetail değerini SLIM olarak ayarlayın. Çalışma zamanında değiştirilen veya animasyon oynatılan modeller desteklenmez.
- Her modelin mekansal boyutunu ~64 kübik stud altında tutun, böylece tüm gerçek modelin birlikte akışa alınma olasılığını artırın. Bir modelin çok büyük boyutları varsa, onu daha küçük modüler modellere ayırın ve her birine uygun bir LevelOfDetail uygulayın.
Model yapısı
Model detay seviyesini ayarlamanın ötesinde, Models yapısı ve ayarları akışın ne kadar iyi performans gösterdiği üzerinde önemli bir etkiye sahiptir. Mevcut bir oyunu geliştirirken veya dönüştürürken:
Mantıksal gruplama için atomik modeller kullanın — Bir scriptin bir model içindeki tüm parçalara erişmesi gerektiğinde, ModelStreamingMode değerini Atomic olarak ayarlayın. Bu, istemci tarafı scriptlerinin model içindeki örneklere aşırı WaitForChild() kullanmadan güvenli bir şekilde erişmesine olanak tanır (ancak bu tür scriptler yine de genel atomik model için WaitForChild() kullanmalıdır).
Kalıcı modelleri en aza indirin — Kalıcı modeller, katılım sonrası yüklenir ve asla akıştan çıkmaz, kalıcı olarak bellek kaplar. Bir modelin ModelStreamingMode değerini yalnızca her zaman mevcut ve scriptlere erişilebilir olması gerekirse Persistent olarak ayarlayın.
Kapsayıcı modelleri parçalayın — Yaygın bir akışa dayalı olmayan modelleme, birçok NPC, nesne veya benzeri grupları içeren tek bir büyük Modeldır. Akış altında, kapsayıcı modeller akış verimliliğini azaltır ve model detay seviyesi için optimal değildir; bu, yakın gruplandırılmış örneklerle en iyi şekilde çalışır. Kapsayıcı modelleri, fiziksel olarak yakın veya mantıksal olarak ilişkili parçalara sahip daha küçük modellere ayırın.
SLIM avatarları
Akışa alınmamış alanın dışındaki platform avatarları varsayılan olarak görünmez, ancak Workspace.EnableSLIMAvatars etkinleştirildiğinde, uygun olduğunda standart rig avatarları hafif, animasyonlu temsilciler olarak renderlanır. Etkili bir şekilde, motor:
- Gerçek bir avatar modeli akıştan çıktığında bir SLIM versiyonu renderlar.
- Mevcut kaynaklara bağlı olarak SLIM ve tam çözünürlüklü temsiller arasında geçiş yapar, akış alanı içinde bile.
- Sahne önemine ve mevcut bant genişliğine bağlı olarak SLIM animasyonlarını kısıtlar.
SLIM avatarları, beden, baş, katmanlı giysi ve aksesuarlarla R15 standart-rig oyuncu karakterlerini destekler. R6 avatarları, NPC'ler ve özel oranlara sahip avatarlar hariçtir. Desteklenen ve hariç tutulan avatar yapılandırmalarının tam listesi, performans verileri ve sorun giderme ipuçları için SLIM avatarları bölümüne bakın.
Script desenleri
Aşağıdaki script desenleri akıştan en çok etkilenenlerdir. Doğru strateji, kodun amacına bağlıdır, bu nedenle her desen uygun olduğunda birden fazla seçenek listeler.
Alt nesnelere doğrudan indeksleme
Workspace alt nesnelerine . operatörü ile indeksleme, yoldaki herhangi bir örnek akışa alınmamışsa bir hata fırlatır. Bu, FindFirstChild(), FindFirstChildWhichIsA() ve FindFirstChildOfClass() için de geçerlidir; bu yöntemler, çocuk akışa alınmamışsa nil döner.
local house1 = workspace:FindFirstChild("House1") -- "House1" akışa alınmamışsa nil
local door = workspace.House1.Door -- "House1" veya "Door" akışa alınmamışsa bozulurBenzer bir desen, Player.CharacterAdded bağlantısı içinde Humanoid veya diğer karakter alt nesnelerine doğrudan erişmektir. Akış altında, karakter modeli Workspace'a tüm alt nesneleri çoğaltılmadan önce yerleştirildiği için doğrudan indeksleme başarısız olur.
local Players = game:GetService("Players")
local player = Players.LocalPlayer
player.CharacterAdded:Connect(function(character)
local humanoid = character.Humanoid
end)Eğer script bir örneksiz ilerleyemiyorsa, WaitForChild() ile bekleyin:
local house1 = workspace:WaitForChild("House1")
local door = house1:WaitForChild("Door")Uzakta gönderilen örnekler
Bir RemoteEvent/RemoteFunction sinyali ve referans verdiği örnek bağımsız olarak hareket eder, bu nedenle sinyal istemciye örnek mevcut olmadan önce ulaşabilir — veya örnek hiç mevcut olmayabilir. İki olası neden şunlardır:
Akış altında, bir parça/modelin sunucuda oluşturulması ile istemcilere çoğaltılması arasında küçük bir gecikme olabilir. Etkili bir şekilde, bir RemoteEvent/RemoteFunction ile referans verilen bir parça, akış alanında bile henüz mevcut olmayabilir.
Sunucudan istemciye bir parça/model referansı göndermek, örneğin alıcı istemciye çoğaltılmasını gerektirir. Bir örnek yolunu bir dize olarak göndermek de aynı sorunu taşır, çünkü yol istemcide mevcut olmayan bir konuma çözülüyor olabilir:
İstemci Scriptilocal ReplicatedStorage = game:GetService("ReplicatedStorage")local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")remoteEvent.OnClientEvent:Connect(function(data)local checkpoint = data.checkpoint -- "checkpoint" akışa alınmamışsa hata verirlocal level = workspace.Levels[data.levelPath] -- yol akışa alınmamışsa hata verirend)
Eğer alıcı istemci scriptinin ilerlemek için örneğe ihtiyacı varsa, kullanmadan önce WaitForChild() ekleyin. Bu, örnek asla akışa alınmazsa sonsuz bir şekilde bekleyebilir, bu nedenle WaitForChild()'in ikinci parametresi olarak bir zaman aşımı eklemeyi düşünün.
İstemci senkronizasyonu
İstemci tarafı senkronizasyonu bir istisna olarak ele alınmalıdır, standart bir tasarım deseni olarak değil. Sadece istemciye özgü kopyalar veya örnekleri yerel olarak yeniden yerleştirmek ciddi sorunlar yaratabilir. Kodunuzu, bu tür değişikliklerin istemcide kalıcı olmasına dayanan yerler için denetleyin.
Örneğin, bir örneği yerel olarak ReplicatedStorage'dan Workspace'a yeniden yerleştirmek, o örneği akıştan çıkmaya uygun hale getirebilir. Benzer şekilde, bir örneği yerel olarak (Instance:Clone()) ReplicatedStorage'dan Workspace'a kopyalamak, sunucu çoğaltma hattının bir parçası olmayan istemciye özgü bir kopya oluşturur ve orijinal sunucuya ait örnekten güncelleme almaz.
Aynı kavram, sunucuya ait bir nesne için istemcide Instance:Destroy() çağrıldığında da geçerlidir. Bu, örneği yerel olarak kaldırır, ancak sunucu hala onu tutar, bu nedenle uygun olduğunda orijinal durumu ile tekrar akışa alınır.
Proaktif akış
Bir oyuncunun bir sonraki varış noktasının tahmin edilebildiği durumlarda, geçici yükleme için alanları akışa almak üzere sunucu tarafında Player:RequestStreamAroundAsync() çağrıları yapın veya açıkça serbest bırakılana kadar yüklenmesi gereken alanlar için Player:AddReplicationFocus() kullanın.
Örneğin, bir oyuncu karakteri, uzak bir konumdaki başka bir oyuncunun evine CFrame değişikliği ile teleport olmaya hazırlanıyorsa, pop-in'i en aza indirmek ve daha pürüzsüz bir geçiş sağlamak için varış alanını önceden yükleyebilirsiniz. Aşağıdaki script, bir istemciden sunucuya uzaktan olay ateşlenerek bir oyuncu karakterini taşımak için bir ön yükleme yöntemi kullanır. Eğer ön yükleme isteği başarılı olursa, hedef konum etrafındaki minimum yarıçap istemcide mevcut olmalıdır.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")
local function teleportPlayer(player, teleportTarget)
-- Hedef konum etrafında akış talep et
player:RequestStreamAroundAsync(teleportTarget)
-- Karakteri teleport et
local character = player.Character
if character and character.Parent then
local currentPivot = character:GetPivot()
character:PivotTo(currentPivot * CFrame.new(teleportTarget))
end
end
-- İstemci uzaktan olayı ateşlediğinde teleport fonksiyonunu çağır
teleportEvent.OnServerEvent:Connect(teleportPlayer)Örnek özellik okumaları
Bir örnek akıştan çıktığında, özellik güncellemeleri artık o istemciye çoğaltılmaz. BasePart.Position gibi özellikleri okumak başarılı olmaya devam eder, ancak en son çoğaltılan değeri döner ve bu değer keyfi olarak eski olabilir.
local Players = game:GetService("Players")
local player = Players.LocalPlayer
-- "target" akıştan çıkmışsa konum eski olabilir
local dist = (target.Position - player.Character.HumanoidRootPart.Position).MagnitudeMantığı sunucuya taşıyın, çünkü sunucu tarafı scriptleri her zaman tüm örneklere erişebilir. Bu, mesafe kontrolleri ve diğer konum hassasiyetine dayalı mantık için genellikle en güvenilir seçenektir.
Kritik yolda bekleme
Bazı akışa dayalı olmayan oyunlar haritalarını ReplicatedStorage'dan Workspace'a kopyalayarak yükler, ardından istemcide bir yükleme ekranını kapatmadan önce bekler. Akış altında bu sonsuz bir şekilde takılır — istemcinin karakteri henüz doğmamıştır, bu nedenle çoğaltma odaklanması yoktur ve mekansal harita örneği asla akışa alınmaz.
Yükleme ekranı mantığını, belirli bir mekansal örneğin mevcut olmasına bağlı olmayacak şekilde taşıyın; örneğin, karakter doğduğunda ve hemen çevresindeki alan akışa alındığında hazır olunduğunu bildirin.
Sinyal değişikliği yönetimi
Instance.ChildAdded/Instance.ChildRemoved gibi sinyaller ve CollectionService sinyalleri, akışa alma/çıkarma sırasında da tetiklenir ve gerçek doğum/çıkarma ile ayırt edilemez. Alıcı scriptler sinyalin kendisinden farkı anlayamaz, bu nedenle bir sinyalin "gerçek" bir olaya karşılık geldiğini varsayan mantık güncellenmelidir.
Akışa alma ve/veya akıştan çıkarma ile tetiklendiğinde bozulabilecek veya önemli ölçüde değişebilecek herhangi bir sinyal dinleyicisi için scriptleri denetleyin. Örneğin, bir düşman NPC dünyaya ilk girdiğinde ses veya görsel efektler oynatıyorsanız, her düşmana ilk doğumda Spawned gibi bir özellik atayın ve düşmanın gelecekteki akışlarına aynı ses/efektleri tekrar oynatmayı atlayın.
local CollectionService = game:GetService("CollectionService")
local TAG_NAME = "Enemy"
CollectionService:GetInstanceAddedSignal(TAG_NAME):Connect(function(enemy)
if not enemy:GetAttribute("Spawned") then
-- İlk doğum için düşmana "Spawned" özelliğini ayarla
enemy:SetAttribute("Spawned", true)
-- Bu ilk doğum için ses/görsel efektleri oynat
playSpawnEffects(enemy)
end
end)Koleksiyonlar üzerinde yineleme
İstemci tarafı koleksiyon yinelemeleri, Instance:GetChildren() ve Instance:GetDescendants() yalnızca akışa alınmış alt nesnelerin alt kümesini döner. Bu, ana nesne her zaman çoğaltılsa bile geçerlidir; örneğin, Workspace altında doğrudan bulunan bir Folder'ın mekansal alt nesneleri akışa alınır ve çıkarılır.
local Players = game:GetService("Players")
local player = Players.LocalPlayer
-- "Homes" klasörü her zaman çoğaltılır ancak çocukları akışa alınır ve çıkarılır
-- Bu döngü, şu anda akışa alınmamış evleri atlayabilir
for _, home in workspace.Homes:GetChildren() do
if home.Settings.Owner.Value == player.Name then
return home
end
endTam bir listeleme gerekiyorsa, sunucuda tarama yapın ve sonucu gerekirse bir RemoteEvent aracılığıyla oyuncuya iletin.
Mekansal sorgular
İstemci tarafı mekansal sorgular, WorldRoot:Raycast(), WorldRoot:GetPartBoundsInBox() ve Model:GetBoundingBox() yalnızca akışa alınmış içeriği yansıtır. Bunun bir sorun olup olmadığı, sorgunun ne için kullanıldığına bağlıdır.
Sonucun tam dünyayı yansıtması gereken sorgular için sunucuyu kullanın; örneğin, bir oyuncunun uzak bir hedefe görüş hattı olup olmadığını kontrol eden bir raycast.
Diğer desenler
Aşağıdaki desenler de geçerli olabilir ve dikkatlice değerlendirilmelidir:
Bir Sound veya AudioPlayer, 3D bir nesneye yerleştirildiğinde, o nesne akıştan çıktığında durur. Akışa bağlı olmaksızın devam etmesi gereken ortam sesleri için, yayıcıyı bir kalıcı modele veya akışa dayalı olmayan bir kapsayıcıya yerleştirin.
Oyun içi UI nesneleri, BillboardGui veya SurfaceGui gibi, ayrıca Beams veya Highlights gibi görsel efektler akıştan çıktığında basitçe renderlamayı durdurur. Bu, istenen bir davranış olabilir, ancak bunu doğrulamalısınız.
BasePart.Touched olayları, ProximityPrompts, DragDetectors ve ClickDetectors, istemcide ilgili parça/model akışa alınmadığında çalışmaz. Etkileşim her mesafeden mümkün olmalıysa, modelin kalıcı olması gerekir veya etkileşim için farklı bir mekanizma gereklidir.
PathfindingService ve istemci tarafı yol bulma için, yol bulucu yalnızca istemcide akışa alınmış geometrileri görür ve sunucuda var olan engellerden geçebilir. Stratejiler için buraya bakın.
Gerçekçi test koşulları
Skriptler güncellendikten sonra, oyunu kapsamlı bir şekilde test edin. Akış hataları genellikle akış alanlarının kenarlarında veya geçişler sırasında ortaya çıkar, bu nedenle yalnızca doğum noktasında veya hedef yarıçapında test etmek yeterli değildir.
Workspace.StreamingTargetRadius değerini minimum değeri (64) olarak ayarlayın. Bazı akış hataları yalnızca akış alanı küçük olduğunda görünür.
Oyunun tam geçiş desenlerini oynayın, uzak alanlar arasında teleport edin ve ayrıldıktan sonra alanları yeniden ziyaret edin. Bu, akışa alma ve akıştan çıkarma işlemlerini en çok zorlayan durumlardır.
Aktif akış ayarlarını, şu anda yüklü bölgeleri ve çalışma zamanı akış durumunu izlemek için akış hata ayıklama üst bilgisi kullanın.
Hatalar için Çıktı penceresini ve Geliştirici Konsolu penceresini izleyin; çünkü birçok script deseni hatalar üretir, sessiz bir şekilde yanlış davranış yerine. nil ile indeksleme hatası gibi hatalara özellikle dikkat edin; bu genellikle eksik bir WaitForChild() çağrısını gösterir.
Tools ekipmanlarını giyin ve etkinleştirin, silah ateşleyin ve farklı oyun etkileşimlerini tetikleyin.
AI akış dönüşüm becerisi
Akış dönüşümü ve optimizasyonu konusunda yardımcı olmak için Roblox, Studio'dan erişilebilen bir AI akış becerisi sunmaktadır MCP sunucusu. Bu beceri, oyununuzu otomatik olarak değerlendirir, önerilen yapılandırmaları uygular ve uyumluluk sorunlarını temizler, bunlar arasında:
- Akış ayarlarını önerilen temel değerler ile yapılandırır.
- Uygun olduğunda modellerin detay seviyesini SLIM olarak ayarlar.
- Optimal boyutlar ve görsel kalite elde etmek için model yapılarını yeniden yapılandırır.
Oyununuza AI becerisini kullanmak için:
- ÖNEMLİOyununuza yedek alın. Dönüşüm süreci karmaşık olabilir, bu nedenle beceriyi çalıştırmadan önce her zaman bir yedek kaydetmelisiniz (Dosya ⟩ Roblox'a Yayınla) .
Bu beceriyi Studio'daki Model Context Protocol (MCP) aracılığıyla tercih ettiğiniz herhangi bir LLM kullanarak çalıştırabilirsiniz. Daha büyük bağlam pencerelerine sahip yüksek kaliteli AI modelleri önerilir; Claude Opus'ta tipik dönüşüm 20-30 dakika sürer ve yaklaşık 200,000 token bağlamı kullanır.
- Oyunuzu Studio'da açın.
- Beceriyi indirin ve AI istemcinizde açılan klasörü (roblox-streaming-conversion) mevcut proje olarak açın.
- Beceriyi /rbx-convert-to-streaming ile çalıştırın.
- Herhangi bir AI çıktısında olduğu gibi, sonuçları doğrulayın ve oyununuzu gerçekçi test koşullarında kapsamlı bir şekilde test edin.

