تقنيات والتحويل

*This content is translated using AI (Beta) and may contain errors. To view this page in English, click here.

تستعرض هذه الدليل عدة تقنيات لاستخدام بث الكائنات داخل اللعبة بكفاءة وفعالية. بينما لا يوجد حل "واحد يناسب الجميع" لتصميم لعبة متدفقة، فإن اتباع هذه الخطوات العامة سيوصلك إلى معظم الطريق.

خصائص البث

بمجرد تفعيل StreamingEnabled لكائن Workspace في الاستوديو، قم بتعيين خصائصه ذات الصلة إلى القيم الموصى بها التالية:

الخاصيةالتوصية
EnableSLIMAvatarsاستخدم Enabled لعرض شخصيات R15 كبدائل خفيفة الوزن ومتحركة عند الاقتضاء. راجع شخصيات SLIM لمزيد من المعلومات.
ModelStreamingBehaviorاستخدم Improved لتمكين البث الأكثر كفاءة لكائنات Models التي تحتوي على سلالات BasePart.
StreamingIntegrityModeاستخدم PauseOutsideLoadedArea لتحقيق توازن بين سلامة اللعب دون التوقف بشكل غير ضروري أو متكرر.
StreamingMinRadiusاستخدم القيمة الافتراضية 64 لتعظيم مدى قدرة المحرك على تقليل حجم اللعبة للأجهزة ذات الأداء المنخفض.
StreamingTargetRadiusاستخدم القيمة الافتراضية 1024 لتحقيق توازن جيد بين الرؤية للاعبين على الأجهزة ذات الأداء العالي و footprint ذاكرة معقولة.
StreamOutBehaviorاستخدم Opportunistic للسماح للعميل بجمع المحتوى بشكل عدواني، مما يقلل بشكل كبير من استخدام الذاكرة ويساعد في منع الأعطال الناتجة عن نفاد الذاكرة.

مستوى تفاصيل النموذج

يساعد Model.LevelOfDetail في ملء محتوى Model غير المتدفق بشبكات مركبة خفيفة الوزن أو بدائل، مما يجعل العالم يبدو مكتملًا بصريًا. تعتبر SLIM (نماذج تفاعلية خفيفة الوزن القابلة للتوسع) فعالة بشكل خاص، حيث غالبًا ما لا يستطيع اللاعبون تمييز شبكة SLIM عن الأصل المتدفق بالكامل.

للحصول على أفضل النتائج:

  • قم بتجميع الأجزاء التي ترتبط مكانيًا ومنطقيًا، على سبيل المثال جميع أجزاء السيارة.
  • قم بتعيين LevelOfDetail إلى SLIM على النماذج التي تحتوي على شبكات وأجزاء ثابتة. النماذج التي يتم تعديلها في وقت التشغيل أو تلعب الرسوم المتحركة غير مدعومة.
  • احتفظ بالامتداد المكاني لكل نموذج تحت ~64 وحدة مكعبة لزيادة احتمالية تدفق النموذج الفعلي بالكامل معًا. إذا كان للنموذج امتدادات كبيرة جدًا، قم بتقسيمه إلى نماذج أصغر قابلة للتعديل وتطبيق LevelOfDetail المناسب على كل منها.

هيكل النموذج

بجانب تعيين مستوى تفاصيل النموذج، فإن هيكل وإعدادات Models لديك لها تأثير كبير على مدى كفاءة البث. أثناء بناء أو تحويل لعبة موجودة:

  • استخدم نماذج ذرية للتجميع المنطقي — عندما يحتاج البرنامج النصي إلى الوصول إلى جميع الأجزاء داخل نموذج، قم بتعيين ModelStreamingMode إلى Atomic. هذا يسمح للبرامج النصية على جانب العميل بالوصول بأمان إلى الكائنات داخل النموذج دون استخدام مفرط لـ WaitForChild() (على الرغم من أن مثل هذه البرامج النصية لا تزال بحاجة إلى استخدام WaitForChild() للنموذج الذري بشكل عام).

  • قلل من النماذج الدائمةالنماذج الدائمة يتم تحميلها بعد الانضمام ولا تتدفق أبدًا، مما يشغل الذاكرة بشكل دائم. قم بتعيين ModelStreamingMode لنموذج إلى Persistent فقط إذا كان يجب أن يبقى متاحًا وقابلًا للوصول إلى البرامج النصية في جميع الأوقات.

  • قم بتفكيك نماذج الحاويات — نمط غير متدفق شائع هو نموذج Model ضخم يحتوي على العديد من الشخصيات غير القابلة للعب، أو العناصر، أو تجميعات مماثلة. تحت البث، تقلل نماذج الحاويات من كفاءة البث وليست مثالية لـ مستوى تفاصيل النموذج الذي يعمل بشكل أفضل مع الكائنات المجمعة عن كثب. قم بتفكيك نماذج الحاويات إلى نماذج أصغر تحتوي على أجزاء قريبة جسديًا أو مرتبطة منطقيًا.

  • قم بتسطيح الهياكل النمطية العميقة — إن وضع نموذج دائم داخل نموذج ذري يجبر النموذج الذري على التصرف كدائم. الهياكل المسطحة أسهل في الفهم تحت البث.

