Παιχνίδια cloud ανοιχτού κώδικα στο WebRTC: p2p, multiplayer, μηδενικός λανθάνοντας χρόνος

Παιχνίδια cloud ανοιχτού κώδικα στο WebRTC: p2p, multiplayer, μηδενικός λανθάνοντας χρόνος
Το λογισμικό ως υπηρεσία, η υποδομή ως υπηρεσία, η πλατφόρμα ως υπηρεσία, η πλατφόρμα επικοινωνίας ως υπηρεσία, η τηλεδιάσκεψη ως υπηρεσία, τι γίνεται με το gaming cloud ως υπηρεσία; Έχουν ήδη γίνει αρκετές προσπάθειες δημιουργίας cloud gaming (Cloud Gaming), όπως το Stadia, που κυκλοφόρησε πρόσφατα η Google. Stadia δεν είναι νέος στο WebRTC, αλλά μπορούν άλλοι να χρησιμοποιήσουν το WebRTC με τον ίδιο τρόπο;

Ο Thanh Nguyen αποφάσισε να δοκιμάσει αυτή τη δυνατότητα στο έργο ανοιχτού κώδικα CloudRetro. Το CloudRetro βασίζεται στο Pion, δημοφιλής Βιβλιοθήκη WebRTC που βασίζεται στο Go (ευχαριστώ Shownu από την ομάδα ανάπτυξης του Pion για τη βοήθειά τους με αυτό το άρθρο). Σε αυτό το άρθρο, ο Thanh παρέχει μια επισκόπηση της αρχιτεκτονικής του έργου του και επίσης μιλά για τα χρήσιμα πράγματα που έμαθε και τις προκλήσεις που αντιμετώπισε κατά τη διάρκεια της εργασίας του.

Είσοδος

Πέρυσι, όταν η Google ανακοίνωσε το Stadia, έμεινα έκπληκτος. Η ιδέα είναι τόσο μοναδική και καινοτόμα που συνεχώς αναρωτιόμουν πώς αυτό είναι δυνατό ακόμη και με τις υπάρχουσες τεχνολογίες. Η επιθυμία να κατανοήσω καλύτερα αυτό το θέμα με ώθησε να δημιουργήσω τη δική μου έκδοση ενός παιχνιδιού cloud ανοιχτού κώδικα. Το αποτέλεσμα ήταν απλά φανταστικό. Παρακάτω θα ήθελα να μοιραστώ τη διαδικασία εργασίας στο ετήσιό μου έργο.

TLDR: σύντομη έκδοση διαφανειών με επισημάνσεις

Γιατί το cloud gaming είναι το μέλλον

Πιστεύω ότι το Cloud Gaming θα γίνει σύντομα μια νέα γενιά όχι μόνο παιχνιδιών, αλλά και άλλων τομέων της επιστήμης των υπολογιστών. Το Cloud gaming είναι η κορυφή του μοντέλου πελάτη/διακομιστή. Αυτό το μοντέλο μεγιστοποιεί τη διαχείριση του backend και ελαχιστοποιεί την εργασία του frontend φιλοξενώντας τη λογική του παιχνιδιού σε έναν απομακρυσμένο διακομιστή και ροή εικόνων/ήχου στον πελάτη. Ο διακομιστής κάνει τη βαριά επεξεργασία, ώστε ο πελάτης να μην υπόκειται πλέον σε περιορισμούς υλικού.

Το Google Stadia βασικά σας επιτρέπει να παίξετε Παιχνίδια ΑΑΑ (δηλαδή παιχνίδια υπερπαραγωγής υψηλής ποιότητας) σε μια διεπαφή όπως το YouTube. Η ίδια μεθοδολογία μπορεί να εφαρμοστεί και σε άλλες βαριές εφαρμογές εκτός σύνδεσης όπως λειτουργικό σύστημα ή γραφικό σχέδιο 2D/3D κ.λπ. ώστε να μπορούμε να τα τρέχουμε σταθερά σε συσκευές χαμηλών προδιαγραφών σε όλες τις πλατφόρμες.

Παιχνίδια cloud ανοιχτού κώδικα στο WebRTC: p2p, multiplayer, μηδενικός λανθάνοντας χρόνος
Το μέλλον αυτής της τεχνολογίας: φανταστείτε αν τα Microsoft Windows 10 εκτελούνταν στο πρόγραμμα περιήγησης Chrome;

Το Cloud gaming είναι τεχνικά δύσκολο

