الألعاب السحابية مفتوحة المصدر على WebRTC: p2p ، متعددة اللاعبين ، صفر زمن انتقال



البرمجيات كخدمة ، والبنية التحتية كخدمة ، والنظام الأساسي كخدمة ، ومنصة الاتصال كخدمة ، ومؤتمرات الفيديو كخدمة ، وماذا عن الألعاب السحابية كخدمة؟ كانت هناك بالفعل عدة محاولات لإنشاء ألعاب سحابية (Cloud Gaming) ، على سبيل المثال Stadia ، التي أطلقتها Google مؤخرًا. Stadia ليست جديدة على WebRTC ، ولكن هل يمكن للآخرين استخدام WebRTC بنفس الطريقة؟



قرر ثان نجوين اختبار هذا الاحتمال في مشروع CloudRetro مفتوح المصدر الخاص به. تعتمد CloudRetro على Pion ، مكتبة WebRTC الشهيرة التي تعتمد على Go (بفضل Sean of the Pion Development Team للمساعدة في هذه المقالة). في هذه المقالة ، يعطي ثانه لمحة عامة عن بنية مشروعه ، ويخبرنا أيضًا عن الأشياء المفيدة التي تعلمها والتحديات التي واجهها أثناء عمله.



المقدمة



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



TLDR: نسخة شريحة قصيرة مع الإبرازات



لماذا الألعاب السحابية هي المستقبل



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



يتيح لك Google Stadia بشكل أساسي لعب ألعاب AAA(مثل الألعاب عالية الجودة) على واجهة مثل YouTube. يمكن تطبيق نفس المنهجية على التطبيقات الثقيلة الأخرى غير المتصلة بالإنترنت مثل نظام التشغيل أو تصميم الرسوم ثنائية الأبعاد / ثلاثية الأبعاد ، إلخ. حتى نتمكن من تشغيلها بثبات على أجهزة منخفضة المواصفات عبر منصات مختلفة.





مستقبل هذه التقنية: هل يمكنك تخيل ما إذا كان Microsoft Windows 10 يعمل في متصفح Chrome؟



تمثل الألعاب السحابية تحديًا تقنيًا



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





قالب لعبة السحابة العامة



مشروع مفتوح المصدر CloudRetro



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



مشروع CloudRetro.io عبارة عن خدمة ألعاب سحابية مفتوحة المصدر للألعاب القديمة . الهدف من المشروع هو تقديم تجربة الألعاب الأكثر راحة للألعاب التقليدية القديمة وإضافة لاعبين متعددين.

يمكنك معرفة المزيد عن المشروع هنا: https://github.com/giongto35/cloud-game .



وظائف CloudRetro



لعرض القوة الكاملة للألعاب السحابية ، تستخدم CloudRetro الألعاب القديمة. هذا يسمح لمجموعة متنوعة من تجارب الألعاب الفريدة.



  • إمكانية نقل اللعبة

    • التشغيل الفوري عند فتح الصفحة ؛ لا حاجة للتنزيل والتثبيت
    • يعمل في مستعرض الهاتف المحمول ، لذا لا يلزم تشغيل أي برنامج


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

    • Crowdplay مثل TwitchPlayPokemon ، فقط أكثر عبر الأنظمة الأساسية والمزيد من الوقت الفعلي
    • ألعاب غير متصلة بالإنترنت. يمكن للعديد من المستخدمين اللعب بدون إعداد شبكة. يمكن الآن لعب Samurai Shodown بواسطة لاعبين على شبكة CloudRetro




    نسخة تجريبية من لعبة متعددة اللاعبين عبر الإنترنت على أجهزة مختلفة



    بنية تحتية



    المتطلبات والتكنولوجيا



    , .



    1.

    , , . , CDN, . , WebSocket, WebRTC.



    2.

    Stadia, WebRTC. , WebRTC – , . WebRTC – , - API. , , VP8 H264.



    , . . Google Stadia , .



    3.

    , , , . - (RTT). 1 , : , , , , . . , . , , .



    4.

    , . , . , . - . , WebRTC .



    5.

    . . LibRetro , LibRetro -, SNES, GBA, PS.



    6. , crowd play (deep-link)

    CloudRetro , CrowdPlay Online MultiPlayer -. deep-link , .



    , . .



    7.

    SAAS , , . «-» , .



    8.

    CloudRetro (Digital Ocean, Alibaba, ) . Docker bash-, . NAT Traversal WebRTC, CloudRetro .





    : ( , ) , . , .



    : . WebSocket.



    : . , , , /.





    CloudRetro





    CloudRetro 1 2, , . 3 HTTP ping. , . 4 . WebRTC.









    . Golang . , .. .









    :



    • WebRTC: , .

    • : . Libretro .

    • .

    • / : , , /.





    CloudRetro WebRTC , , Golang, WebRTC. , .



    WebRTC



    WebRTC API.



    NAT Traversal



    WebRTC NAT Traversal. WebRTC . – , NAT- ICE. API WebRTC IP- STUN (TURN), .



    CloudRetro . , . , . IP- , NAT.



    Cloud Gaming. , . . CloudRetro , , . WebRTC NAT Traversal , .





    – , . , VP8/H264, , .



    , , + + , . , . – , , .



    , , . , , . c Pacman’, .





    Pacman





    , , . Opus . , RTP (Real Time Transport Protocol – ). , mp3 aac, . 5~66,5 .



    Pion, WebRTC Golang



    Pion – , WebRTC Golang. C++ WebRTC, Pion Golang- WebRTC , Go, WebRTC.



    . STUN, DTLS, SCTP .. QUIC WebAssembly. , .



    Pion, , , WebRTC. , http://pion.ly/slack – .



    CloudRetro Golang





    Go



    Go



    Go, . , GoRoutines . . Golang (game tick). , . , , . , , . game tick’ , .



    func (e *gameEmulator) gameUpdate() {
    for {
    	select {
    		case <-e.saveOperation:
    			e.saveGameState()
    		case key := <-e.input:
    			e.updateGameState(key)
    		case <-e.done:
    			e.close()
    			return
    	}
        }
    }


    Fan-in / Fan-out



    Golang CrowdPlay Multiple Player. , . . , .









    Golang



    Golang . . Go – , . . , .



    , garbage collector Golang , - . .



    CGO



    VP8/H264 Golang Libretro . C Go CGO. Dave Cheney. , :



    • CGO, Golang RecoveryCrash;
    • , CGO.




    – , - . Pion Pion. . API, WebRTC Pion, . , , (P2P).



    , P2P- . , IP NAT . , P2P- WebRTC.



    CloudRetro , , , -. , , , , , , , . . , , .



All Articles