شخصيات SLIM

شخصيات المنصة خارج المنطقة المتدفقة حاليًا غير مرئية بشكل افتراضي، ولكن تمكين Workspace.EnableSLIMAvatars يعرض شخصيات R15 كبدائل خفيفة الوزن ومتحركة عند الاقتضاء. بشكل فعال، يقوم المحرك بـ:

  • عرض نسخة SLIM عندما يتم تدفق نموذج شخصية فعلي.
  • التبديل بين تمثيلات SLIM والتمثيلات عالية الدقة بناءً على الموارد المتاحة، حتى داخل دائرة البث.
  • تقليل سرعة الرسوم المتحركة SLIM بناءً على أهمية المشهد وعرض النطاق الترددي المتاح.

تدعم شخصيات SLIM شخصيات اللاعبين R15 مع جسم ورأس ديناميكي، وهيكل R15 قياسي أو متقدم، وإكسسوارات صلبة/مستويات. يتم استبعاد شخصيات R6، والشخصيات غير القابلة للعب، والشخصيات ذات النسب المخصصة. للحصول على القائمة الكاملة لتكوينات الشخصيات المدعومة والمستبعدة، وبيانات الأداء، ونصائح استكشاف الأخطاء وإصلاحها، راجع شخصيات SLIM.

أنماط البرمجة النصية

تتأثر أنماط البرمجة النصية التالية بشكل شائع بالبث. تعتمد الاستراتيجية الصحيحة على نية الكود، لذا تسرد كل نمط خيارات متعددة حيثما كان ذلك مناسبًا.

الفهرس المباشر إلى السلالات

يؤدي الفهرس إلى سلالات Workspace باستخدام عامل التشغيل . إلى إلقاء خطأ إذا لم يكن أي كائن في المسار متدفقًا حاليًا. ينطبق نفس الشيء على FindFirstChild(), FindFirstChildWhichIsA(), و FindFirstChildOfClass() التي تعيد nil إذا لم يتم تدفق الطفل.

بحث السلالة
local house1 = workspace:FindFirstChild("House1") -- nil إذا لم يتم تدفق "House1"
local door = workspace.House1.Door -- معطل إذا لم يتم تدفق "House1" أو "Door"

نمط مشابه هو الوصول إلى Humanoid أو سلالات الشخصيات الأخرى مباشرة داخل اتصال Player.CharacterAdded. تحت البث، يتم توصيل نموذج الشخصية بـ Workspace قبل أن يتم نسخ جميع سلالاته، لذا يفشل الفهرس المباشر.

سلالات الشخصية
local Players = game:GetService("Players")
local player = Players.LocalPlayer
player.CharacterAdded:Connect(function(character)
local humanoid = character.Humanoid
end)

إذا لم يتمكن البرنامج النصي من التقدم دون كائن، انتظر حتى يتوفر باستخدام WaitForChild():

بحث السلالة
local house1 = workspace:WaitForChild("House1")
local door = house1:WaitForChild("Door")

الكائنات المرسلة عن بُعد

إشارة RemoteEvent/RemoteFunction والكائن الذي تشير إليه يسافران بشكل مستقل، لذا يمكن أن تصل الإشارة إلى العميل قبل أن يكون الكائن موجودًا — أو قد لا يكون الكائن موجودًا على الإطلاق. تشمل سببان محتملان:

  • تحت البث، قد يكون هناك تأخير طفيف بين وقت إنشاء جزء/نموذج على الخادم ووقت نسخه إلى العملاء. بشكل فعال، قد لا يوجد جزء يتم الإشارة إليه بواسطة RemoteEvent/RemoteFunction بعد، حتى داخل منطقة متدفقة.

  • يتطلب إرسال مرجع جزء/نموذج من الخادم إلى العميل عبر RemoteEvent أو RemoteFunction أن يتم نسخ الكائن إلى العميل المستلم. إن إرسال مسار كائن كسلسلة له نفس المشكلة، حيث قد يحل المسار إلى موقع غير موجود على العميل:

    برنامج نصي للعميل
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
    remoteEvent.OnClientEvent:Connect(function(data)
    local checkpoint = data.checkpoint -- أخطاء إذا لم يتم تدفق "checkpoint"
    local level = workspace.Levels[data.levelPath] -- أخطاء إذا لم يتم تدفق المسار
    end)

