في اللعبة، يسمح بث الأمثلة لمحرك Roblox بتحميل وتفريغ محتوى ثلاثي الأبعاد ونسخ مرتبطة في Workspace ديناميكيًا. وهذا يمكن أن يحسن تجربة اللاعب العامة بطرق متعددة، بما في ذلك:
- أوقات انضمام أسرع— يمكن للاعبين البدء في اللعب في جزء من العالم أثناء تحميل المزيد من العالم في الخلفية.
- الكفاءة في الذاكرة— يمكن لعب الألعاب على أجهزة ذات ذاكرة أقل نظرًا لأنه يتم بث المحتوى ديناميكيًا. يمكن لعب عوالم أكثر غمرًا وتفصيلًا على مجموعة واسعة من الأجهزة.
- أداء محسّن— معدلات إطارات أفضل وأداء أعلى، حيث يمكن للخادم قضاء وقت أقل ونطاق ترددي أقل في مزامنة التغييرات بين العالم واللاعبيين فيه. يقضي العملاء وقتًا أقل في تحديث النسخ التي ليست ذات صلة حاليًا باللاعب.
- مستوى التفاصيل— عند تكوينها، تظل النماذج البعيدة، وصور الرموز، والتضاريس مرئية حتى عندما لا تُبث إلى العملاء، مما يحافظ على تحسين اللعبة دون التضحية بتفاصيل الخلفية بالكامل.
يتحكم بث الأمثلة من خلال خاصية Workspace.StreamingEnabled، المفعلة بشكل افتراضي للأماكن الجديدة التي يتم إنشاؤها في Studio. لا يمكن تعيين هذه الخاصية في سكربت.

السلوك الفني
النطاق
تنطبق منطق البث والميزات حصريًا على النسخ التي هي نسل من Workspace، بينما النسخ المخزنة في حاويات أخرى مثل ReplicatedStorage و ReplicatedFirst غير مؤهلة للبث. على سبيل المثال، وضع نموذج ذرّي تحت ReplicatedStorage لا يضمن النسخ الذري.
البث في
عندما ينضم لاعب إلى لعبة مع تفعيل بث الأمثلة:
يتم نسخ النسخ في Workspace إلى العميل باستثناء ما يلي:

Models المحددة كـ ذري، دائم، أو دائم لكل لاعب؛ انظر تحكمات بث النماذج

Models المحددة كـ غير ذرّي (افتراضية) عندما يكون Workspace.ModelStreamingBehavior مضبوطًا على Improved

نسل النسخ أعلاه
أثناء اللعب، قد يقوم الخادم ببث النسخ في الفئات المؤجلة أعلاه إلى العميل بناءً على خاصيات البث للعبة، وموقع اللاعب، وأداء جهاز العميل، وظروف أخرى.
البث خارجًا
أثناء اللعب، قد يقوم العميل بإزالة مناطق من BaseParts من Workspace الخاصة باللاعب بناءً على السلوك المحدد بواسطة Workspace.StreamOutBehavior. تبدأ العملية من المناطق الأبعد عن طاقم النسخ وتتحرك بالقرب، حسب الحاجة. لا تقوم المناطق داخل نطاق Workspace.StreamingMinRadius بالبث خارجًا أبدًا.
لاحظ أن Model الذي لا يحتوي على نسل من BasePart، مثل ذلك المستخدم لمجرد كونه "حاوية" لنسخ غير-BasePart مثل السكربتات، هو معفى من البث خارجًا ما لم يصبح نسلًا من BasePart.
التجميعات
تقوم التجميعات الفيزيائية بالبث داخل ككيانات كاملة، بما في ذلك قيود Constraints و Attachments المرتبطة بها، مما يساعد على ضمان تحديثات فيزيائية متسقة على العملاء. الاستثناء الوحيد هو عندما تكون التجميعة مثبتة، في هذه الحالة يتم بث BaseParts الموجودة في نطاق البث فقط جنبًا إلى جنب مع قيودها وارتباطاتها.
لا يتم بث التجميعات خارجًا حتى تكون جميع BaseParts الخاصة بها مؤهلة للبث خارجًا.
خصائص البث
تتحكم الخصائص التالية في كيفية تطبيق بث الأمثلة على لعبتك. جميع هذه الخصائص هي غير قابلة للتعديل عبر السكربت ويجب تعيينها على كائن Workspace في Studio.

