Te kawe i tetahi keemu maha mai i C++ ki te ipurangi me Cheerp, WebRTC me Firebase

Whakataki

to tatou kamupene Hangarau Hiringa he otinga mo te kawe i nga tono papamahi tuku iho ki te ipurangi. To tatou C++ compiler tangi hanga he huinga o WebAssembly me JavaScript, e whakarato ana e rua taunekeneke pūtirotiro ngawari, me te mahi teitei.

Hei tauira mo tana tono, i whakatau matou ki te kawe i tetahi keemu maha ki te ipurangi ka kowhiria Teeworlds. Ko Teeworlds he keemu retro 2D maha me te hapori iti engari kaha o nga kaitakaro (tae atu ki ahau!). He iti noa i runga i nga rauemi kua tangohia me nga whakaritenga PTM me te GPU - he kaitono pai.

Te kawe i tetahi keemu maha mai i C++ ki te ipurangi me Cheerp, WebRTC me Firebase
Rere ana i te Tirotiro Teeworlds

I whakatau matou ki te whakamahi i tenei kaupapa hei whakamatautau rongoā whānui mō te tauranga waehere whatunga ki te tukutuku. I te nuinga o te waa ka mahia tenei i nga huarahi e whai ake nei:

  • XMLHttpRequest/fetch, mena ko te waahanga whatunga ko nga tono HTTP anake, ranei
  • Paetukutuku.

Ko nga otinga e rua e hiahia ana ki te manaaki i tetahi waahanga tūmau i te taha o te tūmau, kaore hoki e whakaaetia kia whakamahia hei kawa kawe UDP. He mea nui tenei mo nga tono tuuturu penei i te rorohiko hui ataata me nga keemu, na te mea ka whakamanahia te tuku me te raupapa o nga paatete kawa TCP ka waiho hei arai ki te iti te torohūtanga.

He huarahi tuatoru - whakamahia te whatunga mai i te tirotiro: WebRTC.

RTCDataChannel Ka tautokohia e ia te tuku pono me te kore pono (i te keehi whakamutunga ka ngana ki te whakamahi i te UDP hei kawa kawe i nga wa katoa e taea ana), ka taea te whakamahi me te tūmau mamao me waenga i nga kaitirotiro. Ko te tikanga ka taea e taatau te kawe i te tono katoa ki te tirotiro, tae atu ki te waahanga tūmau!

Heoi, he uaua ano tenei: i mua i te wa e korero ai nga hoa WebRTC e rua, me mahi he ruru-a-ringa tino uaua ki te hono atu, e hiahia ana kia maha nga hinonga-tuatoru (he tūmau tohu me te kotahi, neke atu ranei nga tūmau. STUN/TANGI).

Ko te mea pai, ka hiahia matou ki te hanga i tetahi API whatunga e whakamahi ana i te WebRTC i roto, engari e tata ana ki te atanga UDP Sockets e kore e hiahia ki te whakatu hononga.

Ma tenei ka taea e matou te whakamahi i te WebRTC me te kore e whakaatu i nga korero matatini ki te waehere tono (i hiahia matou ki te whakarereke i nga mea iti i roto i ta maatau kaupapa).

WebRTC iti

Ko te WebRTC he huinga API e waatea ana i roto i nga kaitirotiro e whakarato ana i nga hoa-ki-hoa tuku oro, ataata me nga raraunga koretake.

Ka whakatauhia te hononga i waenga i nga hoa (ahakoa he NAT kei tetahi taha e rua ranei) ma te whakamahi i nga tūmau STUN me/ranei TURN na roto i te tikanga e kiia nei ko ICE. Ka whakawhitihia e nga hoa nga korero ICE me nga tawhā hongere ma te tuku me te whakautu o te kawa SDP.