إذا كان البرنامج النصي للعميل يحتاج إلى الكائن للتقدم، قم بتضمين WaitForChild() قبل استخدامه. لاحظ أن هذا يمكن أن ينتظر إلى أجل غير مسمى إذا لم يتم تدفق الكائن، لذا ضع في اعتبارك إضافة مهلة كمعامل ثانٍ لـ WaitForChild().

عدم تزامن العميل

يجب اعتبار عدم تزامن جانب العميل استثناءً، وليس نمط تصميم قياسي. يمكن أن يؤدي إدخال نسخ خاصة بالعميل أو إعادة توصيل الكائنات محليًا إلى إنشاء مشكلات خطيرة. قم بمراجعة الكود الخاص بك بحثًا عن الأماكن التي تعتمد على هذه الأنواع من التغييرات التي تستمر على العميل.

على سبيل المثال، يمكن أن يجعل إعادة توصيل كائن محليًا من ReplicatedStorage إلى Workspace ذلك الكائن مؤهلاً للتدفق. بالمثل، فإن استنساخ كائن محليًا (Instance:Clone()) من ReplicatedStorage إلى Workspace ينشئ نسخة خاصة بالعميل لم تعد جزءًا من خط أنابيب النسخ على الخادم ولن تتلقى تحديثات الخصائص من الكائن الأصلي المملوك للخادم.

ينطبق نفس المفهوم عند استدعاء Instance:Destroy() على كائن مملوك للخادم. هذا يزيل الكائن محليًا ولكن الخادم لا يزال يمتلكه، لذا سيتم تدفقه مرة أخرى بحالته الأصلية عندما يكون مؤهلاً.

البث الاستباقي

عندما يمكن توقع وجهة اللاعب التالية، قم بإجراء مكالمات على جانب الخادم إلى Player:RequestStreamAroundAsync() لتدفق المناطق العابرة للتحميل المؤقت، أو استخدم Player:AddReplicationFocus() على أساس محدود للمناطق التي يجب أن تبقى محملة حتى يتم الإفراج عنها صراحة.

على سبيل المثال، عندما يكون من المقرر أن يتم نقل شخصية اللاعب بواسطة تغيير CFrame إلى منزل لاعب آخر في موقع بعيد، يمكنك تحميل المنطقة المستهدفة مسبقًا لتقليل الظهور المفاجئ وتوفير انتقال أكثر سلاسة. يوضح البرنامج النصي التالي كيف يمكن إطلاق حدث عن بُعد من العميل إلى الخادم لنقل شخصية اللاعب باستخدام طريقة التحميل المسبق. إذا كانت طلب التحميل المسبق ناجحة عند عودة الدالة، يجب أن تكون الحد الأدنى من الدائرة حول الموقع المستهدف موجودة على العميل.

برنامج نصي للخادم - نقل شخصية اللاعب
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")
local function teleportPlayer(player, teleportTarget)
-- طلب البث حول الموقع المستهدف
player:RequestStreamAroundAsync(teleportTarget)
-- نقل الشخصية
local character = player.Character
if character and character.Parent then
local currentPivot = character:GetPivot()
character:PivotTo(currentPivot * CFrame.new(teleportTarget))
end
end
-- استدعاء دالة النقل عندما يطلق العميل الحدث عن بُعد
teleportEvent.OnServerEvent:Connect(teleportPlayer)

قراءات خصائص الكائن

بمجرد أن يتدفق كائن، لم تعد تحديثات خصائصه تُنسخ إلى ذلك العميل. تستمر قراءة الخصائص مثل BasePart.Position في النجاح ولكنها تعيد القيمة الأخيرة المنسوخة والتي يمكن أن تكون قديمة بشكل تعسفي.

local Players = game:GetService("Players")
local player = Players.LocalPlayer
-- قد تكون الموضع قديمًا إذا تم تدفق "target"
local dist = (target.Position - player.Character.HumanoidRootPart.Position).Magnitude

