العودة إلى المدونة

كيفية احتراف Asset Stripping في Unreal Engine Dedicated Server (خطوة بخطوة)

نُشر في 17 مارس 2026
كيفية احتراف Asset Stripping في Unreal Engine Dedicated Server (خطوة بخطوة)

تقوم بتشغيل Unreal Engine dedicated server الذي قمت بتجميعه للتو، متوقعاً عملية headless خفيفة. تسحب memory profile، وتجد المفاجأة: الآلاف من كائنات UMaterial و UTexture و USoundWave تشغل RAM الخادم.

تنص الوثائق الرسمية على أن خادم headless لا يقوم بعمل rendering للمرئيات. إذاً لماذا يكتنز خادمك ميجابايتات من بيانات textures؟

يدرك كل مطور indie اللحظة التي تبدأ فيها تكاليف الاستضافة بتهديد ميزانية المشروع. عندما لا يستطيع الخادم استضافة سوى 10 نسخ من لعبتك بدلاً من 50 بسبب memory bloat، فإن بنية backend الخاصة بك في خطر.

في هذا التعمق التقني، سنقوم بتحليل كيفية عمل unreal engine dedicated server asset stripping فعلياً، ولماذا تظل ghost assets في الذاكرة، وكيف يمكنك تصميم C++ و Blueprints للقضاء عليها تماماً.

تشريح "Ghost Asset" على Dedicated Server

لحل المشكلة، يجب أولاً فهم ما تفعله Unreal Automation Tool (UAT) عند عمل cook لهدف Server.

يقوم Unreal Engine بفصل الأصول إلى جزئين:

  1. UObject Wrapper: البيانات الوصفية (metadata)، الخصائص، وبيانات reflection.
  2. Bulk Data: البيانات الثقيلة الفعلية (بيانات البكسل المضغوطة DXT للـ textures، و vertex buffers للـ meshes، وبيانات PCM للصوت).

عند عمل cook لخادم dedicated server، ينجح الـ cooker في عمل stripping لـ bulk data. تختفي بيانات rendering. ومع ذلك، يظل UObject wrapper قائماً.

إذا كان Blueprint Class Default Object (CDO) يحتوي على hard reference لـ UTexture2D ، فيجب على الخادم إنشاء كائن UTexture2D لإرضاء نظام reflection ومنع الانهيارات. حتى لو تم حذف bulk data وأصبح الـ texture يستهلك 1KB بدلاً من 10MB، فإن عبء إنشاء 50,000 من هذه الكائنات يؤدي إلى memory bloat كبير وضغط على Garbage Collection.

هل يتبع الصوت والـ Particles نفس المنطق؟

نعم. إذا كان هناك hard reference لـ USoundCue أو UNiagaraSystem ، فسيقوم الخادم بتحميل الكائن. يتم حذف بيانات PCM الثقيلة، لكن الكائن يظل موجوداً. في أنظمة الجسيمات (particles)، قد يكون هذا خطيراً؛ إذا كانت تحتوي على منطق CPU، فقد يقوم الخادم بعمل tick لهذا المنطق، مستهلكاً موارد المعالج.

الخطوة 1: Profiling لـ Memory Bloat في الخادم

لا يمكنك تحسين ما لا يمكنك قياسه. قم بتشغيل الخادم مع الوسائط التالية:

-LLM -LLMCSV -memoryprofiler

في وحدة تحكم الخادم، نفذ: memreport -full. ابحث عن Obj List في التقرير الناتج لترى حجم الذاكرة الذي تستهلكه الكائنات.

الخطوة 2: قطع Hard References باستخدام Soft Pointers

السبب الرئيسي لـ ghost assets هو hard references. في C++، استخدم TSoftObjectPtr. تخزن soft references مسار الأصل فقط، ولا يتم تحميل الكائن في الذاكرة إلا عند استدعاء LoadSynchronous() (والذي يجب أن يتم على العميل فقط).

الأفضل: Soft Reference (الخادم يبقى نظيفاً)

UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "UI")
TSoftObjectPtr<UTexture2D> HeroPortraitSoft;

الخطوة 3: فرض NeedsLoadForServer

يمكنك إخبار نظام التعبئة بتجاهل المكونات المرئية تماماً على الخادم عن طريق عمل override لدالة NeedsLoadForServer وإرجاع false.

الخطوة 4: Stripping للصوت والجسيمات عبر الإعدادات

في ملف DefaultEngine.ini ، يمكنك استبعاد مجلدات كاملة من الـ cook باستخدام +DirectoriesToNeverCook. كما يمكنك تعطيل محرك الصوت تماماً في ملف *.Target.cs الخاص بالخادم عبر bDisableAudio = true;.

أفضل الممارسات لتحسين ذاكرة Dedicated Server

  1. فصل Collision Meshes عن Visual Meshes: استخدم UStaticMesh مبسط وغير مرئي للخادم.
  2. تدقيق Construction Scripts: استخدم Switch Has Authority لضمان تخطي الخادم للمرئيات.
  3. عزل Data Assets: افصل بيانات الإحصائيات عن البيانات المرئية.
  4. أتمتة Profiling في CI/CD: تحقق من بصمة الذاكرة مع كل build.

توسيع Backend المحسن الخاص بك

تقليل بصمة الخادم من 800MB إلى 180MB هو انتصار تقني كبير، مما يسمح لك باستضافة 4-5 أضعاف النسخ على نفس العتاد وتقليل تكاليف AWS أو Google Cloud.

بدلاً من قضاء أشهر في بناء بنية التنسيق (orchestration) الخاصة بك، جرب horizOn. ارفع الـ build الخاص بك، وسيتولى horizOn إدارة الأسطول العالمي و auto-scaling.

خاتمة

يعتمد Asset stripping في Unreal Engine بشكل كبير على بنيتك المعمارية. باستخدام soft pointers وفصل البيانات المرئية عن منطق اللعب، ستحقق الأداء العالي الذي تتطلبه ألعاب multiplayer.

هل أنت جاهز للتوسع؟ جرب horizOn مجاناً أو راجع وثائق API.


المصدر: Stripping asset on dedicated server