Aue! E hia nga whakapoto i te wa kotahi? Me whakamarama poto he aha te tikanga o enei kupu:

  • Wātū Taputapu Takahanga mo te NAT (STUN) — he kawa mo te whakawhiti i te NAT me te whiwhi takirua (IP, tauranga) mo te whakawhiti korero tika me te kaihautu. Mena ka taea e ia te whakaoti i tana mahi, ka taea e nga hoa te whakawhiti korero ki a raatau ano.
  • Te Whakawhiti Ma te Relay huri noa i te NAT (TANGI) ka whakamahia hoki mo te whakawhiti NAT, engari ka whakatinanahia ma te tuku raraunga ma te takawaenga ka kitea e nga hoa e rua. Ka taapirihia te waatea me te utu nui atu ki te whakatinana i a STUN (na te mea ka whakamahia puta noa i te katoa o nga huihuinga whakawhitiwhiti korero), engari i etahi wa koinei anake te whiringa.
  • Te Whakaputanga Hononga Pahekoheko (ICE) i whakamahia ki te whiriwhiri i te huarahi tino pai mo te hono atu i nga hoa e rua i runga i nga korero i puta mai i te hono tika i nga hoa, tae atu ki nga korero ka riro mai i etahi o nga tūmau STUN me TURN.
  • Kawa Whakaahuatanga Wātū (RDS) he whakatakotoranga mo te whakaahua i nga tawhā hongere hononga, hei tauira, nga kaitono ICE, nga kotēkē rongorau (i roto i te take o te hongere oro / ataata), me etahi atu ... Ka tukuna e tetahi o nga hoa he Whakaaetanga SDP, ka whakautu te tuarua me te Whakautu SDP . I muri i tenei, ka hangaia he hongere.

Hei hanga hononga pera, me kohia e nga hoa nga korero ka whiwhi mai i nga kaitoro STUN me TURN me te whakawhiti ki a raatau ano.

Ko te raru ko te mea kare ano ratou i te kaha ki te whakawhiti korero tika, na reira me noho he tikanga ki waho o te roopu hei whakawhiti i enei raraunga: he tūmau tohu.

He tino ngawari te tūmau tohu na te mea ko tana mahi anake ko te tuku raraunga i waenga i nga hoa i roto i te wahanga ruru-a-ringa (e whakaatu ana i te hoahoa i raro nei).

Te kawe i tetahi keemu maha mai i C++ ki te ipurangi me Cheerp, WebRTC me Firebase
Hoahoa raupapa ruru ringa a WebRTC ngawari

Teeworlds Network Model Overview

He tino ngawari te hoahoanga whatunga Teeworlds:

  • Ko nga waahanga kiritaki me te tūmau he kaupapa rereke e rua.
  • Ka uru atu nga kaihoko ki te keemu ma te hono atu ki tetahi o nga kaitoro maha, ka whakahaerehia e ia he keemu kotahi anake i ia wa.
  • Ko nga whakawhitinga raraunga katoa i roto i te keemu ka mahia ma te tūmau.
  • Ka whakamahia he tūmau matua motuhake hei kohi rārangi o ngā tūmau tūmatanui katoa e whakaatuhia ana ki te kiritaki kēmu.

Ma te whakamahi i te WebRTC mo te whakawhiti raraunga, ka taea e taatau te whakawhiti i te waahanga tūmau o te keemu ki te tirotiro kei reira te kaihoko. He whai waahi nui tenei ki a tatou ...

Peia atu nga tūmau

He painga pai te kore o te arorau o te tūmau: ka taea e tatou te tuku i te tono katoa hei ihirangi pateko i runga i nga wharangi Github, i runga ranei i a maatau ake taputapu kei muri Cloudflare, na reira ka whakarite kia tere te tango me te wa roa mo te kore utu. Inaa, ka wareware tatou ki a raatau, a mena ka waimarie tatou ka rongonuihia te keemu, karekau e tika kia whakahoutia nga hanganga.

Heoi, kia mahi te punaha, me whakamahi tonu tatou i tetahi hoahoanga o waho:

  • Kotahi, neke atu ranei nga tūmau STUN: He maha nga whiringa koreutu hei whiriwhiri mai.
  • Kia kotahi te tūmau TURN: karekau he whiringa kore utu i konei, na ka taea e taatau te whakarite i a maatau ake, te utu ranei mo te ratonga. Waimarie, ko te nuinga o nga wa ka taea te whakatuu hononga ma roto i nga kaitoro STUN (me te whakarato p2p pono), engari ka hiahiatia a TURN hei whiringa takahuri.
  • Tūmau Waitohu: Kaore i rite ki era atu waahanga e rua, kaore i te whakatauhia te tohu. He aha te kawenga a te tūmau tohu i runga i te tono. I to maatau, i mua i te whakatuu hononga, he mea tika ki te whakawhiti i te iti o nga raraunga.
  • Teeworlds Master Server: Ka whakamahia e etahi atu tūmau ki te panui i to ratau oranga me nga kaihoko ki te rapu i nga kaitoro a te iwi. Ahakoa kaore e hiahiatia ana (ka taea e nga kaihoko te hono atu ki tetahi tūmau e mohio ana a-ringa), he pai ki te whai kia uru atu nga kaitakaro ki nga keemu me nga tangata ohorere.

I whakatau matou ki te whakamahi i nga tūmau STUN kore utu a Google, ka tukuna e matou tetahi tūmau TURN.

