WebRTC дээрх нээлттэй эхийн үүлэн тоглоом: p2p, олон тоглогч, тэг хоцролт

WebRTC дээрх нээлттэй эхийн үүлэн тоглоом: p2p, олон тоглогч, тэг хоцролт
Програм хангамж нь үйлчилгээ, дэд бүтэц нь үйлчилгээ, платформ нь үйлчилгээ, харилцааны платформ нь үйлчилгээ, видео хурал нь үйлчилгээ, үүлэн тоглоомыг үйлчилгээ гэж юу вэ? Google-ээс саяхан гаргасан Stadia гэх мэт үүлэн тоглоом (Cloud Gaming) үүсгэх хэд хэдэн оролдлого аль хэдийн гарсан. Стадиа WebRTC-д шинэ биш, гэхдээ бусад хүмүүс WebRTC-г ижил аргаар ашиглаж болох уу?

Тан Нгуен энэ боломжийг өөрийн нээлттэй эхийн CloudRetro төсөл дээрээ туршихаар шийджээ. CloudRetro нь Pion дээр суурилсан, алдартай Go дээр суурилсан WebRTC номын сан (баярлалаа Үзүүлсэн Энэ нийтлэлийг бэлтгэхэд туслалцаа үзүүлсэнд Pion хөгжүүлэлтийн багаас). Энэ нийтлэлд Танх төслийнхөө архитектурын тоймыг өгөхөөс гадна ямар хэрэгтэй зүйл сурсан, ажлынхаа явцад ямар бэрхшээл тулгарсан тухайгаа өгүүлсэн.

нэвтрэх

Өнгөрсөн жил Google Stadia-г зарлахдаа миний толгойг эргүүлсэн. Энэ санаа нь маш өвөрмөц бөгөөд шинэлэг тул одоо байгаа технологид яаж үүнийг хийх боломжтой вэ гэж би үргэлж гайхдаг. Энэ сэдвийг илүү сайн ойлгох хүсэл намайг нээлттэй эхийн үүлэн тоглоомын өөрийн хувилбарыг бүтээхэд түлхэц болсон. Үр дүн нь ердөө л гайхалтай байсан. Доор би жилийнхээ ажлын явцыг хуваалцахыг хүсч байна төсөл.

TLDR: онцлох зүйл бүхий богино слайд хувилбар

Яагаад үүлэн тоглоом ирээдүй вэ?

Удахгүй Cloud Gaming нь зөвхөн тоглоомын төдийгүй компьютерийн шинжлэх ухааны бусад салбаруудын дараагийн үе болно гэдэгт би итгэж байна. Клоуд тоглоом бол үйлчлүүлэгч/серверийн загварын оргил юм. Энэ загвар нь алсын сервер дээр тоглоомын логикийг байршуулж, үйлчлүүлэгч рүү зураг/аудио дамжуулах замаар арын хэсгийн удирдлагыг дээд зэргээр нэмэгдүүлж, урд талын ажлыг багасгадаг. Сервер нь хүнд боловсруулалт хийдэг тул үйлчлүүлэгч техник хангамжийн хязгаарлалтаас ангид байхаа больсон.

Google Stadia нь үндсэндээ тоглох боломжийг танд олгоно AAA тоглоомууд (өөрөөр хэлбэл дээд зэргийн блокбастер тоглоомууд) YouTube шиг интерфэйс дээр. Үүнтэй ижил аргачлалыг үйлдлийн систем эсвэл 2D/3D график дизайн гэх мэт бусад хүнд оффлайн програмуудад хэрэглэж болно. Ингэснээр бид тэдгээрийг олон платформ дээр бага үзүүлэлттэй төхөөрөмжүүд дээр тогтмол ажиллуулж чадна.

WebRTC дээрх нээлттэй эхийн үүлэн тоглоом: p2p, олон тоглогч, тэг хоцролт
Энэ технологийн ирээдүй: Microsoft Windows 10 нь Chrome хөтөч дээр ажиллаж байсан бол төсөөлөөд үз дээ?