قم بنقل المنطق إلى الخادم، حيث ترى البرامج النصية على جانب الخادم جميع الكائنات في جميع الأوقات. هذه هي الخيار الأكثر موثوقية بشكل عام لفحوصات المسافة وغيرها من المنطق الحساس للموقع.

الانتظار على المسار الحرج

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

قم بنقل منطق شاشة التحميل بحيث لا يعتمد على وجود كائن مكاني محدد، على سبيل المثال عن طريق الإشارة إلى الجاهزية بمجرد أن تظهر الشخصية ويتم تدفق المنطقة المحيطة المباشرة.

معالجة تغيير الإشارة

تقوم الإشارات مثل Instance.ChildAdded/Instance.ChildRemoved وإشارات CollectionService مثل GetInstanceAddedSignal() أو GetInstanceRemovedSignal() أيضًا بإطلاق عند التدفق في/خارج، غير قابلة للتمييز عن ظهور/إزالة حقيقية. لا يمكن للبرامج النصية المستقبلة أن تخبر الفرق من الإشارة وحدها، لذا يجب تحديث المنطق الذي يفترض أن الإشارة تتوافق مع حدث "حقيقي".

قم بمراجعة البرامج النصية بحثًا عن أي مستمعي إشارة قد تتعطل أو تتغير بشكل كبير عند تشغيلها بواسطة التدفق في و/أو التدفق خارج. على سبيل المثال، إذا كنت تشغل صوتًا أو تأثيرات بصرية عند ظهور شخصية غير قابلة للعب في العالم، قم بتعيين كل عدو سمة مثل Spawned عند الظهور الأول، وتجاوز إعادة تشغيل نفس الصوت/التأثيرات في تدفقات العدو المستقبلية.

تتبع السمة
local CollectionService = game:GetService("CollectionService")
local TAG_NAME = "عدو"
CollectionService:GetInstanceAddedSignal(TAG_NAME):Connect(function(enemy)
if not enemy:GetAttribute("Spawned") then
-- تعيين سمة "Spawned" على العدو للظهور الأول
enemy:SetAttribute("Spawned", true)
-- تشغيل الصوت/التأثيرات البصرية لهذا الظهور الأول
playSpawnEffects(enemy)
end
end)

التكرار على المجموعات

تقوم عمليات التكرار على المجموعات على جانب العميل مثل Instance:GetChildren() و Instance:GetDescendants() بإرجاع فقط مجموعة السلالات المتدفقة. ينطبق هذا حتى عندما يتم نسخ الوالد نفسه دائمًا، مثل Folder مباشرة تحت Workspace التي تتدفق سلالاتها المكانيًا.

local Players = game:GetService("Players")
local player = Players.LocalPlayer
-- المجلد "المنازل" يتم نسخه دائمًا ولكن أطفاله تتدفق في وخارج
-- قد تفوت هذه الحلقة المنازل التي لم يتم تدفقها حاليًا
for _, home in workspace.Homes:GetChildren() do
if home.Settings.Owner.Value == player.Name then
return home
end
end

إذا كانت التعداد الكامل مطلوبًا، قم بإجراء الفحص على الخادم ومرر النتيجة إلى اللاعب من خلال RemoteEvent إذا لزم الأمر.

الاستعلامات المكانية

تقوم الاستعلامات المكانية على جانب العميل مثل WorldRoot:Raycast(), WorldRoot:GetPartBoundsInBox(), و Model:GetBoundingBox() بعكس المحتوى المتدفق فقط. سواء كانت هذه مشكلة تعتمد على ما يتم استخدام الاستعلام من أجله.

استخدم الخادم للاستعلامات التي يجب أن تعكس العالم الكامل، على سبيل المثال، raycast الذي يتحقق مما إذا كان لدى اللاعب خط رؤية إلى هدف بعيد.

أنماط أخرى

قد تنطبق الأنماط التالية أيضًا ويجب النظر فيها بعناية:

  • يتوقف Sound أو AudioPlayer المتصل بكائن ثلاثي الأبعاد عندما يتدفق ذلك الكائن خارج. بالنسبة للصوت المحيطي الذي يجب أن يستمر بغض النظر عن البث، قم بتوصيل المرسل إلى نموذج دائم أو إلى حاوية غير متدفقة.

  • تتوقف كائنات واجهة المستخدم داخل اللعبة مثل BillboardGui أو SurfaceGui بالإضافة إلى التأثيرات البصرية مثل Beams أو Highlights التي يتدفق منها أو تعلقها ببساطة عن العرض. قد يكون هذا هو السلوك المقصود، ولكن يجب عليك التحقق منه.

  • لا تعمل أحداث BasePart.Touched، و ProximityPrompts، و DragDetectors، و ClickDetectors للاعبين الذين لا يمتلك عميلهم الجزء/النموذج المرتبط متدفقًا. إذا كان يجب أن يكون التفاعل ممكنًا من أي مدى، يحتاج النموذج إلى أن يكون دائمًا أو يحتاج التفاعل إلى آلية مختلفة.

  • بالنسبة لـ PathfindingService والتخطيط على جانب العميل، يرى المخطط فقط الهندسة المتدفقة على العميل وقد يمر عبر عقبات موجودة على الخادم. للحصول على استراتيجيات، راجع التخطيط - الاستراتيجيات للاستراتيجيات.

ظروف اختبار واقعية

بمجرد تحديث البرامج النصية، اختبر اللعبة بدقة. غالبًا ما تظهر أخطاء البث فقط عند حواف المنطقة المتدفقة أو أثناء الانتقالات، لذا فإن الاختبار بالقرب من نقطة الظهور أو عند دائرة الهدف ليس كافيًا.

  • اختبر مع تعيين Workspace.StreamingTargetRadius إلى قيمته الدنيا (64). تظهر بعض أخطاء البث فقط عندما تكون المنطقة المتدفقة صغيرة.

  • قم باللعب عبر أنماط التنقل الكاملة للعبة، وانتقل بين مناطق بعيدة، وزيارة المناطق بعد مغادرتها. هذه هي الحالات التي تمارس التدفق في والتدفق خارج أكثر.

  • استخدم تراكب تصحيح البث لمراقبة إعدادات البث النشطة، والمناطق المحملة حاليًا، وحالة البث في وقت التشغيل.

  • راقب نافذة الإخراج ووحدة التحكم للمطورين بحثًا عن الأخطاء، حيث تنتج العديد من أنماط البرمجة النصية أخطاء بدلاً من سلوك غير صحيح صامت. انتبه بشكل خاص للأخطاء من الشكل attempt to index nil with ... والتي تشير غالبًا إلى وجود مكالمة مفقودة لـ WaitForChild().

  • قم بتجهيز وتفعيل Tools، وأطلق الأسلحة، وابدأ تفاعلات اللعبة المختلفة.

مهارة تحويل البث بالذكاء الاصطناعي

لمساعدتك في تحويل البث وتحسينه، تقدم Roblox مهارة تحويل البث بالذكاء الاصطناعي، المتاحة من خادم MCP الاستوديو. تقوم المهارة بتقييم لعبتك تلقائيًا، وتطبيق التكوينات الموصى بها، وتنظيف مشكلات التوافق، بما في ذلك:


لاستخدام مهارة الذكاء الاصطناعي في لعبتك:

  1. هام
    قم بعمل نسخة احتياطية من لعبتك. يمكن أن تكون عملية التحويل معقدة، لذا يجب عليك دائمًا حفظ نسخة احتياطية (ملف ⟩ نشر إلى Roblox As) قبل تشغيل المهارة.

  2. يمكنك تشغيل هذه المهارة باستخدام أي LLM تفضله من خلال بروتوكول سياق النموذج (MCP) في الاستوديو. يُوصى باستخدام نماذج الذكاء الاصطناعي عالية الجودة ذات نوافذ سياقية كبيرة؛ في Claude Opus، تستغرق عملية التحويل النموذجية من 20 إلى 30 دقيقة وتستخدم حوالي 200,000 توكن من السياق.

    1. افتح لعبتك في الاستوديو.
    2. قم بتنزيل المهارة، وفي عميل الذكاء الاصطناعي الخاص بك، افتح المجلد الذي تم فك ضغطه (roblox-streaming-conversion) كمشروع حالي.
    3. قم بتشغيل المهارة باستخدام /rbx-convert-to-streaming.
    4. كما هو الحال مع أي مخرجات ذكاء اصطناعي، تحقق من النتائج واختبر لعبتك بشكل مكثف تحت ظروف اختبار واقعية.
©2026 شركة Roblox Corporation. تُعد منصّة Roblox، وشعار Roblox وشعار "توسيع حدود المخيلة"، من ضمن علاماتنا التجارية المسجّلة وغير المسجّلة في الولايات المتحدة وبلدان أخرى.