Mo nga tohu whakamutunga e rua i whakamahia e matou Firebase:

  • He tino ngawari te whakatinanatanga o te tūmau matua o Teeworlds: hei rarangi taonga kei roto nga korero (ingoa, IP, mapi, aratau, ...) o ia tūmau hohe. Ka whakaputahia, ka whakahouhia e nga Kaitono a raatau ake mea, ka tangohia e nga kaihoko te rarangi katoa ka whakaatu ki te kaitakaro. Ka whakaatuhia ano e matou te rarangi i runga i te wharangi kaainga hei HTML kia taea e nga kaitakaro te paato noa i te tūmau ka haria tika atu ki te keemu.
  • Ko te tohu tohu e hono tata ana ki a maatau turanga turanga, e whakaahuatia ana i te waahanga e whai ake nei.

Te kawe i tetahi keemu maha mai i C++ ki te ipurangi me Cheerp, WebRTC me Firebase
Rarangi o nga kaitoro i roto i te keemu me te wharangi kaainga

Te whakatinanatanga o nga turanga

Kei te pirangi matou ki te hanga API e tata ana ki te Posix UDP Sockets hei whakaiti i te maha o nga huringa e hiahiatia ana.

Kei te hiahia hoki matou ki te whakatinana i te iti rawa e hiahiatia ana mo te whakawhiti raraunga ngawari ake i runga i te whatunga.

Hei tauira, kaore e hiahiatia he ararere tuturu: ko nga hoa katoa kei runga i te "LAN mariko" kotahi e hono ana ki tetahi tauira patengi raraunga Firebase.

No reira, kaore matou e hiahia ki nga wahitau IP ahurei: ko nga uara matua Firebase ahurei (he rite ki nga ingoa rohe) e ranea ana ki te tautuhi i nga hoa, a ka tukuna e ia hoa o te rohe nga wahitau IP "rūpahu" ki ia matua me whakamaori. Ka whakakorea katoatia e tenei te hiahia mo te taumahi wahitau IP o te ao, he mahi kore-iti.

Anei te iti rawa o te API hei whakatinana:

// Create and destroy a socket
int socket();
int close(int fd);
// Bind a socket to a port, and publish it on Firebase
int bind(int fd, AddrInfo* addr);
// Send a packet. This lazily create a WebRTC connection to the 
// peer when necessary
int sendto(int fd, uint8_t* buf, int len, const AddrInfo* addr);
// Receive the packets destined to this socket
int recvfrom(int fd, uint8_t* buf, int len, AddrInfo* addr);
// Be notified when new packets arrived
int recvCallback(Callback cb);
// Obtain a local ip address for this peer key
uint32_t resolve(client::String* key);
// Get the peer key for this ip
String* reverseResolve(uint32_t addr);
// Get the local peer key
String* local_key();
// Initialize the library with the given Firebase database and 
// WebRTc connection options
void init(client::FirebaseConfig* fb, client::RTCConfiguration* ice);

He ngawari te API me te rite ki te Posix Sockets API, engari he iti noa nga rereketanga: te takiuru hokinga waea, te tautapa i nga IP rohe, me nga hononga mangere.

Te Rehita Waea Whakahoki

Ahakoa ka whakamahia e te kaupapa taketake te I/O kore-aukati, me whakahoki ano te waehere kia rere i roto i te tirotiro tukutuku.

Ko te take o tenei ko te takahanga takahanga i roto i te kaitirotiro kua huna mai i te kaupapa (he JavaScript, WebAssembly ranei).

I roto i te taiao taketake ka taea e tatou te tuhi waehere penei

while(running) {
  select(...); // wait for I/O events
  while(true) {
    int r = readfrom(...); // try to read
    if (r < 0 && errno == EWOULDBLOCK) // no more data available
      break;
    ...
  }
  ...
}

Mena kua huna te takahanga ki a tatou, katahi ka huri kia penei:

auto cb = []() { // this will be called when new data is available
  while(true) {
    int r = readfrom(...); // try to read
    if (r < 0 && errno == EWOULDBLOCK) // no more data available
      break;
    ...
  }
  ...
};
recvCallback(cb); // register the callback

Taumahi IP rohe

Ko nga TT node i roto i to tatou "whatunga" ehara i te wahitau IP, engari ko nga taviri Firebase (he aho penei te ahua: -LmEC50PYZLCiCP-vqde ).

He watea tenei na te mea kaore e hiahiatia he tikanga mo te tautapa i nga IP me te tirotiro i o raatau ahurei (me te whakakore i muri i te momotu a te kiritaki), engari he mea tika kia tautuhia nga hoa ma te uara tau.

Koinei te mea e whakamahia ana nga mahi. resolve и reverseResolve: Ka whiwhi te tono i te uara aho o te taviri (ma te whakauru kaiwhakamahi, ma te tūmau matua ranei), ka taea te huri ki tetahi wahitau IP mo te whakamahi o roto. Ko te toenga o te API ka whiwhi i tenei uara hei utu mo te aho mo te ngawari.

He rite tenei ki te tirotiro DNS, engari ka mahia i te rohe ki runga i te kiritaki.

Arā, kaore e taea te tiri i nga wahitau IP ki waenga i nga kaihoko rereke, a, ki te hiahiatia etahi momo tohu tohu o te ao, me hanga he huarahi rereke.

Hononga mangere

Kaore e hiahiatia he hononga a UDP, engari kua kitehia e matou, me roa te tukanga hononga hono a WebRTC i mua i tana tiimata ki te whakawhiti raraunga i waenga i nga hoa tokorua.

Mena kei te pirangi matou ki te whakarato i taua taumata tangohanga, (sendto/recvfrom me nga hoa noho noa kaore he hononga i mua), katahi me mahi he hononga "mangere" (kua roa) i roto i te API.

Koinei te mea ka tupu i te wa o te whakawhitiwhiti korero i waenga i te "tumau" me te "kiritaki" i te wa e whakamahi ana i te UDP, me nga mahi a to maatau whare pukapuka:

  • Nga waea a te tūmau bind()ki te korero ki te punaha whakahaere kei te pirangi ia ki te whiwhi paakete i runga i te tauranga kua tohua.

Engari, ka whakaputahia e matou he tauranga tuwhera ki Firebase i raro i te taviri tūmau me te whakarongo mo nga huihuinga i roto i tana subtree.

  • Nga waea a te tūmau recvfrom(), e whakaae ana ki nga paatete ka puta mai i tetahi kaihautu i runga i tenei tauranga.

I roto i to maatau, me tirotirohia te rarangi taumai o nga paatete ka tukuna ki tenei tauranga.

Kei ia tauranga tana ake rarangi, a ka taapirihia e matou te puna me nga tauranga taunga ki te timatanga o nga tohu raraunga WebRTC kia mohio ai matou ko tehea rarangi ka tukuna atu ina tae mai he kete hou.

Ko te waea kaore i te aukati, na mena karekau he putea, ka hoki noa mai -1 ka whakatauhia errno=EWOULDBLOCK.

  • Ka whiwhi te kiritaki i te IP me te tauranga o te tūmau na etahi tikanga o waho, me te waea sendto(). Ka karanga ano tenei i roto. bind(), no reira i muri mai recvfrom() ka whiwhi i te whakautu me te kore e tino mahia te here.

I roto i to maatau, ka whakawhiwhia e te kiritaki ki waho te taviri aho me te whakamahi i te mahi resolve() ki te whiwhi wāhitau IP.

I tenei wa, ka timatahia e matou he ruuruu WebRTC mena kaore ano nga hoa e rua e hono ana ki a raatau. Ko nga hononga ki nga tauranga rereke o te hoa kotahi e whakamahi ana i te WebRTC DataChannel.

Ka mahi autaki ano matou bind()kia taea ai e te tūmau te hono anō i te wā e whai ake nei sendto() kei katia mo etahi take.

Ka whakamohiotia te tūmau mo te hononga o te kiritaki ina tuhia e te kiritaki tana tuku SDP i raro i nga korero tauranga tūmau i Firebase, ka whakautu te tūmau me tana whakautu ki reira.

Ko te hoahoa i raro nei e whakaatu ana i tetahi tauira o te rere karere mo te kaupapa turanga me te tuku i te karere tuatahi mai i te kiritaki ki te tūmau:

Te kawe i tetahi keemu maha mai i C++ ki te ipurangi me Cheerp, WebRTC me Firebase
Whakaotia te hoahoa o te wahanga hononga i waenga i te kiritaki me te tūmau

mutunga

Mena kua panui koe i tenei tawhiti, kei te pirangi koe ki te kite i te kaupapa e mahi ana. Ka taea te takaro i te keemu teeworlds.leaningtech.com, whakamatauria!


Whakahoahoa i waenga i nga hoa mahi

Kei te waatea noa te waehere whare pukapuka whatunga ki GitHub. Hono mai ki te korerorero i runga i ta maatau hongere i Tino!

Source: will.com

Tāpiri i te kōrero