Το gaming είναι ένας από εκείνους τους σπάνιους τομείς όπου απαιτείται συνεχής γρήγορη αντίδραση του χρήστη. Εάν περιστασιακά αντιμετωπίζουμε καθυστέρηση 2 δευτερολέπτων όταν κάνουμε κλικ σε μια σελίδα, αυτό είναι αποδεκτό. Οι ζωντανές ροές βίντεο τείνουν να είναι λίγα δευτερόλεπτα πίσω, αλλά εξακολουθούν να προσφέρουν αρκετή χρηστικότητα. Ωστόσο, εάν το παιχνίδι καθυστερεί συχνά κατά 500 ms, απλά δεν είναι δυνατό να παίξετε. Στόχος μας είναι να επιτύχουμε εξαιρετικά χαμηλό λανθάνοντα χρόνο, ώστε το χάσμα μεταξύ εισόδου και μέσου να είναι όσο το δυνατόν μικρότερο. Επομένως, η παραδοσιακή προσέγγιση ροής βίντεο δεν ισχύει εδώ.

Παιχνίδια cloud ανοιχτού κώδικα στο WebRTC: p2p, multiplayer, μηδενικός λανθάνοντας χρόνος
Γενικό πρότυπο παιχνιδιού cloud

Έργο ανοιχτού κώδικα CloudRetro

Αποφάσισα να δημιουργήσω ένα δοκιμαστικό δείγμα ενός παιχνιδιού cloud για να δω αν όλα αυτά είναι δυνατά με τόσο αυστηρούς περιορισμούς δικτύου. Επέλεξα το Golang για την απόδειξη της ιδέας επειδή είναι η γλώσσα με την οποία είμαι πιο εξοικειωμένη και ταιριάζει σε αυτήν την υλοποίηση για πολλούς άλλους λόγους, όπως ανακάλυψα αργότερα. Το Go είναι απλό και αναπτύσσεται πολύ γρήγορα. Τα κανάλια στο Go είναι εξαιρετικά για τη διαχείριση πολλαπλών νημάτων.

Σχέδιο CloudRetro.io είναι μια υπηρεσία cloud gaming ανοιχτού κώδικα για ρετρό παιχνίδια. Ο στόχος του έργου είναι να φέρει την πιο άνετη εμπειρία παιχνιδιού στα παραδοσιακά ρετρό παιχνίδια και να προσθέσει πολλούς παίκτες.
Μπορείτε να μάθετε περισσότερα για το έργο εδώ: https://github.com/giongto35/cloud-game.

Λειτουργία CloudRetro