Үүлэн тоглоом нь техникийн хувьд хэцүү байдаг

Тоглоом нь хэрэглэгчийн байнгын, хурдан хариу үйлдэл шаарддаг ховор газруудын нэг юм. Хэрэв бид хааяа нэг хуудсан дээр дарахад 2 секундын саатал гарвал үүнийг хүлээн зөвшөөрөх боломжтой. Шууд видео дамжуулалт хэдхэн секундын хоцрогдолтой байдаг ч боломжийн ашиглах боломжтой хэвээр байна. Гэсэн хэдий ч, хэрэв тоглоом 500 мс-ээр байнга хоцорч байвал энэ нь зүгээр л тоглох боломжгүй болно. Бидний зорилго бол оролт ба медиа хоорондын зайг аль болох бага байлгахын тулд маш бага хоцролтыг бий болгох явдал юм. Тиймээс, видео цацах уламжлалт арга энд хэрэгжихгүй.

WebRTC дээрх нээлттэй эхийн үүлэн тоглоом: p2p, олон тоглогч, тэг хоцролт
Ерөнхий үүлэн тоглоомын загвар

Нээлттэй эхийн төсөл CloudRetro

Сүлжээний хатуу хязгаарлалттай энэ бүхэн боломжтой эсэхийг мэдэхийн тулд би үүлэн тоглоомын туршилтын дээжийг бүтээхээр шийдсэн. Би Голанг хэл нь миний хамгийн сайн мэддэг хэл байсан бөгөөд бусад олон шалтгааны улмаас үүнийг хэрэгжүүлэхэд тохиромжтой байсан тул би Голанг хэлийг сонгосон. Go нь энгийн бөгөөд маш хурдан хөгждөг; Go дахь сувгууд нь олон урсгалыг удирдахад тохиромжтой.

Төсөл CloudRetro.io чимэг тоглоомын нээлттэй эхийн үүлэн тоглоомын үйлчилгээ юм. Төслийн зорилго нь уламжлалт чимэг тоглоомуудад хамгийн тав тухтай тоглоомын туршлагыг авчирч, олон тоглогчийг нэмэх явдал юм.
Та төслийн талаар дэлгэрэнгүй мэдээллийг эндээс авах боломжтой: https://github.com/giongto35/cloud-game.

CloudRetro функц

CloudRetro нь үүлэн тоглоомын хүчийг харуулахын тулд чимэг тоглоомуудыг ашигладаг. Энэ нь танд олон өвөрмөц тоглоомын туршлага олж авах боломжийг олгодог.

  • Тоглоомын зөөврийн байдал
    • Хуудсыг нээх үед шууд тоглуулах; татаж авах, суулгах шаардлагагүй
    • Мобайл хөтөч дээр ажилладаг тул үүнийг ажиллуулахад ямар ч програм хангамж шаардлагагүй

  • Тоглоомын сессийг олон төхөөрөмж дээр хуваалцаж, дараагийн удаа нэвтрэх үед үүлэн дээр хадгалах боломжтой
  • Тоглоомыг дамжуулж болно, эсвэл хэд хэдэн хэрэглэгч нэгэн зэрэг тоглуулж болно:
    • TwitchPlayPokemon шиг олон хүнтэй тоглох, зөвхөн олон платформ, илүү бодит цаг
    • Оффлайн онлайн тоглоомууд. Олон хэрэглэгчид сүлжээ тохируулахгүйгээр тоглох боломжтой. Samurai Shodown-ийг одоо CloudRetro сүлжээгээр 2 тоглогч тоглох боломжтой

    WebRTC дээрх нээлттэй эхийн үүлэн тоглоом: p2p, олон тоглогч, тэг хоцролт
    Янз бүрийн төхөөрөмж дээрх олон тоглогчийн онлайн тоглоомын демо хувилбар

    Дэд бүтэц

    Шаардлага ба технологийн стек

    Төслийг эхлүүлэхийн өмнө миний тавьсан шаардлагуудын жагсаалтыг доор харуулав.

    1. Нэг тоглогч
    Энэ шаардлага нь тийм ч чухал биш юм шиг санагдаж магадгүй, гэхдээ энэ нь миний гол санаануудын нэг бөгөөд үүлэн тоглоомыг уламжлалт стриминг үйлчилгээнээс аль болох хол байлгах боломжийг олгодог. Хэрэв бид нэг тоглогчийн тоглоомд анхаарлаа хандуулбал бид олон нийтэд цацах шаардлагагүй тул төвлөрсөн сервер эсвэл CDN-ээс салж чадна. Урсгалуудыг угаалтуур серверт байршуулах эсвэл төвлөрсөн WebSocket сервер рүү пакет дамжуулахын оронд үйлчилгээний урсгалыг үе тэнгийн WebRTC холболтоор дамжуулан хэрэглэгчдэд шууд хүргэдэг.

    2. Бага сааталтай медиа урсгал
    Stadia-ийн талаар уншиж байхдаа зарим нийтлэлд дурдсан WebRTC-г байнга хардаг. WebRTC бол гайхалтай технологи бөгөөд үүлэн тоглоомд ашиглахад тохиромжтой гэдгийг би ойлгосон. WebRTC нь энгийн API-ээр дамжуулан вэб хөтчүүд болон гар утасны програмуудыг бодит цагийн харилцаагаар хангадаг төсөл юм. Энэ нь үе тэнгийн хоорондын холболтыг хангадаг, хэвлэл мэдээллийн хэрэгсэлд оновчтой, VP8, H264 зэрэг стандарт кодлогчтой.

    Би өндөр чанартай графикаас илүү хэрэглэгчийн туршлагыг хамгийн сайн байлгахыг чухалчилсан. Зарим алдагдлыг алгоритмд хүлээн зөвшөөрөх боломжтой. Google Stadia нь сервер дээрх зургийн хэмжээг багасгах нэмэлт алхамтай бөгөөд хүрээг үе тэнгийнхэндээ дамжуулахаас өмнө илүү өндөр чанартай болгож сайжруулдаг.

    3. Газарзүйн чиглүүлэлт бүхий хуваарилагдсан дэд бүтэц
    Шахалтын алгоритм болон код нь хичнээн оновчтой байсан ч сүлжээ нь хоцролтод хамгийн их хувь нэмэр оруулдаг шийдвэрлэх хүчин зүйл хэвээр байна. Архитектур нь эргэлтийн хугацааг (RTT) багасгахын тулд хэрэглэгчдэд хамгийн ойр байгаа серверийг хослуулах механизмтай байх ёстой. Архитектур нь дэлхий даяар тархсан 1 зохицуулагч, хэд хэдэн урсгал сервертэй байх ёстой: АНУ-ын Баруун, АНУ-ын Зүүн, Европ, Сингапур, Хятад. Бүх урсгал серверүүд бүрэн тусгаарлагдсан байх ёстой. Сервер сүлжээнд нэгдэх эсвэл гарах үед систем нь түгээлтээ тохируулах боломжтой. Тиймээс их ачаалалтай үед нэмэлт серверүүд нэмэх нь хэвтээ масштабыг нэмэгдүүлэх боломжийг олгодог.

    4. Хөтөчтэй нийцтэй байх
    Үүлэн тоглоом нь хэрэглэгчдээс хамгийн бага зүйлийг шаарддаг үед хамгийн сайн байдаг. Энэ нь хөтөч дээр ажиллах боломжтой гэсэн үг юм. Хөтөч нь тоглоомын туршлагыг хэрэглэгчдэд аль болох тохь тухтай болгож, програм хангамж, техник хангамжийг суулгахаас хамгаалдаг. Хөтөчүүд нь гар утасны болон ширээний хувилбаруудын хооронд платформ хоорондын функцийг хангахад тусалдаг. Аз болоход WebRTC нь янз бүрийн хөтөч дээр сайн дэмжигддэг.

    5. Тоглоомын интерфейс болон үйлчилгээг тодорхой салгах
    Би үүлэн тоглоомын үйлчилгээг платформ гэж үздэг. Хүн бүр платформтой юу ч холбох боломжтой байх ёстой. Одоо би нэгдсэн Либретр LibRetro нь SNES, GBA, PS зэрэг чимэг тоглоомуудад зориулсан үзэсгэлэнтэй тоглоомын эмулятор интерфейсийг санал болгодог тул үүлэн тоглоомын үйлчилгээтэй.

    6. Олон тоглогч, олон хүн тоглох, тоглоомтой гадаад холболт (гүн холбоос) хийх өрөөнүүд
    CloudRetro нь чимэг тоглоомуудад зориулсан CrowdPlay, Онлайн MultiPlayer зэрэг олон шинэ тоглоомуудыг дэмждэг. Хэрэв хэд хэдэн хэрэглэгчид өөр өөр компьютер дээр ижил гүнзгий холбоосыг нээвэл тэд ижил ажиллаж байгаа тоглоомыг харж, бүр нэгдэх боломжтой болно.

    Түүнчлэн, тоглоомын төлөвийг үүлэн санах ойд хадгалдаг. Энэ нь хэрэглэгчдэд хүссэн үедээ өөр төхөөрөмж дээр үргэлжлүүлэн тоглох боломжийг олгодог.

    7. Хэвтээ масштабтай
    Орчин үеийн аливаа SAAS-ийн нэгэн адил үүлэн тоглоомыг хэвтээ байдлаар өргөтгөх боломжтой байхаар зохион бүтээсэн байх ёстой. Зохицуулагч-ажилчдын загвар нь илүү их хөдөлгөөнд үйлчлэхийн тулд илүү олон ажилчдыг нэмэх боломжийг олгодог.

    8. Нэг үүлэнд холбогдоогүй
    CloudRetro-ийн дэд бүтцийг өөр өөр бүс нутагт зориулсан өөр өөр үүлэн үйлчилгээ үзүүлэгчид (Digital Ocean, Alibaba, захиалгат үйлчилгээ үзүүлэгч) байрлуулдаг. Би дэд бүтцэд зориулж Docker контейнерт ажиллахыг идэвхжүүлж, нэг үүлэн үйлчилгээ үзүүлэгч рүү түгжигдэхээс зайлсхийхийн тулд bash скрипт ашиглан сүлжээний тохиргоог хийдэг. Үүнийг WebRTC дээрх NAT Traversal-тай хослуулснаар бид CloudRetro-г ямар ч үүлэн платформ дээр, тэр ч байтугай ямар ч хэрэглэгчийн машин дээр байрлуулах уян хатан байдлыг бий болгож чадна.

    Архитектурын дизайн

    Ажилчин: (эсвэл дээр дурдсан урсгал сервер) тоглоомуудыг үржүүлж, кодчилолын шугамыг ажиллуулж, кодлогдсон медиаг хэрэглэгчдэд дамжуулдаг. Ажилчны тохиолдлууд дэлхий даяар тархсан бөгөөд ажилчин бүр олон хэрэглэгчийн сессийг нэгэн зэрэг удирдах боломжтой.

    Зохицуулагч: нь шинэ хэрэглэгчийг дамжуулахад хамгийн тохиромжтой ажилтантай хослуулах үүрэгтэй. Зохицуулагч нь WebSocket-ээр дамжуулан ажилчидтай харилцдаг.

    Тоглоомын төлөвийн хадгалалт: тоглоомын бүх мужид зориулсан төв алсын хадгалах сан. Энэ хадгалах сан нь алсаас хадгалах/ачаалах зэрэг чухал функцуудыг хангадаг.

    WebRTC дээрх нээлттэй эхийн үүлэн тоглоом: p2p, олон тоглогч, тэг хоцролт
    CloudRetro-ийн дээд түвшний архитектур

    Тусгай скрипт

    Доорх зурагт үзүүлсэн 1 ба 2-р алхамд шинэ хэрэглэгч CloudRetro-г нээх үед зохицуулагчийг бэлэн ажилчдын жагсаалтын хамт эхний хуудсанд оруулахыг хүсэх болно. Үүний дараа 3-р алхамд үйлчлүүлэгч HTTP ping хүсэлтийг ашиглан бүх нэр дэвшигчийн саатлыг тооцдог. Дараа нь энэ саатлын жагсаалтыг зохицуулагч руу буцааж илгээдэг бөгөөд ингэснээр хэрэглэгчдэд үйлчлэх хамгийн тохиромжтой ажилтныг тодорхойлох боломжтой болно. Доорх 4-р алхам нь тоглоомыг үүсгэдэг. Хэрэглэгч болон томилогдсон ажилтны хооронд WebRTC урсгал холболт бий болсон.
    WebRTC дээрх нээлттэй эхийн үүлэн тоглоом: p2p, олон тоглогч, тэг хоцролт
    Хандалтыг авсны дараа хэрэглэгчийн скрипт

    Ажилчин дотор юу байна

    Тоглоомын болон урсгал дамжуулах шугамууд нь ажилчны дотор тусад нь хадгалагдаж, интерфэйсээр дамжуулан тэнд мэдээлэл солилцдог. Одоогийн байдлаар энэхүү харилцаа холбоо нь санах ойд өгөгдөл дамжуулах замаар хийгддэг Голанг сувгууд ижил процесст. Дараагийн зорилго бол тусгаарлах, өөрөөр хэлбэл. өөр процессоор тоглоомыг бие даан эхлүүлэх.

    WebRTC дээрх нээлттэй эхийн үүлэн тоглоом: p2p, олон тоглогч, тэг хоцролт
    Ажилчдын бүрэлдэхүүн хэсгүүдийн харилцан үйлчлэл

    Үндсэн бүрэлдэхүүн хэсгүүд:

    • WebRTC: хэрэглэгчийн оролтыг хүлээн авч серверээс кодлогдсон зөөвөрлөгчийг гаргадаг клиент бүрэлдэхүүн хэсэг.
    • Тоглоомын эмулятор: тоглоомын бүрэлдэхүүн хэсэг. Libretro номын сангийн ачаар систем нь ижил процесс дотор тоглоомыг ажиллуулж, медиа болон оролтын урсгалыг дотооддоо таслан зогсоох боломжтой.
    • Тоглоомын фреймүүдийг авч, кодлогч руу илгээдэг.
    • Зураг/Аудио кодлогч: медиа фреймүүдийг авч, тэдгээрийг арын дэвсгэр дээр кодлож, кодлогдсон зураг/аудио гаргадаг кодлох хоолой.

    Реализация

    CloudRetro нь WebRTC-ийн үндсэн технологид тулгуурладаг тул Голанг хэрэгжүүлэлтийн нарийн ширийнийг судлахын өмнө би WebRTC-ийн тухай ярихаар шийдсэн. Энэ бол өгөгдөл дамжуулах секундын хоцрогдолд хүрэхэд надад маш их тусалсан гайхалтай технологи юм.

    WebRTC

    WebRTC нь энгийн API ашиглан уугуул гар утасны програмууд болон хөтчүүд дээр өндөр чанартай үе тэнгийн холболтыг хангах зорилготой юм.

    NAT дамжуулалт

    WebRTC нь NAT Traversal функцээрээ алдартай. WebRTC нь үе тэнгийнхэн хоорондын харилцаанд зориулагдсан. Үүний зорилго нь үе тэнгийн хоорондын харилцааны NAT гарц, галт ханаас зайлсхийж, хамгийн тохиромжтой шууд замыг олох явдал юм. ICE. Энэ үйл явцын нэг хэсэг болгон WebRTC API нь STUN серверүүдийг ашиглан таны нийтийн IP хаягийг олж, релей сервер рүү дамжуулдаг (ЭРГЭХ) шууд холболт үүсгэх боломжгүй үед.

    Гэсэн хэдий ч CloudRetro энэ функцийг бүрэн ашигладаггүй. Түүний үе тэнгийн холболт нь хэрэглэгчдийн хооронд биш, харин хэрэглэгчид болон үүл серверүүдийн хооронд байдаг. Загварын сервер тал нь ердийн хэрэглэгчийн төхөөрөмжөөс бага шууд холбооны хязгаарлалттай байдаг. Энэ нь сервер нь NAT-ийн ард байдаггүй тул ирж буй портуудыг урьдчилан нээх эсвэл нийтийн IP хаягийг шууд ашиглах боломжийг олгоно.

    Өмнө нь би уг төслийг Cloud Gaming-д зориулсан тоглоомын түгээлтийн платформ болгохыг хүсч байсан. Энэ санаа нь тоглоом бүтээгчдэд тоглоом, урсгалын эх сурвалжийг өгөх боломжийг олгох явдал байв. Мөн хэрэглэгчид үйлчилгээ үзүүлэгчтэй шууд харьцдаг. Ийм төвлөрсөн бус байдлаар, CloudRetro нь гуравдагч этгээдийн дамжуулалтын нөөцийг хэрэглэгчдэд холбох хүрээ бөгөөд үүнийг цаашид байршуулахаа больсон үед илүү өргөтгөх боломжтой болгодог. Энд WebRTC NAT Traversal-ийн үүрэг нь гуравдагч талын дамжуулалтын эх сурвалжууд дээр үе тэнгийн хоорондын холболтыг эхлүүлэхэд маш чухал бөгөөд бүтээгчид сүлжээнд холбогдоход хялбар болгодог.

    Видео шахалт

    Видео шахалт нь дамжуулах хоолойн зайлшгүй хэсэг бөгөөд жигд урсгалд ихээхэн хувь нэмэр оруулдаг. VP8/H264 видео кодчилолын нарийн ширийн зүйлийг мэдэх шаардлагагүй ч гэсэн ойлголтуудыг ойлгох нь видео дамжуулах хурдны сонголтыг ойлгох, гэнэтийн үйлдлийг дибаг хийх, хоцролтыг тохируулахад тусална.

    Алгоритм нь нийт кодлох хугацаа + сүлжээний дамжуулах хугацаа + код тайлах хугацааг аль болох бага байлгах ёстой тул стриминг үйлчилгээнд зориулж видеог шахах нь хэцүү байдаг. Үүнээс гадна, кодлох үйл явц нь тууштай, тасралтгүй байх ёстой. Зарим кодчилолын тохирол хамаарахгүй—жишээ нь, бид жижиг файлын хэмжээ болон код тайлах хугацаанаас илүү урт кодчилол хийх, эсвэл тогтворгүй шахалтыг ашиглах боломжгүй.

    Видео шахалтын цаад санаа нь хэрэглэгчдэд хүлээн зөвшөөрөгдсөн нарийвчлалын түвшинг хадгалахын зэрэгцээ шаардлагагүй мэдээллийг арилгах явдал юм. Алгоритм нь бие даасан статик зургийн жаазыг кодлохоос гадна өмнөх болон дараагийнхаас одоогийн фреймийг гаргадаг тул зөвхөн тэдгээрийн ялгааг илгээдэг. Пакмантай жишээнээс харахад зөвхөн дифференциал цэгүүд дамждаг.

    WebRTC дээрх нээлттэй эхийн үүлэн тоглоом: p2p, олон тоглогч, тэг хоцролт
    Жишээ болгон Pacman ашигласан видео хүрээнүүдийн харьцуулалт

    Аудио шахах

    Үүний нэгэн адил, аудио шахалтын алгоритм нь хүмүүст хүлээн зөвшөөрөгдөхгүй өгөгдлийг орхигдуулдаг. Opus бол одоогоор хамгийн сайн гүйцэтгэлтэй аудио кодлогч юм. Энэ нь RTP (Бодит цагийн тээврийн протокол) гэх мэт захиалгат датаграмын протоколоор аудио долгион дамжуулах зориулалттай. Түүний хоцролт нь mp3 болон aac-аас бага, чанар нь өндөр байдаг. Хугацаа нь ихэвчлэн 5~66,5 мс орчим байдаг.

    Пион, Голанг дахь WebRTC

    Ломбард нь WebRTC-ийг Голанг руу авчирдаг нээлттэй эхийн төсөл юм. Pion нь ердийн C++ WebRTC номын сангуудын оронд илүү сайн гүйцэтгэлтэй, Go интеграцчилалтай, WebRTC протоколууд дээрх хувилбарын удирдлагатай WebRTC-ийн унаган Голанг программ юм.

    Мөн номын сан нь секундын хоцрогдолтой олон гайхалтай суулгацтай дамжуулалтыг идэвхжүүлдэг. Энэ нь STUN, DTLS, SCTP гэх мэт өөрийн гэсэн хэрэгжилттэй. мөн QUIC болон WebAssembly-тай хийсэн зарим туршилтууд. Энэхүү нээлттэй эхийн номын сан нь өөрөө маш сайн баримт бичиг, сүлжээний протоколын хэрэгжилт, гайхалтай жишээнүүд бүхий сургалтын сайн эх сурвалж юм.

    Маш их хүсэл тэмүүлэлтэй бүтээгчээр удирдуулсан Pion нийгэмлэг нь WebRTC-ийн талаар маш олон чанартай хэлэлцүүлэг өрнүүлж, нэлээд идэвхтэй байдаг. Хэрэв та энэ технологийг сонирхож байвал нэгдээрэй http://pion.ly/slack - Та маш олон шинэ зүйлийг сурах болно.

    Голанг хэл дээр CloudRetro бичиж байна

    WebRTC дээрх нээлттэй эхийн үүлэн тоглоом: p2p, олон тоглогч, тэг хоцролт
    Go дахь ажилчны хэрэгжилт

    Сувгуудыг идэвхтэй ажиллуул

    Go сувгийн үзэсгэлэнтэй дизайны ачаар үйл явдлын урсгал болон зэрэгцэх асуудлууд маш хялбарчлагдсан. Диаграмын нэгэн адил өөр GoRoutines нь олон бүрэлдэхүүн хэсгүүдтэй зэрэгцээ ажилладаг. Бүрэлдэхүүн хэсэг бүр өөрийн төлөв байдлыг удирдаж, сувгаар холбогддог. Голангийн сонгомол батламж нь тоглоомонд нэг атомын үйл явдлыг боловсруулахад хүргэдэг (тоглоомын хачиг). Энэ нь энэ загварт түгжих шаардлагагүй гэсэн үг юм. Жишээлбэл, хэрэглэгч хадгалах үед тоглоомын төлөвийн бүрэн агшин зураг шаардлагатай. Хадгалалтыг дуусгах хүртэл энэ төлөв тасралтгүй байх ёстой. Тоглоомын тэмдэг бүрийн үед арын хэсэг нь зөвхөн хадгалах эсвэл оруулах үйлдлийг гүйцэтгэх боломжтой бөгөөд ингэснээр процессын урсгалыг аюулгүй болгодог.

    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

    Энэхүү Голанг загвар нь миний CrowdPlay болон Олон Тоглогчийн хэрэглээнд төгс тохирно. Энэ хэв маягийн дагуу нэг өрөөнд байгаа бүх хэрэглэгчийн оролтыг төв орох сувагт суулгасан болно. Тоглоомын медиаг нэг өрөөнд байгаа бүх хэрэглэгчдэд байрлуулна. Ийм байдлаар бид янз бүрийн хэрэглэгчдийн хэд хэдэн тоглоомын сесс хооронд тоглоомын төлөвийг хуваахад хүрдэг.

    WebRTC дээрх нээлттэй эхийн үүлэн тоглоом: p2p, олон тоглогч, тэг хоцролт
    Өөр өөр сесс хоорондын синхрончлол

    Голангын сул тал

    Голанг төгс биш. Суваг удаан байна. Блоклохтой харьцуулахад Go суваг нь зэрэгцээ болон урсгалтай үйл явдлуудыг зохицуулах хялбар арга боловч суваг нь хамгийн сайн гүйцэтгэлийг өгдөггүй. Сувгийн доор блоклох нарийн төвөгтэй логик байдаг. Тиймээс би гүйцэтгэлийг оновчтой болгохын тулд сувгийг солихдоо цоож, атомын утгыг дахин ашиглаж, хэрэгжилтэд зарим тохируулга хийсэн.

    Нэмж дурдахад Голанг дахь хог түүгчийг удирддаггүй бөгөөд энэ нь заримдаа сэжигтэй удаан зогсолт үүсгэдэг. Энэ нь бодит цагийн урсгалын програмд ​​ихээхэн саад учруулдаг.

    COG

    Төсөл нь одоо байгаа нээлттэй эхийн Golang VP8/H264 номын санг медиа шахалтад, Libretro-г тоглоомын эмуляторуудад ашигладаг. Эдгээр бүх сангууд нь Go дахь Си номын сангийн энгийн багцууд юм COG. Зарим сул талуудыг жагсаасан болно Энэ бичлэгийг Дэйв Чейни бичсэн. Надад тулгарсан асуудлууд:

    • Golang RecoveryCrash-тэй байсан ч CGO-д осол гарах чадваргүй байх;
    • CGO-ийн нарийвчилсан асуудлуудыг илрүүлэх боломжгүй үед гүйцэтгэлийн саад тотгорыг тодорхойлох чадваргүй байдал.

    дүгнэлт

    Би үүлэн тоглоомын үйлчилгээг ойлгож, найзуудтайгаа онлайнаар дурсахуйгаар чимэг тоглоом тоглоход туслах платформыг бий болгох зорилгодоо хүрсэн. Пионы номын сан болон Пионы нийгэмлэгийн дэмжлэггүйгээр энэ төслийг хэрэгжүүлэх боломжгүй байсан. Үүнийг эрчимтэй хөгжүүлж байгаад би маш их талархаж байна. WebRTC болон Pion-ийн өгсөн энгийн API-ууд нь нэгдмэл байдлыг хангасан. Би үе тэнгийнхэн хоорондын (P2P) харилцааны талаар урьдчилж мэдлэггүй байсан ч тэр долоо хоногт миний үзэл баримтлалын анхны баталгаа гарсан.

    Интеграцчлалд хялбар хэдий ч P2P урсгал нь компьютерийн шинжлэх ухааны маш нарийн төвөгтэй талбар юм. Тэрээр үе тэнгийн хоорондын сессийг үүсгэхийн тулд IP болон NAT гэх мэт урт хугацааны сүлжээний архитектурын нарийн төвөгтэй байдлыг даван туулах ёстой. Энэ төсөл дээр ажиллаж байхдаа би сүлжээ болон гүйцэтгэлийн оновчлолын талаар маш их үнэ цэнэтэй мэдлэг олж авсан тул хүн бүрийг WebRTC ашиглан P2P бүтээгдэхүүн бүтээхийг хичээхийг уриалж байна.

    CloudRetro нь чимэг тоглоомчдын хувьд миний хүлээж байсан бүх хэрэглээнд нийцдэг. Гэхдээ энэ төслийн хүрээнд сүлжээг илүү найдвартай, гүйцэтгэлтэй болгох, тоглоомын графикийг өндөр чанартайгаар хангах, эсвэл хэрэглэгчид хоорондоо тоглоом хуваалцах зэрэг олон зүйлийг сайжруулах боломжтой гэж бодож байна. Би энэ тал дээр шаргуу ажиллаж байна. Дагагаарай төсөл мөн таалагдвал дэмжээрэй.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх