إلى الأمام العنوان الأصلي: أرى إطار الوكيل للجيل القادم في Project89
لننتقل مباشرة إلى النقطة، @project_89يعتمد نهجًا جديدًا تمامًا في تصميم إطار الوكيل. إنه إطار وكيل عالي الأداء خصيصًا لتطوير الألعاب. بالمقارنة مع إطارات الوكيل المستخدمة حاليًا ، فإنه أكثر تجزئة ويوفر أداءً أفضل.
استغرق كتابة هذه المقالة وقتًا طويلاً، حاولت أن أجعل الجميع يفهم نوع الترقيات المعمارية التي قام بها هذا الإطار مقارنة بالإطار الوكيل التقليدي. لقد تمت مراجعتها عدة مرات قبل هذا الإصدار، ولكن لا تزال هناك بعض الأجزاء في المقالة مربكة للغاية. نظرًا لصعوبات تقنية، لم يتسن لي تعميمها بشكل أوسع. إذا كان لديك أي اقتراحات لتحسين المقالة، يرجى ترك تعليقاتك.
قبل العمل على المشروع 89، قام المؤسس بتطوير هذا المشروع: https://github.com/Oneirocom/Magick، والذي يعد أيضًا برنامج برمجة مدعومًا بالذكاء الاصطناعي. بالإضافة إلى ذلك، يتم تصنيف شو كأرابع أفضل مطور لهذا المشروع. يمكنك أيضًا رؤية هذا المشروع في محفظة شو.



الجانب العلوي الأيسر: مؤسس project89؛ الجانب السفلي الأيمن: 'lalaune' هو شو من ai16z
اليوم سنقدم بشكل أساسي إطار الوكيل عالي الأداء في المشروع89:
https://github.com/project-89/argOS
الألعاب التي تستخدم حاليًا هندسة البرمجيات المعمارية ECS تشمل:
ألعاب البلوكشين: Mud، Dojo
الألعاب التقليدية: أوفرواتش، نجم المواطن، الخ.
علاوة على ذلك، تتطور محركات الألعاب الرئيسية نحو تركيبة ECS، مثل Unity.
Entity
• مجرد معرف (رقم أو سلسلة نصية)، لا يحتوي على بيانات أو منطق.
يمكنك تركيب مكونات مختلفة لإعطائه خصائص أو قدرات مختلفة حسب الحاجة.
المكون
• يُستخدم لتخزين بيانات محددة أو حالة كيان.
النظام
• مسؤول عن تنفيذ المنطق المتعلق ببعض المكونات.
لنستخدم مثالًا محددًا لإجراء الوكيل لفهم هذا النظام:
في ArgOS ، يُعتبر كل وكيل ككيان يمكنه تسجيل مكونات مختلفة. على سبيل المثال ، في الصورة أدناه ، يحتوي وكيلنا على أربعة مكونات التالية:
مكون الوكيل: يخزن بشكل رئيسي المعلومات الأساسية مثل اسم الوكيل واسم النموذج وما إلى ذلك.
مكون الإدراك: يُستخدم بشكل رئيسي لتخزين البيانات الخارجية الملموسة
عنصر الذاكرة: يُستخدم بشكل رئيسي لتخزين بيانات الذاكرة لكيان الوكيل، وأشياء مشابهة تمت من قبل، إلخ.
مكون العمل: يخزن بشكل أساسي بيانات العمل للتنفيذ
سير عمل النظام:

ومن الواضح أن في project89 هو عالم مليء بأنواع مختلفة من الوكلاء. على سبيل المثال، بعض الوكلاء ليس لديهم فقط القدرات الأساسية أعلاه ولكن لديهم أيضًا القدرة على وضع الخطط.
ثم سيكون كما هو مبين في الصورة أدناه:

ويقسم ArgOS System إلى "ثلاثة مستويات" (ConsciousnessLevel):
يتضمن نظام الغرفة، نظام الإدراك، نظام الخبرة، نظام التفكير، نظام العمل، نظام التنظيف- تكون تردد التحديث عادةً أعلى (مثل كل ١٠ ثوانٍ).- معالجة أقرب إلى مستوى "في الوقت الحقيقي" أو "الوعي" ، مثل الإدراك البيئي ، والتفكير في الوقت الحقيقي ، وتنفيذ الإجراءات ، إلخ.2) النظام اللاواعي (SUBCONSCIOUS)
نظام التخطيط للأهداف، نظام التخطيط- تحديث التردد منخفض نسبيا (على سبيل المثال كل 25 ثانية).- يتعامل مع منطق "التفكير" مثل التحقق/إنشاء الأهداف والخطط بشكل دوري.3) النظام اللاوعي (UNCONSCIOUS)
لم يتم تمكينه بعد- تكون تردد التحديث أبطأ (مثل أكثر من 50 ثانية)لذلك، في آرجوس، يتم تقسيم الأنظمة المختلفة وفقًا لمستوى الوعي لتحديد مدى تنفيذ هذا النظام بشكل متكرر.
لماذا تم تصميمه بهذه الطريقة؟
نظرًا لتعقيد العلاقة بين مختلف الأنظمة في أرجوس، كما هو موضح أدناه:

في النهاية، يتم توفير بيانات "الإدراك الحالي" لنظام الخبرة التالي، ونظام التفكير، وما إلى ذلك.
LLM أو منطق القاعدة (extractExperiences) يتم استدعاؤه لتحديد تجارب جديدة وتخزينها في مكون الذاكرة.
التكرار، والتصفية، والتحقق من التجارب، مع تشغيل "تجربة" الأحداث لأنظمة أخرى أو المستمعين الخارجيين من خلال eventBus.
استخراج الحالة الحالية من المكونات مثل الذاكرة والإدراك ، وتوليد "نتيجة الفكر" من خلال توليد الفكر (... ) ومنطق LLM / القاعدة.
بناء على نتيجة الفكرة، قد:
• تحديث الأفكار في الذاكرة (تاريخ التفكير).
• تحفيز إجراء جديد (وضعه في Action.pendingAction[eid]).
• تغيير مظهر الوكيل الخارجي (التعبير، الوضع، إلخ) وتوليد المحفزات ذات الصلة لتمكين الكيانات الأخرى من "رؤية" التغيير.
بعد التنفيذ، اكتب النتيجة مرة أخرى في Action.lastActionResult واعلم الغرفة أو الكيانات الأخرى.
تنتج هذه أيضًا محفزًا إدراكيًا (تحفيز إدراكي) بحيث يمكن للأنظمة التالية "معرفة" أن الإجراء قد تم إنجازه أو يمكن دمجه في الذاكرة.
عندما يتطلب هدف جديد أو تعديل هدف ، قم بإنشاء وكتابة Goal.current[eid] عبر generateGoals(…).
في نفس الوقت، يتم تحديث الهدف الجاري التقدم فيه (in_progress). إذا تم تحقيق شروط الإكمال أو الفشل، يتم تغيير الحالة، ويتم إرسال إشارة الإكمال/الفشل إلى الخطة المقابلة.
يقوم نظام التخطيط بإنشاء أو تحديث الخطة (خطة التنفيذ) لـ "الهدف الحالي" (الهدف الحالي [eid]).
إذا تم اكتشاف أن بعض الأهداف ليس لديها خطط نشطة مقابلة، فتولد خريطة طريق تنفيذية تحتوي على عدة خطوات من خلال generatePlan(…) وتُكتب إلى Plan.plans[eid].
عند اكتمال الهدف أو فشله، سيتم تحديث حالة الخطة المرتبطة به وسيتم إنشاء تحفيز معرفي مقابل.
• الحصول على قائمة السكان في الغرفة (السكان) وتوليد حوافز "المظهر" لكل وكيل لتمكين الكيانات الأخرى من "رؤية" مظهره أو أفعاله.
• إنشاء وربط حالة بيئة الغرفة المحفزة (مثل معلومات مناسبة حول "جو الغرفة").
تأكد من أنه عندما يكون الوكيل في بيئة مكانية معينة، يمكن للكيانات الأخرى التي تحس بالمكان تحس بالتغيرات في مظهره.
إعداد المشهد: هناك وكيل (EID=1) في العالم، الذي يكون في حالة "نشط" ويكون في غرفة (EID=100).
ظهرت ملكية جديدة "سيف سحري" في هذه الغرفة، وتم إنشاء الحافز المقابل.
يقوم ThinkingSystem بكتابة هذا الإجراء إلى Action.pendingAction [1] .
إذا كان هناك تغيير في المظهر (على سبيل المثال "وجه بتعبير فضولي"), يتم تحديث المظهر ويتم إنشاء تحفيز بصري.
نظام العمليات يرى عملية معلقة[1] = {أداة: "التقاط العنصر", المعلمات: ...}.
قم بتنفيذ منطق "الامساك" من خلال runtime.getActionManager().executeAction("pickUpItem", 1, { itemName: "MagicSword" }, runtime). احصل على النتيجة: { success: true, message: "لقد التقطت سيف السحر" }, وقم بتحديث إلى Action.lastActionResult[1]، وقم بتشغيل حدث "العمل" ليتم بثه في الغرفة (100).
في نفس الوقت ، يتم إنشاء محفز معرفي (النوع = "نتيجة إجراء") ، مكتوب في الذاكرة أو يتم التقاطه بواسطة ThinkingSystem في الدور التالي.
تقوم RoomSystem بتحديث قائمة المحتلين والكيانات المرئية في الغرفة (100) (في كل إطار أو جولة).
إذا تغير مظهر العامل (1) (على سبيل المثال ، Appearance.currentAction = "حمل السيف") ، فقم بإنشاء حافز مرئي "مظهر" جديد للسماح ل Agent2 و Agent3 الآخرين في نفس الغرفة بمعرفة أن "agent1 التقط السيف".