Το CloudRetro χρησιμοποιεί ρετρό παιχνίδια για να αναδείξει τη δύναμη του gaming cloud. Αυτό σας επιτρέπει να αποκτήσετε πολλές μοναδικές εμπειρίες παιχνιδιού.

  • Φορητότητα παιχνιδιού
    • Άμεση αναπαραγωγή κατά το άνοιγμα μιας σελίδας. δεν απαιτείται λήψη και εγκατάσταση
    • Εκτελείται σε πρόγραμμα περιήγησης για κινητά, επομένως δεν απαιτείται λογισμικό για να τρέξει

  • Οι συνεδρίες παιχνιδιού μπορούν να κοινοποιηθούν σε πολλές συσκευές και να αποθηκευτούν στο cloud για την επόμενη φορά που θα συνδεθείτε
  • Το παιχνίδι μπορεί να μεταδοθεί σε ροή ή μπορείτε να το παίξετε με πολλούς χρήστες ταυτόχρονα:
    • Crowdplay όπως το TwitchPlayPokemon, μόνο περισσότερο cross-platform και περισσότερο σε πραγματικό χρόνο
    • Παιχνίδια εκτός σύνδεσης στο διαδίκτυο. Πολλοί χρήστες μπορούν να παίξουν χωρίς εγκατάσταση δικτύου. Το Samurai Shodown μπορεί πλέον να παιχτεί με 2 παίκτες μέσω του δικτύου CloudRetro

    Παιχνίδια cloud ανοιχτού κώδικα στο WebRTC: p2p, multiplayer, μηδενικός λανθάνοντας χρόνος
    Επίδειξη έκδοσης διαδικτυακού παιχνιδιού για πολλούς παίκτες σε διαφορετικές συσκευές

    Υποδομή

    Απαιτήσεις και στοίβα τεχνολογίας

    Παρακάτω είναι μια λίστα με τις απαιτήσεις που έθεσα πριν ξεκινήσω το έργο.

    1. Ένας παίκτης
    Αυτή η απαίτηση μπορεί να μην φαίνεται πολύ σημαντική και προφανής εδώ, αλλά είναι ένα από τα βασικά μου σημεία, κρατά το cloud gaming όσο το δυνατόν πιο μακριά από τις παραδοσιακές υπηρεσίες ροής. Εάν εστιάσουμε στο παιχνίδι ενός παίκτη, μπορούμε να απαλλαγούμε από τον κεντρικό διακομιστή ή το CDN, επειδή δεν χρειάζεται να κάνουμε ροή στις μάζες. Αντί να μεταφορτώνονται ροές σε διακομιστή απορρόφησης ή να περνούν πακέτα σε έναν κεντρικό διακομιστή WebSocket, οι ροές υπηρεσιών μεταδίδονται απευθείας στον χρήστη μέσω μιας ομότιμης σύνδεσης WebRTC.

    2. Ροή μέσων χαμηλής καθυστέρησης
    Όταν διαβάζω για το Stadia, βλέπω συχνά το WebRTC να αναφέρεται σε ορισμένα άρθρα. Συνειδητοποίησα ότι το WebRTC είναι μια εξαιρετική τεχνολογία και είναι εξαιρετική για χρήση σε παιχνίδια cloud. Το WebRTC είναι ένα έργο που παρέχει σε προγράμματα περιήγησης ιστού και εφαρμογές για κινητές συσκευές επικοινωνία σε πραγματικό χρόνο μέσω ενός απλού API. Παρέχει συνδεσιμότητα peer-to-peer, είναι βελτιστοποιημένο για μέσα και έχει ενσωματωμένους τυπικούς κωδικοποιητές όπως VP8 και H264.

    Έδωσα προτεραιότητα στη διασφάλιση της καλύτερης δυνατής εμπειρίας χρήστη έναντι της διατήρησης γραφικών υψηλής ποιότητας. Ορισμένες απώλειες είναι αποδεκτές στον αλγόριθμο. Το Google Stadia έχει ένα επιπλέον βήμα μείωσης του μεγέθους της εικόνας στον διακομιστή και τα καρέ αναβαθμίζονται σε υψηλότερη ποιότητα πριν μεταδοθούν σε ομοτίμους.

    3. Κατανεμημένη υποδομή με γεωγραφική δρομολόγηση
    Ανεξάρτητα από το πόσο βελτιστοποιημένος είναι ο αλγόριθμος συμπίεσης και ο κώδικας, το δίκτυο εξακολουθεί να είναι ο αποφασιστικός παράγοντας που συμβάλλει περισσότερο στην καθυστέρηση. Η αρχιτεκτονική θα πρέπει να έχει έναν μηχανισμό για τη σύζευξη του διακομιστή που βρίσκεται πιο κοντά στο χρήστη για τη μείωση του χρόνου μετ' επιστροφής (RTT). Η αρχιτεκτονική θα πρέπει να έχει 1 συντονιστή και αρκετούς διακομιστές ροής που διανέμονται σε όλο τον κόσμο: Δύση ΗΠΑ, Ανατολή των ΗΠΑ, Ευρώπη, Σιγκαπούρη, Κίνα. Όλοι οι διακομιστές ροής πρέπει να είναι πλήρως απομονωμένοι. Το σύστημα μπορεί να προσαρμόσει τη διανομή του όταν ο διακομιστής συνδέεται ή αποχωρεί από το δίκτυο. Έτσι, με υψηλή επισκεψιμότητα, η προσθήκη επιπλέον διακομιστών επιτρέπει την οριζόντια κλιμάκωση.

    4. Συμβατότητα προγράμματος περιήγησης
    Το Cloud gaming είναι στα καλύτερά του όταν απαιτεί το λιγότερο από τους χρήστες. Αυτό σημαίνει ότι είναι δυνατή η εκτέλεση στο πρόγραμμα περιήγησης. Τα προγράμματα περιήγησης βοηθούν να κάνουν την εμπειρία παιχνιδιού όσο το δυνατόν πιο άνετη για τους χρήστες, εξοικονομώντας τους από την εγκατάσταση λογισμικού και υλικού. Τα προγράμματα περιήγησης βοηθούν επίσης στην παροχή λειτουργικότητας πολλαπλών πλατφορμών μεταξύ εκδόσεων για φορητές συσκευές και επιτραπέζιους υπολογιστές. Ευτυχώς, το WebRTC υποστηρίζεται καλά σε διάφορα προγράμματα περιήγησης.

    5. Σαφής διαχωρισμός της διεπαφής του παιχνιδιού και της υπηρεσίας
    Βλέπω την υπηρεσία παιχνιδιών cloud ως πλατφόρμα. Όλοι θα πρέπει να μπορούν να συνδέσουν οτιδήποτε στην πλατφόρμα. Έχω πλέον ενσωματωθεί LibRetro με την υπηρεσία παιχνιδιών cloud επειδή το LibRetro προσφέρει όμορφη διεπαφή εξομοιωτή παιχνιδιών για ρετρό παιχνίδια όπως SNES, GBA, PS.

    6. Δωμάτια για multiplayer, crowd play και εξωτερική σύνδεση (deep-link) με το παιχνίδι
    Το CloudRetro υποστηρίζει πολλά νέα παιχνίδια όπως το CrowdPlay και το Online MultiPlayer για ρετρό παιχνίδια. Εάν πολλοί χρήστες ανοίξουν τον ίδιο σύνδεσμο σε βάθος σε διαφορετικούς υπολογιστές, θα δουν το ίδιο παιχνίδι να εκτελείται και ακόμη και θα μπορούν να συμμετέχουν σε αυτό.

    Επιπλέον, οι καταστάσεις παιχνιδιού αποθηκεύονται στο χώρο αποθήκευσης cloud. Αυτό επιτρέπει στους χρήστες να συνεχίσουν να παίζουν ανά πάσα στιγμή σε οποιαδήποτε άλλη συσκευή.

    7. Οριζόντια κλιμάκωση
    Όπως κάθε SAAS στις μέρες μας, το cloud gaming πρέπει να σχεδιαστεί ώστε να μπορεί να κλιμακωθεί οριζόντια. Ο σχεδιασμός συντονιστή-εργαζομένου σάς επιτρέπει να προσθέσετε περισσότερους εργαζόμενους για να εξυπηρετήσετε περισσότερη επισκεψιμότητα.

    8. Δεν είναι δεμένο σε ένα σύννεφο
    Η υποδομή CloudRetro φιλοξενείται από διαφορετικούς παρόχους cloud (Digital Ocean, Alibaba, προσαρμοσμένος πάροχος) για διαφορετικές περιοχές. Ενεργοποιώ την εκτέλεση σε ένα κοντέινερ Docker υποδομής και διαμορφώνω τις ρυθμίσεις δικτύου με ένα σενάριο bash για να μην εξαρτώμαι από έναν μεμονωμένο πάροχο cloud. Συνδυάζοντας αυτό με το NAT Traversal στο WebRTC, μπορούμε να έχουμε την ευελιξία να αναπτύξουμε το CloudRetro σε οποιαδήποτε πλατφόρμα cloud και ακόμη και σε μηχανή οποιουδήποτε χρήστη.

    Αρχιτεκτονικό σχέδιο

    Εργάτης: (ή ο διακομιστής ροής που αναφέρεται παραπάνω) πολλαπλασιάζει τα παιχνίδια, εκτελεί τη γραμμή κωδικοποίησης και μεταδίδει τα κωδικοποιημένα μέσα στους χρήστες. Τα στιγμιότυπα εργαζομένων διανέμονται σε όλο τον κόσμο και κάθε εργαζόμενος μπορεί να χειριστεί πολλές συνεδρίες χρηστών ταυτόχρονα.

    Συντονιστής: είναι υπεύθυνος για τη σύζευξη του νέου χρήστη με τον καταλληλότερο εργαζόμενο ροής. Ο συντονιστής επικοινωνεί με τους εργαζόμενους μέσω WebSocket.

    Αποθήκευση κατάστασης παιχνιδιού: κεντρική απομακρυσμένη αποθήκευση για όλες τις καταστάσεις παιχνιδιού. Αυτός ο χώρος αποθήκευσης παρέχει σημαντικές δυνατότητες, όπως απομακρυσμένη αποθήκευση/φόρτωση.

    Παιχνίδια cloud ανοιχτού κώδικα στο WebRTC: p2p, multiplayer, μηδενικός λανθάνοντας χρόνος
    Αρχιτεκτονική ανώτατου επιπέδου CloudRetro

    Προσαρμοσμένο σενάριο

    Όταν ένας νέος χρήστης ανοίγει το CloudRetro στα βήματα 1 και 2 που φαίνονται στο παρακάτω σχήμα, ο συντονιστής, μαζί με μια λίστα διαθέσιμων εργαζομένων, ζητείται στην πρώτη σελίδα. Μετά από αυτό, στο βήμα 3, ο πελάτης υπολογίζει τις καθυστερήσεις για όλους τους υποψηφίους χρησιμοποιώντας ένα αίτημα ping HTTP. Αυτή η λίστα καθυστερήσεων αποστέλλεται στη συνέχεια στον συντονιστή, ώστε να μπορεί να καθορίσει τον καταλληλότερο εργαζόμενο για να εξυπηρετήσει τον χρήστη. Το βήμα 4 παρακάτω δημιουργεί ένα παιχνίδι. Δημιουργείται μια σύνδεση ροής WebRTC μεταξύ του χρήστη και του εξουσιοδοτημένου εργαζόμενου.
    Παιχνίδια cloud ανοιχτού κώδικα στο WebRTC: p2p, multiplayer, μηδενικός λανθάνοντας χρόνος
    Προσαρμοσμένο σενάριο μετά την απόκτηση πρόσβασης

    Τι υπάρχει μέσα στον εργαζόμενο

    Οι αγωγοί παιχνιδιού και ροής αποθηκεύονται μέσα στον εργαζόμενο σε απομόνωση και ανταλλάσσουν πληροφορίες εκεί μέσω της διεπαφής. Επί του παρόντος, αυτή η επικοινωνία πραγματοποιείται με μεταφορά δεδομένων στη μνήμη μέσω Κανάλια Golang στην ίδια διαδικασία. Ο επόμενος στόχος είναι ο διαχωρισμός, δηλ. ανεξάρτητη εκκίνηση του παιχνιδιού σε άλλη διαδικασία.

    Παιχνίδια cloud ανοιχτού κώδικα στο WebRTC: p2p, multiplayer, μηδενικός λανθάνοντας χρόνος
    Αλληλεπίδραση συστατικών εργαζομένων

    Κύρια εξαρτήματα:

    • WebRTC: ένα στοιχείο πελάτη που δέχεται εισόδους χρήστη και εξάγει τα κωδικοποιημένα μέσα από τον διακομιστή.
    • Εξομοιωτής παιχνιδιού: συστατικό του παιχνιδιού. Χάρη στη βιβλιοθήκη Libretro, το σύστημα μπορεί να εκτελέσει το παιχνίδι μέσα στην ίδια διαδικασία και να παρεμποδίσει εσωτερικά τα μέσα και τη ροή εισόδου.
    • Τα καρέ εντός του παιχνιδιού καταγράφονται και αποστέλλονται στον κωδικοποιητή.
    • Κωδικοποιητής εικόνας/ήχου: μια γραμμή κωδικοποίησης που λαμβάνει καρέ πολυμέσων, τα κωδικοποιεί στο παρασκήνιο και εξάγει κωδικοποιημένες εικόνες/ήχο.

    Реализация

    Το CloudRetro βασίζεται στο WebRTC ως τεχνολογία ραχοκοκαλιάς, οπότε προτού βουτήξω στις λεπτομέρειες της εφαρμογής Golang, αποφάσισα να μιλήσω για το ίδιο το WebRTC. Είναι ένα καταπληκτικό κομμάτι τεχνολογίας που με έχει βοηθήσει πάρα πολύ στην επίτευξη ροής με καθυστέρηση δευτερεύοντος.

    WebRTC

    Το WebRTC έχει σχεδιαστεί για να παρέχει υψηλής ποιότητας peer-to-peer συνδέσεις σε εγγενείς εφαρμογές για κινητά και προγράμματα περιήγησης χρησιμοποιώντας απλά API.

    NAT Traversal

    Το WebRTC είναι γνωστό για τη λειτουργία NAT Traversal. Το WebRTC έχει σχεδιαστεί για peer-to-peer επικοινωνία. Σκοπός του είναι να βρει την καταλληλότερη άμεση διαδρομή, αποφεύγοντας τις πύλες NAT και τα τείχη προστασίας, για peer-to-peer μέσω μιας διαδικασίας που ονομάζεται ICE. Ως μέρος αυτής της διαδικασίας, τα WebRTC API βρίσκουν τη δημόσια διεύθυνση IP σας χρησιμοποιώντας διακομιστές STUN και την προωθούν σε έναν διακομιστή αναμετάδοσης (ΣΤΡΟΦΗ) όταν δεν μπορεί να πραγματοποιηθεί απευθείας σύνδεση.

    Ωστόσο, το CloudRetro δεν εκμεταλλεύεται πλήρως αυτή τη δυνατότητα. Οι peer-to-peer συνδέσεις του δεν υπάρχουν μεταξύ χρηστών, αλλά μεταξύ χρηστών και διακομιστών cloud. Η πλευρά του διακομιστή του μοντέλου έχει λιγότερους περιορισμούς στην άμεση επικοινωνία από μια τυπική συσκευή χρήστη. Αυτό σας επιτρέπει να ανοίξετε εκ των προτέρων τις εισερχόμενες θύρες ή να χρησιμοποιήσετε απευθείας δημόσιες διευθύνσεις IP, καθώς ο διακομιστής δεν βρίσκεται πίσω από το NAT.

    Προηγουμένως, ήθελα να μετατρέψω το έργο σε πλατφόρμα διανομής παιχνιδιών για το Cloud Gaming. Η ιδέα ήταν να επιτραπεί στους δημιουργούς παιχνιδιών να παρέχουν παιχνίδια και πόρους ροής. Και οι χρήστες θα αλληλεπιδρούν απευθείας με τους παρόχους. Με αυτόν τον αποκεντρωμένο τρόπο, το CloudRetro είναι απλώς ένα πλαίσιο για τη σύνδεση πόρων ροής τρίτων με χρήστες, καθιστώντας το πιο επεκτάσιμο όταν δεν φιλοξενείται πλέον. Ο ρόλος του WebRTC NAT Traversal εδώ είναι πολύ σημαντικός για τη διευκόλυνση της προετοιμασίας της σύνδεσης peer-to-peer σε πόρους ροής τρίτων, διευκολύνοντας τον δημιουργό να συνδεθεί στο δίκτυο.

    Συμπίεση βίντεο

    Η συμπίεση βίντεο είναι αναπόσπαστο μέρος του αγωγού και συμβάλλει σημαντικά στην ομαλότητα του ρεύματος. Αν και δεν είναι απαραίτητο να γνωρίζετε όλες τις λεπτομέρειες της κωδικοποίησης βίντεο VP8/H264, η κατανόηση της έννοιας βοηθά στην κατανόηση των παραμέτρων ταχύτητας ροής βίντεο, τον εντοπισμό σφαλμάτων της απροσδόκητης συμπεριφοράς και την προσαρμογή της καθυστέρησης.

    Η συμπίεση βίντεο για μια υπηρεσία ροής είναι δύσκολη, επειδή ο αλγόριθμος πρέπει να διασφαλίζει ότι ο συνολικός χρόνος κωδικοποίησης + χρόνος μεταφοράς δικτύου + χρόνος αποκωδικοποίησης είναι όσο το δυνατόν μικρότερος. Επιπλέον, η διαδικασία κωδικοποίησης πρέπει να είναι συνεπής και συνεχής. Ορισμένες αντισταθμίσεις στην κωδικοποίηση δεν ισχύουν - για παράδειγμα, δεν μπορούμε να προτιμήσουμε έναν μεγάλο χρόνο κωδικοποίησης από ένα μικρότερο μέγεθος αρχείου και χρόνο αποκωδικοποίησης ή να χρησιμοποιήσουμε ασυνεπή συμπίεση.

    Η ιδέα πίσω από τη συμπίεση βίντεο είναι να εξαλειφθούν τα περιττά κομμάτια πληροφοριών διατηρώντας παράλληλα ένα αποδεκτό επίπεδο πιστότητας για τους χρήστες. Εκτός από την κωδικοποίηση μεμονωμένων στατικών πλαισίων εικόνων, ο αλγόριθμος συνάγει το τρέχον πλαίσιο από το προηγούμενο και το επόμενο, επομένως αποστέλλεται μόνο η διαφορά τους. Όπως μπορείτε να δείτε από το παράδειγμα Pacman, μεταδίδονται μόνο διαφορικά σημεία.

    Παιχνίδια cloud ανοιχτού κώδικα στο WebRTC: p2p, multiplayer, μηδενικός λανθάνοντας χρόνος
    Σύγκριση καρέ βίντεο χρησιμοποιώντας το Pacman ως παράδειγμα

    Συμπίεση ήχου

    Ομοίως, ο αλγόριθμος συμπίεσης ήχου παραλείπει δεδομένα που δεν μπορούν να γίνουν αντιληπτά από τον άνθρωπο. Το Opus είναι αυτή τη στιγμή ο κωδικοποιητής ήχου με την καλύτερη απόδοση. Έχει σχεδιαστεί για να μεταδίδει ένα ηχητικό κύμα μέσω ενός παραγγελθέντος πρωτοκόλλου datagram όπως το RTP (Real Time Transport Protocol). Η καθυστέρηση του είναι μικρότερη από αυτή των mp3 και aac και η ποιότητα είναι υψηλότερη. Η καθυστέρηση είναι συνήθως περίπου 5~66,5ms.

    Pion, WebRTC στο Golang

    Πιόν είναι ένα έργο ανοιχτού κώδικα που φέρνει το WebRTC στο Golang. Αντί για τη συνηθισμένη αναδίπλωση των εγγενών βιβλιοθηκών C++ WebRTC, το Pion είναι μια εγγενής υλοποίηση Golang WebRTC με καλύτερη απόδοση, ενσωμάτωση Go και έλεγχο έκδοσης σε πρωτόκολλα WebRTC.

    Η βιβλιοθήκη παρέχει επίσης δεδομένα ροής με πολλές εξαιρετικές ενσωματωμένες μονάδες με καθυστέρηση μικρότερη από ένα δευτερόλεπτο. Έχει τη δική του υλοποίηση STUN, DTLS, SCTP κ.λπ. και κάποιοι πειραματισμοί με το QUIC και το WebAssembly. Από μόνη της, αυτή η βιβλιοθήκη ανοιχτού κώδικα είναι μια πραγματικά καλή πηγή μάθησης με εξαιρετική τεκμηρίωση, υλοποιήσεις πρωτοκόλλου δικτύου και ωραία παραδείγματα.

    Η κοινότητα του Pion, με επικεφαλής έναν πολύ παθιασμένο δημιουργό, είναι αρκετά ζωντανή και έχει πολλές ποιοτικές συζητήσεις για το WebRTC. Εάν ενδιαφέρεστε για αυτήν την τεχνολογία, εγγραφείτε http://pion.ly/slack - θα μάθετε πολλά νέα πράγματα.

    Γράψιμο CloudRetro στο Golang

    Παιχνίδια cloud ανοιχτού κώδικα στο WebRTC: p2p, multiplayer, μηδενικός λανθάνοντας χρόνος
    Εργαζόμενη εφαρμογή στο Go

    Μεταβείτε στα κανάλια σε δράση

    Με την όμορφη σχεδίαση των καναλιών του Go, τα ζητήματα της ροής συμβάντων και του συγχρονισμού απλοποιούνται πολύ. Όπως στο διάγραμμα, υπάρχουν πολλά στοιχεία που εκτελούνται παράλληλα σε διαφορετικά GoRoutines. Κάθε στοιχείο διαχειρίζεται τη δική του κατάσταση και επικοινωνεί μέσω καναλιών. Ο επιλεκτικός ισχυρισμός του Golang προκαλεί την επεξεργασία ενός ατομικού γεγονότος κάθε φορά στο παιχνίδι (τικ του παιχνιδιού). Αυτό σημαίνει ότι δεν απαιτείται μπλοκάρισμα για αυτό το σχέδιο. Για παράδειγμα, όταν ένας χρήστης αποθηκεύεται, απαιτείται ένα πλήρες στιγμιότυπο κατάστασης παιχνιδιού. Αυτή η κατάσταση πρέπει να παραμείνει συνεχής, συνδέοντας μέχρι να ολοκληρωθεί η αποθήκευση. Κατά τη διάρκεια κάθε επιλογής παιχνιδιού, το backend μπορεί να επεξεργαστεί μόνο μια λειτουργία αποθήκευσης ή εισαγωγής, γεγονός που καθιστά τη διαδικασία ασφαλή ως προς το νήμα.

    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 και πολλαπλών παικτών. Ακολουθώντας αυτό το μοτίβο, όλες οι είσοδοι χρήστη στο ίδιο δωμάτιο είναι ενσωματωμένες στο κεντρικό κανάλι εισόδου. Στη συνέχεια, τα μέσα παιχνιδιού αναπτύσσονται σε όλους τους χρήστες στο ίδιο δωμάτιο. Με αυτόν τον τρόπο, επιτυγχάνουμε τη διαίρεση της κατάστασης του παιχνιδιού μεταξύ πολλών περιόδων παιχνιδιού διαφορετικών χρηστών.

    Παιχνίδια cloud ανοιχτού κώδικα στο WebRTC: p2p, multiplayer, μηδενικός λανθάνοντας χρόνος
    Συγχρονισμός μεταξύ διαφορετικών συνεδριών

    Μειονεκτήματα του Golang

    Το Golang δεν είναι τέλειο. Το κανάλι είναι αργό. Σε σύγκριση με τον αποκλεισμό, ένα κανάλι Go είναι απλώς ένας ευκολότερος τρόπος χειρισμού ταυτόχρονων συμβάντων και συμβάντων ροής, αλλά ένα κανάλι δεν παρέχει την καλύτερη απόδοση. Κάτω από το κανάλι υπάρχει μια πολύπλοκη λογική αποκλεισμού. Ως εκ τούτου, έκανα ορισμένες προσαρμογές στην υλοποίηση εφαρμόζοντας ξανά κλειδαριές και ατομικές τιμές κατά την αντικατάσταση καναλιών για βελτιστοποίηση της απόδοσης.

    Επιπλέον, ο συλλέκτης σκουπιδιών του Golang δεν είναι διαχειρίσιμος, κάτι που μερικές φορές προκαλεί ύποπτα μεγάλες παύσεις. Αυτό παρεμβαίνει σε μεγάλο βαθμό στην εφαρμογή ροής σε πραγματικό χρόνο.

    ΔΟΝΤΙ ΤΡΟΧΟΥ

    Το έργο χρησιμοποιεί την υπάρχουσα βιβλιοθήκη ανοιχτού κώδικα Golang VP8/H264 για συμπίεση πολυμέσων και το Libretro για εξομοιωτές παιχνιδιών. Όλες αυτές οι βιβλιοθήκες είναι απλώς περιτυλίγματα για τη βιβλιοθήκη C στο Go χρησιμοποιώντας ΔΟΝΤΙ ΤΡΟΧΟΥ. Μερικά από τα μειονεκτήματα αναφέρονται στο αυτή η ανάρτηση Dave Cheney. Προβλήματα που αντιμετώπισα:

    • αδυναμία να πιάσετε μια συντριβή στο CGO, ακόμη και με Golang RecoveryCrash.
    • αποτυχία εντοπισμού σημείων συμφόρησης απόδοσης όταν δεν είμαστε σε θέση να εντοπίσουμε λεπτομερή προβλήματα στο CGO.

    Συμπέρασμα

    Πέτυχα τον στόχο μου να ανακαλύψω τις υπηρεσίες παιχνιδιών cloud και να δημιουργήσω μια πλατφόρμα που με βοηθά να παίζω νοσταλγικά ρετρό παιχνίδια με τους φίλους μου στο διαδίκτυο. Αυτό το έργο δεν θα ήταν δυνατό χωρίς τη βιβλιοθήκη Pion και την υποστήριξη της κοινότητας Pion. Είμαι εξαιρετικά ευγνώμων για την εντατική του ανάπτυξη. Τα απλά API που παρέχονται από το WebRTC και το Pion εξασφάλισαν απρόσκοπτη ενσωμάτωση. Η πρώτη μου απόδειξη της ιδέας κυκλοφόρησε την ίδια εβδομάδα, παρόλο που δεν γνώριζα εκ των προτέρων τις επικοινωνίες peer-to-peer (P2P).

    Παρά την ευκολία ενσωμάτωσης, η ροή P2P είναι πράγματι ένας πολύ περίπλοκος τομέας στην επιστήμη των υπολογιστών. Πρέπει να αντιμετωπίσει την πολυπλοκότητα των πολυετών αρχιτεκτονικών δικτύων όπως το IP και το NAT για να δημιουργήσει μια συνεδρία peer-to-peer. Ενώ εργάζομαι σε αυτό το έργο, έχω συγκεντρώσει πολλές πολύτιμες γνώσεις σχετικά με τη δικτύωση και τη βελτιστοποίηση απόδοσης, γι' αυτό συνιστώ σε όλους να δοκιμάσουν να δημιουργήσουν προϊόντα P2P χρησιμοποιώντας το WebRTC.

    Το CloudRetro καλύπτει όλες τις περιπτώσεις χρήσης που περίμενα από την οπτική μου ως ρετρό gamer. Ωστόσο, πιστεύω ότι υπάρχουν πολλοί τομείς στο έργο που μπορώ να βελτιώσω, όπως το να κάνω το δίκτυο πιο αξιόπιστο και αποδοτικό, να παρέχω γραφικά παιχνιδιών υψηλότερης ποιότητας ή τη δυνατότητα κοινής χρήσης παιχνιδιών μεταξύ των χρηστών. Δουλεύω σκληρά σε αυτό. Παρακαλώ ακολούθησε έργο και στηρίξτε τον αν σας αρέσει.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο