كيفية إجراء تحديث تلقائي لعميل الألعاب عبر الإنترنت

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

خوارزمية تحديث اللعبة


  • التحقق من الإصدار للتحديث.
  • قم بتنزيل قائمة ملفات الإصدار الحالي.
  • تنزيل الملفات الجديدة أو المتغيرة إلى مجلد مؤقت.
  • تثبيت التحديث - إحضار ملفات العميل المثبت وفقًا للقائمة.
  • بدء عميل محدث.

فحص الإصدار


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

كما ترى ، يتم تمرير رقم الإصدار بواسطة المعلمة - وهذا يسمح لك بتحديث اللعبة إلى أي إصدار متوفر على الخادم ، وحتى خفضه. إذا لم يتم تمرير المعلمة ، فستطلب الأداة نفسها رقم الإصدار الحالي من الخادم. رقم الإصدار هو عدد صحيح فقط ، يمكن أن يكون مخطط الترقيم أيًا ، على سبيل المثال ، يتوافق الإصدار 1.12 الخاص بي مع الرقم 1120.

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

تنزيل قائمة الملفات


مع معرفة رقم الإصدار ، تقوم أداة التحديث بتنزيل قائمة الملفات على: [base_ur]>/[]/filelist
هذه مجرد قائمة بملفات CSV مع المجموع الاختباري ، بالإضافة إلى الأحجام المضغوطة وغير المضغوطة ، يبدو كل سطر كالتالي:
18*Priest.tga;1053151921D9;91719;107372
هنا "18 *" يعني أن 18 حرفًا في اسم الملف هي نفس الملف السابق. نظرًا لأن الملفات عادةً ما تكون مرتبة أبجديًا ، ويمكن أن تكون المسارات طويلة - وهذا يحفظ بشكل كبير حجم ملف القائمة. بالنسبة لخادم الويب الذي لم يتم تمكين الضغط عليه ، فإن هذا يعني أن الملف سيتم تنزيله بشكل أسرع وسيبدأ التحديث في وقت أبكر.

تنزيل الملفات الجديدة أو المتغيرة


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



موضوع خاص هو عرض التقدم. حتى تتم معالجة القائمة بالكامل ، لا نعرف بالضبط عدد الملفات التي يجب تنزيلها وحجمها. ومع ذلك ، بمجرد تحميل الملف الأول ، يمكننا بالفعل عرض بعض المعلومات. في الواقع ، يعرض التقدم قائمة التنزيل: عدد التنزيلات والمقدار الذي تم تنزيله بالفعل.

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

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

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



ولكن عند النقر فوق "تحديث" ، تقوم الأداة المساعدة بتشغيل أداة مساعدة أخرى - " InstallUpdate.exe " ، وتقوم بإيقاف تشغيل نفسها.

قم بتثبيت التحديث


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



... فهذا ، على الأقل ، سبب للحذر ، أو حتى التخلي تمامًا عن الإطلاق. شيء آخر ، بالموافقة اليدوية على تثبيت التحديث - في هذا السياق ، يُنظر إلى نافذة UAC بشكل طبيعي. لسوء الحظ ، لا يمكن لعملية في Windows رفع حقوقها في وقت التشغيل - لم تتغير هذه الخاصية منذ إطلاقها. لذلك ، أستخدم ملفين منفصلين. في الواقع ، GetNewVersion.exe و GetNewVersion.exe هي نفس الأداة المساعدة ، الملفات متطابقة. ويتم تحديد الإجراء بواسطة المعلمات المرسلة واسم الملف القابل للتنفيذ.

لذلك ، عند بدء التشغيل ، يقوم InstallUpdate بنسخ ملفات عميل اللعبة من المجلد المؤقت إلى مجلد اللعبة ، ثم يقوم بتشغيل العميل المحدث وينتهي. في هذه الحالة ، يمكن أيضًا تحديث ملف GetNewVersion.exe .

يتم تسجيل جميع الإجراءات ، بالإضافة إلى الأخطاء التي تحدث ، بالتفصيل في السجل ؛ وهذا مفيد جدًا لتصحيح الأخطاء.

عملية اعداد نسخة جديدة


لقد درسنا مخطط عملية التحديث من وجهة نظر عميل اللعبة ، ولكن كيف نجعل كل شيء يعمل؟ لإعداد إصدارات جديدة ، كتبت أداة مساعدة أخرى - CompressBuild . يقوم بمسح مجلد بشكل متكرر ، وضغط الملفات باستخدام طريقة Deflate ، وكتابة المعلومات المتعلقة بها إلى قائمة الملفات - قائمة الملفات. بعد الضغط ، يتم إلحاق الرمز "_" باسم الملف. لا يتم ضغط الملفات المضغوطة مرة أخرى ، لذلك ، إذا لزم الأمر ، يمكن تحديث الملفات الفردية فقط في مجلد البناء ، سيقوم CompressBuild بتحديثها فقط.

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

وبالتالي ، من أجل إعداد مبنى جديد ، أحتاج إلى:

1. انسخ المجلد \master إلى \[_]
2. قم بتشغيل CompressBuild ، الذي سيقوم بحزم الملفات الموجودة فيه وإنشاء قائمة بها.
3. تحميل كل شيء على موقع اللعبة.
4. قم بتغيير رقم الإصدار الحالي على خادم اللعبة إلى الرقم الذي تم تنزيله للتو. فويلا!

من الآن فصاعدًا ، عند تحديث الأشخاص سيتلقى إصدارًا جديدًا.

حسنًا ، يمكن حذف المجلدات ذات الإصدارات القديمة على الخادم حتى لا تشغل مساحة.

الخلاصة


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

حسنًا ، يمكنك الحصول على المصدر هنا: astralheroes.com/files/UpdaterSrc.zip
(جمعت في دلفي 2006 / توربو دلفي ، لا أستطيع أن أؤكد للمجمعين الآخرين).

Source: https://habr.com/ru/post/ar423207/


All Articles