| الخاصية | الوصف |
|---|---|
| EnableSLIMAvatars | يحدد ما إذا كان يتم إنشاء نموذج SLIM لشخصيات اللاعب في اللعبة. عند تفعيله، يتم عرض الشخصيات باستخدام SLIM بنفس طريقة عمل إعداد Model.LevelOfDetail لتطبيق تعديل SLIM على النماذج الأخرى. |
| ModelStreamingBehavior | يتحكم بكيفية إذ تتدفق غير ذرّي (افتراضي) النماذج بالدخول والخروج. موصى به استخدم Improved لتمكين أكثر بث كفاءة لـ Models التي تحتوي على نسل من BasePart. |
| StreamingIntegrityMode | قد تتصرف اللعبة بطرق غير مقصودة إذا انتقل اللاعب إلى منطقة من العالم لم يتم بثها إليهم. تقدم هذه الخاصية وسيلة لتجنب تلك الحالات المحتملة الإشكالية. موصى به استخدم PauseOutsideLoadedArea لتحقيق توازن بين نزاهة اللعب دون التوقف بشكل غير ضروري أو بشكل متكرر. يمكنك أيضًا تخصيص شاشة التوقف. |
| StreamingMinRadius | تشير هذه الخاصية إلى النطاق حول طاقم النسخ الذي يتم فيه بث النسخ بأعلى أولوية. يجب توخي الحذر عند زيادة القيمة الافتراضية، حيث أن القيام بذلك سيتطلب المزيد من الذاكرة ونطاق ترددي للخادم على حساب مكونات أخرى. موصى به استخدم القيمة الافتراضية 64 لتعظيم كيف يمكن للمحرك تقليص اللعبة للأجهزة ذات القدرات المحدودة. |
| StreamingTargetRadius | تتحكم هذه الخاصية في أقصى مسافة عن طاقم النسخ حيث يتم بث النسخ. لاحظ أنه يمكن للمحرك الاحتفاظ بالنسخ التي تم تحميلها سابقًا خارج نطاق الهدف، بشرط وجود الذاكرة. إن تقليل StreamingTargetRadius يقلل من عبء العمل على الخادم، حيث لن يقوم الخادم ببث نسخ إضافية خارج القيمة المحددة. ومع ذلك، فإن نطاق الهدف هو أيضًا أقصى مسافة سيستطيع اللاعبون رؤية التفاصيل الكاملة للعبتك، لذا يجب عليك اختيار قيمة توازن جيدة بين هذين. موصى به استخدم القيمة الافتراضية 1024 لتحقيق توازن جيد بين الرؤية للاعبين على الأجهزة المتقدمة وارتباط الذاكرة المعقول. |
| StreamOutBehavior | تحدد هذه الخاصية سلوك البث للخارج وفقًا لقيمة Enum.StreamOutBehavior. إذا تم تعيينه إلى LowMemory (افتراضي)، يقوم العميل فقط بالبث خارج المناطق التي تتجاوز النطاق الأدنى في حالة نقص الذاكرة. إذا تم تعيينه إلى Opportunistic، يمكن إزالة المناطق خارج StreamingTargetRadius على العميل حتى عندما لا يوجد ضغط ذاكرة (في هذا الوضع، لا يقوم العميل أبدًا بإزالة النسخ الموجودة ضمن نطاق الهدف، باستثناء في حالات نقص الذاكرة). موصى به استخدم Opportunistic للسماح للعميل بجمع المحتوى بشكل عدواني، مما يقلل بشكل كبير من استخدام الذاكرة ويساعد في منع حوادث نفاد الذاكرة. |
تركيز النسخ
بشكل افتراضي، يحدث البث حول PrimaryPart لشخصية اللاعب المحلية، على الرغم من أنه يمكنك تحديد نقطة تركيز نسخ مختلفة من خلال Player.ReplicationFocus.
يمكنك أيضًا إضافة وإزالة نقاط تركيز النسخ الإضافية من خلال Player:AddReplicationFocus() و Player:RemoveReplicationFocus() لتمكين البث ديناميكيًا في مناطق متعددة من اللعبة.
تحدث محاكاة الفيزياء على جانب العميل، بما في ذلك التوقعات وإعادة المحاكاة عندما يتم تنفيذ سلطة الخادم، فقط في المناطق المتدفقة، حتى للنسخ المخلوقة محليًا وللنسخ Persistent. إذا كان لديك نسخ تود الاحتفاظ بمحاكاتها حتى عندما تكون بعيدة عن الشخصية، أنشئ نقطة تركيز نسخ إضافية بالقرب من تلك النسخ.
تحكمات بث النماذج
لتجنب المشكلات المتعلقة بالبث على أساس كل نموذج وتقليل استخدام WaitForChild(), يمكنك تخصيص كيفية تدفق Models والنسخ التابعة لها من خلال خاصية ModelStreamingMode.
غير ذرّي
بشكل افتراضي، تكون النماذج في وضع Nonatomic وتتدفق بالدخول والخروج بناءً على ما إذا كان تم تعيين Workspace.ModelStreamingBehavior على Legacy (افتراضي) أو Improved.
وراثي
عندما يكون Workspace.ModelStreamingBehavior مضبوطًا على Legacy (افتراضي)، يتم نسخ حاوية Model ونسخها غير-BasePart مثل Scripts إلى العميل عند انضمام اللاعب. ثم، عندما تصبح مؤهلة، تتدفق النسخ BasePart للنموذج إلى الداخل.

محسّن
عندما يكون Workspace.ModelStreamingBehavior مضبوطة على Improved، يختلف سلوك بث النماذج بحسب ما إذا كان النموذج يحتوي على نسخ من BasePart أو لا يحتوي على نسخ من BasePart:
نموذج يحتوي على نسخ من BasePart يتدفق داخل فقط عندما تكون واحدة من نسخ BasePart الخاصة به مؤهلة للبث. في هذه المرحلة، تتدفق النسخة والنموذج ونسخ BasePart المؤهلة إلى الداخل، جنبًا إلى جنب مع نسخ غير-BasePart للنموذج.
عندما تتدفق آخر نسخة BasePart المتبقية للنموذج خارجًا، سيتدفق النموذج نفسه للخارج بجانبها.

ذري
إذا تم ضبط Model على Atomic، يتم بث جميع نسخها الأولية معًا عندما تكون نسخة BasePart مؤهلة للبث. نتيجة لذلك، فإن سكربت على جانب العميل يحتاج إلى الوصول إلى النسخ داخل النموذج يجب أن يستخدم WaitForChild() على النموذج نفسه، ولكن ليس على نسخة تابعة من MeshPart أو Part لأنها مرسلة جنبًا إلى جنب مع النموذج.
يتم بث النموذج الذري فقط خارجًا عندما تكون جميع أجزائه النسخ مؤهلة للبث خارجًا، وعندها يتم بث النموذج بالكامل معًا.

دائم
النماذج المحددة بـ Persistent ليست خاضعة للبث الديناميكي عادي. يتم إرسالها ككتلة ذرية كاملة بعد فترة وجيزة من انضمام اللاعب وقبل أن تبدأ حدث Workspace.PersistentLoaded في العمل. النماذج الدائمة ونسخها التبعية لا يتم بثها خارجًا أبدًا، لكن للتعامل بشكل آمن مع البث الداخلى داخل سكربت عميل، يجب أن تنتظر حتى يبدأ حدث PersistentLoaded في العمل.

دائم لكل لاعب
تتصرف النماذج المحددة بـ PersistentPerPlayer بنفس الطريقة التي تتصرف بها Persistent بالنسبة للاعبين الذين تمت إضافتهم باستخدام Model:AddPersistentPlayer(). بالنسبة للاعبين الآخرين، تكون السلوكيات مماثلة لـ Atomic. يمكنك الرجوع عن نموذج من استمرارية اللاعب عبر Model:RemovePersistentPlayer().
تخصيص شاشة التوقف
بافتراض أن Workspace.StreamingIntegrityMode مضبوط على القيمة الموصى بها PauseOutsideLoadedArea، ستتوقف اللعبة إذا انتقل لاعب إلى منطقة من العالم لم يتم بثها إليهم. في هذه الحالات، تشير خاصية Player.GameplayPaused إلى حالة التوقف الحالية للاعب والتي يمكن استخدامها مع اتصال GetPropertyChangedSignal() لعرض أو إخفاء واجهة مستخدم مخصصة.
LocalScript
local Players = game:GetService("Players")
local GuiService = game:GetService("GuiService")
local player = Players.LocalPlayer
-- تعطيل نافذة التوقف الافتراضية
GuiService:SetGameplayPausedNotificationEnabled(false)
local function onPauseStateChanged()
if player.GameplayPaused then
-- عرض واجهة المستخدم المخصصة
else
-- إخفاء واجهة المستخدم المخصصة
end
end
player:GetPropertyChangedSignal("GameplayPaused"):Connect(onPauseStateChanged)
تصحيح الأخطاء في وقت التشغيل
يتضمن المحرك عدة لوحات تصحيح على الشاشة يمكن تفعيلها على العميل باستخدام مفاتيح الاختصار. للوصول إلى معلومات تصحيح البث:
افتح شاشة تصحيح ملخص الشبكة عبر ShiftCtrlF3 (Windows) أو Shift⌘F3 (Mac).
بمجرد فتح شاشة التصحيح، اضغط على Shift1 مرارًا وتكرارًا للتنقل بين الألواح المتاحة. اللوحة الرابعة هي عرض تصحيح البث الذي يعرض معلومات مفيدة حول وقت التشغيل:
- إعدادات البث النشطة
- المناطق المحمّلة حاليًا (المُدخلة)
- سلوك وحالة البث
بمجرد تفعيلها، تظهر المناطق المظللة الملونة في واجهة المستخدم ثلاثية الأبعاد:
| اللون | الوصف |
|---|---|
| أقل من StreamingMinRadius | |
| أكبر من أو يساوي StreamingMinRadius وأقل من StreamingTargetRadius | |
| يساوي StreamingTargetRadius | |
| أكبر من StreamingTargetRadius |