• العميل / ملف تعريف اللاعب / ملف تعريف NPC، إلخ.
• يُستخدم لتحديد هويات الكيانات بشكل فريد، وتخزين الأدوار الأساسية أو معلومات الوحدة، وعادة ما يتعين الاحتفاظ بها في قاعدة البيانات.
• العمل، الهدف، الخطة، حالة المعالجة، إلخ.
• يمثل ما تحاول الكيان فعله حالياً أو ما هي أهدافه، بالإضافة إلى حالته استجابة للأوامر الخارجية والتفكير الداخلي.
• يحتوي على الإجراءات المعلقة، والأهداف قيد التقدم، والخطط، والأفكار أو المهام في الطابور، إلخ.
• عادةً حالات متوسطة / قصيرة الأجل، العديد منها يتغير بشكل ديناميكي عبر جولات اللعب أو دورات الأعمال.
• إذا كنت ترغب في الاستمرار في التشغيل بعد نقطة التوقف ، فقد تود تخزين البيانات في فترات منتظمة.
• الإدراك، الذاكرة، المحفز، التجربة، الخ.
• يسجل المعلومات الخارجية (المحفزات) التي يتم تصورها من قبل الكيان، والتجارب المعدلة فيه بعد الإدراك (التجارب).
يمكن للذاكرة في كثير من الأحيان تجميع كميات كبيرة من البيانات، مثل سجلات المحادثة وتاريخ الأحداث وما إلى ذلك؛ وعادة ما يكون الاستمرارية مطلوبة.
• الإدراك قد يكون معلومات فورية أو مؤقتة، وتكون صالحة في الغالب على المدى القصير. يمكنك أن تقرر ما إذا كنت ترغب في كتابتها إلى قاعدة البيانات وفقًا لاحتياجاتك (على سبيل المثال، يتم تخزين الأحداث الهامة للإدراك فقط).
• يمثل معلومات مثل الغرف والبيئات والمواقع وحاويات الكائنات، إلخ.
•Room.id, يجب غالبًا الاحتفاظ بالمجالات مثل OccupiesRoom وEnvironment وغيرها، مثل وصف صفحة الغرفة الرئيسية وهيكل الخريطة، إلخ.
• يمكن كتابة تغيير المكونات (مثل كيان يتحرك بين الغرف) بناءً على الأحداث أو بشكل دوري.
• سجل الأجزاء الخارجية 'المرئية' أو 'التفاعلية' للكيان، مثل الصورة الرمزية، والوضعية، وتعبير الوجه، وشبكة العلاقات الاجتماعية مع الكيانات الأخرى، إلخ.
• قد يتم معالجة بعض الأجزاء فقط في الذاكرة (التمثيل في الوقت الحقيقي)، بينما يمكن الاحتفاظ بأجزاء أخرى (مثل العلاقات الاجتماعية الرئيسية).
6.مكونات الأدوات والصيانة (التنظيف، المعلومات التصحيحية، بيانات البروفايل، إلخ.)
• يُستخدم لوضع علامة على الكيانات التي يجب إعادة تدويرها (التنظيف)، أو تسجيل معلومات التصحيح (معلومات الإصلاح) للاستخدام في المراقبة والتحليل.
• عادةً ما يوجد فقط في الذاكرة ونادراً ما يتم مزامنته مع قاعدة البيانات إلا إذا كان ذلك مطلوبًا للتسجيل أو التدقيق.

الجانب الأيسر: الأنظمة (نظام الإدراك ، نظام الخبرة ، نظام التفكير ، إلخ):
• يتم جدولة كل نظام للتنفيذ بواسطة SimulationRuntime في حلقة ECS، باستعلام ومعالجة الكيانات التي يهتم بها (من خلال شروط المكون).
• عند تنفيذ الخطط، تحتاج إلى التفاعل مع المديرين، على سبيل المثال:
• توفير وظائف على مستوى النظام، التي في الأساس لا تقوم بتنفيذ الـ "دافع" بنشاط للمنطق، ولكنها تستدعى بواسطة الأنظمة أو وقت التشغيل.
• أمثلة نموذجية:
• يتم إنشاء المديرين أيضًا خلال مرحلة البناء ويتم تمريرهم إلى كل نظام للاستخدام.
في الختام:
سيقوم كل نظام بقراءة وكتابة البيانات أو استدعاء الخدمات من خلال المدير المقابل عند الحاجة ، وسيقوم Runtime بجدولة الدورة الحياتية وسلوك جميع الأنظمة والمديرين على مستوى أعلى بشكل موحد.
• على سبيل المثال ، قراءة دفعة من سجلات الوكيل وإدخالها في عالم ECS ، وتهيئة المكونات مثل الوكيل والذاكرة والهدف وغيرها لهم.
• يقوم النظام بأشياء في كل إطار (أو جولة): يجمع نظام الإدراك "التصورات" ويكتبها في مكون الإدراك (بشكل رئيسي قصيرة الأجل من المكتبة).
يكتب ExperienceSystem "تجربة معرفية" الجديدة في Memory.experiences. إذا كانت تجربة مفتاحية ، فقد يطلب أيضًا من StateManager التخزين الفوري ، أو يضع علامة عليها بـ "needsPersistence" للكتابة الدفعية في وقت لاحق.
يتخذ نظام الفكر / نظام العمل / نظام تخطيط الأهداف وغيرها من القرارات استنادًا إلى محتوى المكون وتحديث الحقول في ECS.
إذا مرت بعض المكونات (مثل Goal.current) بتغييرات رئيسية وتتطلب الاستمرارية (مثل هدف جديد طويل الأجل)، فأعلم StateManager بكتابة هذا الحقل إلى قاعدة البيانات من خلال الاستماع إلى المكون أو أحداث النظام.
• يمكنك استدعاء الواجهات مثل PersistenceManager.storeComponentData(eid, "Goal") لإسقاط المكتبة في نقاط مفتاحية معينة في النظام (مثل عند تحديث الخطة المستهدفة أو عند حدوث حدث مهم على الوكيل).
• يمكنك أيضًا لدى StateManager مسح المكونات أو الكيانات بوسم "needsPersistence" في CleanupSystem أو المؤقت، وكتابتها مرة واحدة إلى قاعدة البيانات.
• بالإضافة إلى ذلك، يمكن أيضًا أرشفة وتخزين بيانات السجل أو التدقيق (مثل سجل الإجراءات، سجل الأفكار) هنا.
• عند إيقاف خادم أو عملية، استخدم StateManager.saveAll() لكتابة البيانات غير المكتوبة إلى قاعدة البيانات بشكل موحد لضمان أن يمكن استعادة حالة ECS في المرة القادمة التي يتم فيها تحميلها.
• بالنسبة لبعض السيناريوهات المستقلة / غير المتصلة بالإنترنت، يمكن أيضًا تشغيل الأرشيف يدويًا.
في نفس الوقت، قم بتحميل معلومات الغرفة من جدول "الغرف" وإنشاء كيان غرفة.
العمليات الزمنية: PerceptionSystem يكتشف حدوث الحدث 'ظهور سيف سحري' في غرفة معينة ويكتب Perception.currentStimuli [eid]. ExperienceSystem يحول المحفزات إلى تجربة ويسندها إلى Memory.experiences [eid]. يحدد ThinkingSystem الإجراء التالي بناءً على الذاكرة والهدف ومعلومات أخرى ويولد Action.pendingAction [eid]. بعد تنفيذ ActionSystem الإجراء ، يكتب النتيجة إلى الذاكرة أو Action.lastActionResult. إذا كان هذا حدثًا رئيسيًا في القصة ، سيتم وضع علامة على الجزء الأحدث من Memory.experiences [eid] على أنه يحتاج إلى الاستمرار. بعد فترة من الزمن ، يجد StateManager أن Memory.experiences [eid] يحتوي على 'needsPersistence' ويكتبه إلى قاعدة البيانات (INSERT INTO memory_experiences ...).
إيقاف أو حفظ نقطة التفتيش: باستنادًا إلى جدولة ECS أو النظام ، يتم استدعاء StateManager.saveAll () عندما يتم إيقاف تشغيل الخادم لكتابة آخر حالة لحقول المكونات الرئيسية (العميل ، الذاكرة ، الهدف ، إلخ.) ما زالت في الذاكرة إلى قاعدة البيانات. يمكن تحميل حالة عالم ECS المخزنة في قاعدة البيانات واستعادتها عند إعادة التشغيل المقبلة.
• تصنيف المكونات ليس فقط يسهل إدارة البيانات الكيان في المشروع، ولكنه يساعدنا أيضًا في التحكم في حدود البيانات بين "يتطلب الاستمرارية" و "الموجودة فقط في الذاكرة".
• يتم التفاعل مع قاعدة البيانات عادةً عن طريق مدير متخصص (مثل StateManager)، وتعمل الأنظمة من خلاله عندما تحتاج إلى قراءة وكتابة في قاعدة البيانات، مما يجنب الكتابة المباشرة للعبارات SQL أو عبارات منخفضة المستوى مماثلة في النظام.
بهذه الطريقة ، يمكنك الاستمتاع في نفس الوقت بالكفاءة المنطقية والمرونة لـ ECS ، بالإضافة إلى مزايا الاستمرارية واستئناف النقاط وتحليل البيانات التحصيلية التي يوفرها قاعدة البيانات.

تبرز من الهندسة المعمارية بأكملها:

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





