Di derbarê modela torê de di lîstikên ji bo destpêkan de

Di derbarê modela torê de di lîstikên ji bo destpêkan de
Van du hefteyên dawî ez ji bo lîstika xwe li ser motora serhêl dixebitim. Berî vê yekê, min qet tiştek di derbarê torê di lîstikan de nizanibû, ji ber vê yekê min gelek gotar xwend û gelek ceribandin kirin da ku hemî têgehan fam bikim û bikaribim motora torê ya xwe binivîsim.

Di vê rêbernameyê de, ez dixwazim têgehên cihêreng ên ku hûn hewce ne ku berî nivîsandina motora lîstika xwe fêr bibin, û her weha çavkanî û gotarên çêtirîn ji bo fêrbûna wan bi we re parve bikim.

Bi gelemperî, du celebên sereke yên mîmariya torê hene: peer-to-peer û muwekîlê-server. Di mîmariya peer-to-peer (p2p) de, dane di navbera her cotên lîstikvanên girêdayî de têne veguheztin, dema ku di mîmariya xerîdar-server de, dane tenê di navbera lîstikvan û serverê de têne veguheztin.

Her çend mîmariya peer-to-peer hîn jî di hin lîstikan de tê bikar anîn, lê xerîdar-server standard e: bicîhkirin hêsantir e, pêdiviya kanalek piçûktir heye, û parastina li hember xapandinê hêsantir dike. Ji ber vê yekê, di vê tutoriyê de em ê li ser mîmariya xerîdar-server bisekinin.

Bi taybetî, em herî zêde bi serverên otorîter re eleqedar dibin: di pergalên weha de, server her gav rast e. Mînakî, heke lîstikvanek difikire ku ew li ser koordînatan e (10, 5), û server jê re dibêje ku ew di (5, 3) de ye, wê hingê pêdivî ye ku xerîdar pozîsyona xwe bi ya ku ji hêla server ve hatî ragihandin veguherîne, û ne cîgir. berevajî. Bikaranîna serverên rayedar naskirina xapînokan hêsantir dike.

Pergalên lîstika torê sê hêmanên sereke hene:

  • Protokola veguhastinê: çawa data di navbera xerîdar û serverê de têne veguheztin.
  • Protokola serîlêdanê: tiştê ku ji xerîdar ji serverê re û ji serverê ji xerîdaran re û bi çi şeklê tê veguheztin.
  • Mantiqa serîlêdanê: çawa daneyên veguheztin ji bo nûvekirina rewşa xerîdar û serverê tê bikar anîn.

Pir girîng e ku meriv rola her beşê û kêşeyên bi wan re têkildar fam bike.

Protokola veguhastinê

Gava yekem ev e ku meriv protokolek ji bo veguheztina daneyê di navbera server û xerîdaran de hilbijêrin. Ji bo vê yekê du protokolên Înternetê hene: TCP и UDP. Lê hûn dikarin li ser bingeha yek ji wan protokola veguhastina xwe biafirînin an pirtûkxaneyek ku wan bikar tîne bikar bînin.

Berhevdana TCP û UDP

Herdu TCP û UDP li ser bingeh in IP. IP dihêle ku pakêtek ji çavkaniyek ji wergirek were şandin, lê garantî nake ku pakêta şandî zû yan dereng dê bigihîje wergir, ku ew ê bi kêmanî carekê bigihîje wê, û rêza pakêtan dê rast bigihîje. emir. Digel vê yekê, pakêtek tenê dikare hejmarek sînorkirî ya daneyê, ku ji hêla nirxê ve hatî dayîn, bigire Mtu.

UDP li ser IP-ê tenê qatek zirav e. Ji ber vê yekê, ew heman sînor hene. Berevajî vê, TCP gelek taybetmendiyên xwe hene. Ew pêwendiyek pêbawer, birêkûpêk di navbera du nokan de bi kontrolkirina xeletiyê peyda dike. Ji ber vê yekê, TCP pir hêsan e û di gelek protokolên din de tê bikar anîn, mînakî. HTTP, FTP и SMTP. Lê van hemî taybetmendiyan bi bihayek têne: derengxistin.

Ji bo ku fêm bikin ka çima van fonksiyonan dibe sedema derengbûnê, divê em fêm bikin ka TCP çawa dixebite. Gava ku girêkek dişîne pakêtek ji girêka wergir re dişîne, ew hêvî dike ku pejirandinek (ACK) bistîne. Ger piştî demek diyar ew wê nestîne (ji ber ku pakêt an pejirandî winda bûye, an ji ber sedemek din), wê hingê pakêtê ji nû ve dişîne. Wekî din, TCP garantî dike ku pakêt di rêza rast de têne wergirtin, ji ber vê yekê heya ku pakêta winda neyê wergirtin, hemî pakêtên din nikarin bêne pêvajo kirin, tevî ku ew jixwe ji hêla mêvandarê wergir ve hatine wergirtin.

Lê wekî ku hûn dikarin xeyal bikin, derengiya di lîstikên piralîker de pir girîng e, nemaze di celebên çalak-pakkirî yên mîna FPS de. Ji ber vê yekê gelek lîstik UDP bi protokola xwe bikar tînin.

Protokolek bingehîn a UDP-ê dikare ji ber sedemên cihêreng ji TCP-ê bikêrtir be. Mînakî, ew dikare hin pakêtan wekî pêbawer û yên din wekî nebawer nîşan bide. Ji ber vê yekê, ferq nake ka pakêta nebawer digihîje wergir. An jî ew dikare gelek tîrêjên daneyê bişopîne da ku pakêtek winda di yek tîrêjê de tîrêjên mayî hêdî neke. Mînakî, dibe ku mijarek ji bo têketina lîstikvan û mijarek din jî ji bo peyamên chatê hebe. Ger peyamek sohbetê ya ku ne lezgîn e winda bibe, ew ê têketina bilez hêdî neke. An jî protokolek xwedan dibe ku pêbaweriyê ji TCP-ê cûda bicîh bîne da ku di hawîrdorek lîstika vîdyoyê de bikêrtir be.

Ji ber vê yekê, ger TCP ew qas xwar bike, wê hingê em ê protokola veguheztina xwe ya li ser bingeha UDP biafirînin?

Ew hinekî tevlihevtir e. Her çend TCP ji bo pergalên torê yên lîstikê hema hema nebaş e, ew dikare ji bo lîstika weya taybetî pir baş bixebite û wextê weya hêja xilas bike. Mînakî, dereng dibe ku ne pirsgirêkek be ji bo lîstikek zivirî an lîstikek ku tenê li ser torên LAN-ê were lîstin, ku dereng û windabûna pakêtê ji ya Înternetê pir kêmtir e.

Gelek lîstikên serketî, di nav de World of Warcraft, Minecraft û Terraria, TCP bikar tînin. Lêbelê, pir FPS protokolên xwe yên UDP-ê bikar tînin, ji ber vê yekê em ê li jêr bêtir li ser wan biaxivin.

Heke hûn biryar didin ku TCP bikar bînin, bisekinin ku ew neçalak e algorîtmaya Nagle, ji ber ku ew berî şandina pakêtan tampon dike, ku tê vê wateyê ku ew derengbûnê zêde dike.

Ji bo bêtir fêrbûna cûdahiyên di navbera UDP û TCP-ê de di çarçoveya lîstikên piralî de, hûn dikarin gotara Glenn Fiedler bixwînin. UDP vs. TCP.

Protokola xwedan

Ji ber vê yekê hûn dixwazin protokola veguhastina xwe biafirînin, lê hûn nizanin ji ku dest pê bikin? Hûn bi şens in ji ber ku Glenn Fiedler li ser vê yekê du gotarên ecêb nivîsandine. Hûn ê di wan de gelek ramanên jîr bibînin.

Gotara yekem Tora ji bo Bernameçêkerên Lîstikê 2008, ji ya duyemîn hêsantir, Avakirina Protokola Tora Lîstikê 2016. Ez pêşniyar dikim ku hûn bi ya kevintir dest pê bikin.

Têbînî ku Glenn Fiedler pêşniyarek mezin e ku li ser bingeha UDP-ê protokolek xwerû bikar tîne. Û piştî xwendina gotarên wî, hûn ê belkî nêrîna wî qebûl bikin ku TCP di lîstikên vîdyoyê de kêmasiyên ciddî hene, û hûn ê bixwazin protokola xwe bicîh bînin.

Lê heke hûn di torê de nû ne, ji xwe re qenciyek bikin û TCP an pirtûkxaneyek bikar bînin. Ji bo ku hûn protokola veguheztina xwe bi serfirazî bicîh bikin, hûn hewce ne ku pêşî gelek tiştan fêr bibin.

pirtûkxaneyên torê

Heke hûn hewceyê tiştek ji TCP-ê bikêrtir hewce ne, lê hûn naxwazin ku hûn di nav tengasiya pêkanîna protokola xwe de derbas bibin û pir hûrgulî biçin, hûn dikarin pirtûkxaneyek torê bikar bînin. Gelek ji wan hene:

Min hemî wan ceriband nekiriye, lê ez ENet tercîh dikim ji ber ku karanîna wê hêsan û pêbawer e. Wekî din, ew xwedan belgeyek zelal û ji bo destpêkek dersdar e.

Protokola Veguhastinê: Encam

Bi kurtasî: du protokolên veguhastinê yên sereke hene: TCP û UDP. TCP gelek taybetmendiyên kêrhatî hene: pêbawerî, parastina fermana pakêtê, tespîtkirina xeletiyê. UDP van hemîyan tune, lê TCP ji hêla cewherê xwe ve dereng zêde kiriye, ku ji bo hin lîstikan nayê pejirandin. Ango, ji bo misogerkirina derengiya kêm, hûn dikarin protokola xweya xwe li ser bingeha UDP biafirînin an pirtûkxaneyek bikar bînin ku protokolek veguheztinê li ser UDP bicîh tîne û ji bo lîstikên vîdyoyê yên pirzimanî tête adaptekirin.

Hilbijartina di navbera TCP, UDP û pirtûkxaneyê de bi çend faktoran ve girêdayî ye. Pêşîn, ji hewcedariyên lîstikê: gelo hewcedariya wê bi derengiya kêm heye? Ya duyemîn, ji daxwazên protokola serîlêdanê: Ma ew hewceyê protokolek pêbawer e? Wekî ku em ê di beşa paşîn de bibînin, gengaz e ku meriv protokolek serîlêdanê biafirîne ku ji bo protokolek nebawer pir maqûl e. Di dawiyê de, hûn hewce ne ku ezmûna pêşdebirê motora torê jî bihesibînin.

Du şîretên min hene:

  • Protokola veguheztinê ji serîlêdana mayî bi qasî ku gengaz be jêbirin da ku ew bi hêsanî were guheztin bêyî ku hemî kodê ji nû ve were nivîsandin.
  • Zêde optimîze nekin. Heke hûn ne pisporê torê ne û ne pêbawer in ku hûn hewceyê protokola veguheztinê ya xwerû ya UDP-ê ne, hûn dikarin bi TCP an pirtûkxaneyek ku pêbaweriyê peyda dike dest pê bikin, û dûv re performansê ceribandin û bipîvin. Ger pirsgirêk derkevin û hûn pê ewle ne ku sedem protokola veguheztinê ye, wê hingê dibe ku dem be ku hûn protokola veguhastina xwe biafirînin.

Di dawiya vê beşê de, ez pêşniyar dikim ku hûn bixwînin Destpêka Bernamekirina Lîstika Multiplayer ji hêla Brian Hook ve, ku gelek mijarên ku li vir têne nîqaş kirin vedihewîne.

Protokola serîlêdanê

Naha ku em dikarin daneyan di navbera xerîdar û serverê de biguhezînin, pêdivî ye ku em biryar bidin ka kîjan daneyan û bi çi formê veguhezînin.

Pîlana klasîk ev e ku xerîdar têketin an çalakiyan ji serverê re dişînin, û server rewşa lîstika heyî ji xerîdaran re dişîne.

Pêşkêşker ne dewleta tevahî, lê dewletek fîlterkirî bi hebûnên ku li nêzê lîstikvanê ne dişîne. Ew ji ber sê sedeman vê yekê dike. Ya yekem, dibe ku dewleta tevahî pir mezin be ku di frekansa bilind de were veguheztin. Ya duyemîn, xerîdar bi gelemperî bi daneyên dîtbar û bihîstwerî re eleqedar dibin, ji ber ku piraniya mentiqê lîstikê li ser servera lîstikê tê simul kirin. Ya sêyemîn, di hin lîstikan de pêdivî ye ku lîstikvan hin daneyan nizanibe, mînakî, pozîsyona dijmin li aliyê din ê nexşeyê, wekî din ew dikare pakêtan bihîne û tam zanibe ku li ku derê biçe da ku wî bikuje.

Serialization

Gava yekem ev e ku em daneya ku em dixwazin bişînin (veguheztin an rewşa lîstikê) veguherînin formatek ji bo veguheztinê. Ev pêvajo tê gotin serialization.

Ramana ku tavilê tê hişê xwe ev e ku meriv formatek meriv-xwende, wekî JSON an XML bikar bîne. Lê ev ê bi tevahî bêbandor be û dê piraniya kanalê winda bike.

Tête pêşniyar kirin ku li şûna wê forma binary bikar bînin, ku pir tevlihevtir e. Ango pakêt dê tenê çend bît hebin. Li vir pirsgirêkek heye ku meriv bifikire fermana byte, ku dibe ku li ser komputerên cûda cûda bibin.

Ji bo serialîzekirina daneyan, hûn dikarin pirtûkxaneyek bikar bînin, mînakî:

Tenê pê ewle bine ku pirtûkxane arşîvên portable diafirîne û xema endiannessê dike.

Çareseriyek alternatîf ev e ku hûn wê bi xwe bicîh bikin; ew bi taybetî ne dijwar e, nemaze heke hûn ji koda xwe re nêzîkatiyek dane-navendî bikar bînin. Wekî din, ew ê bihêle ku hûn xweşbîniyên ku di dema karanîna pirtûkxaneyê de her gav ne mimkun in pêk bînin.

Glenn Fiedler du gotar li ser serialîzasyonê nivîsand: Pakêtên xwendin û nivîsandinê и Stratejiyên Serialization.

Compression

Mîqdara daneya ku di navbera xerîdar û serverê de hatî veguheztin ji hêla bandwidtha kanalê ve tê sînordar kirin. Tevlihevkirina daneyê dê bihêle ku hûn di her wêneyek wêneyê de bêtir daneyê veguhezînin, frekansa nûvekirinê zêde bikin, an jî tenê hewcedariyên kanalê kêm bikin.

pakkirina bit

Teknolojiya yekem pakkirina bit e. Ew ji karanîna tam hejmara bit-ên ku ji bo danasîna nirxa xwestinê hewce ne pêk tê. Mînakî, heke we enumek heye ku dikare 16 nirxên cûda hebin, wê hingê li şûna tevahiya byte (8 bit), hûn dikarin tenê 4 bit bikar bînin.

Glenn Fiedler rave dike ka meriv çawa vê yekê di beşa duyemîn a gotarê de bicîh tîne Pakêtên xwendin û nivîsandinê.

Pakkirina bit bi taybetî bi nimûneyê re baş dixebite, ku dê bibe mijara beşa paşîn.

Sampling

Sampling teknolojiyek berhevkirina windayî ye ku ji bo şîfrekirina nirxek tenê komek ji nirxên gengaz bikar tîne. Awayê herî hêsan ji bo pêkanîna veqetandinê bi dorkirina hejmarên xala herikandinê ye.

Glenn Fiedler (dîsa!) Di gotara xwe de nîşan dide ka meriv çawa nimûneyê dixe pratîkê Compression Snapshot.

Algorîtmayên Compression

Teknîka paşîn dê algorîtmayên berhevkirina bê windahî bin.

Li vir, bi dîtina min, sê algorîtmayên herî balkêş hene ku hûn hewce ne ku zanibin:

  • Kodkirina Huffman bi koda pêş-hejmarkirî, ku zehf bilez e û dikare encamên baş çêbike. Ew ji bo berhevkirina pakêtan di motora torê ya Quake3 de hate bikar anîn.
  • zlib algorîtmayek berhevkirinê ya gelemperî ye ku tu carî mîqdara daneyê zêde nake. Çawa hûn dikarin bibînin vir, di gelek sepanan de hatiye bikaranîn. Dibe ku ji bo nûvekirina dewletan zêde be. Lê heke hûn hewce ne ku ji serverê ji xerîdaran re malûmilk, nivîsên dirêj an axê bişînin ew dikare kêrhatî be.
  • Kopîkirina dirêjahiya bezê - Ev belkî algorîtmaya berhevkirinê ya herî hêsan e, lê ji bo hin celeb daneyan pir bi bandor e, û dikare wekî gavek pêş-pêvajoyê berî zlib were bikar anîn. Ew bi taybetî ji bo çewisandina erdên ku ji pîl an voxelan pêk tê ku tê de gelek hêmanên cîran têne dubare kirin maqûl e.

Compression Delta

Teknîkî ya paşîn a kompresyonê compression delta ye. Ew di rastiyê de pêk tê ku tenê cûdahiyên di navbera rewşa lîstika heyî û dewleta paşîn a ku ji hêla xerîdar ve hatî wergirtin têne veguheztin.

Ew yekem car di motora torê ya Quake3 de hate bikar anîn. Li vir du gotar hene ku rave dikin ka meriv wê çawa bikar tîne:

Glenn Fiedler jî di beşa duyemîn a gotara xwe de bi kar aniye Compression Snapshot.

Encîfrekirin

Wekî din, dibe ku hûn hewce ne ku veguheztina agahdariya di navbera xerîdar û serverê de şîfre bikin. Gelek sedemên vê yekê hene:

  • nepenî / nepenî: peyam tenê ji hêla wergir ve dikare were xwendin, û kesek din ku torê dikişîne dê nikaribe wan bixwîne.
  • erêkirin: kesê ku dixwaze rola lîstikvanek bilîze divê kilîta xwe bizane.
  • Pêşîlêgirtina xapandinê: Dê ji lîstikvanên xerab re pir dijwartir be ku pakêtên xweyên xapandinê biafirînin, ew ê neçar bin ku nexşeya şîfrekirinê ji nû ve hilberînin û mifteyê bibînin (ku bi her girêdanê re diguhere).

Ez bi tundî pêşniyar dikim ku ji bo vê pirtûkxaneyê bikar bînin. Ez pêşniyar dikim ku bikar bînin libsodium, ji ber ku ew bi taybetî hêsan e û dersên hêja hene. Bi taybetî balkêş dersa li ser e pevguhertina key, ku dihêle hûn bi her pêwendiyek nû re mifteyên nû biafirînin.

Protokola Serlêdanê: Encam

Ev protokola serîlêdana me bi dawî dike. Ez bawer dikim ku berhevkirin bi tevahî vebijarkî ye û biryara karanîna wê tenê bi lîstikê û pêlava bandê ya pêwîst ve girêdayî ye. Bi dîtina min, şîfrekirin mecbûrî ye, lê di prototîpa yekem de hûn dikarin bêyî wê bikin.

Mantiqa sepanê

Naha em dikarin di xerîdar de dewletê nûve bikin, lê dibe ku pirsgirêkên derengiyê biqewimin. Lîstik, piştî qedandina têketinê, pêdivî ye ku li bendê bimîne ku dewleta lîstikê ji serverê nûve bike da ku bibîne ka wê çi bandor li cîhanê kiriye.

Wekî din, di navbera du nûvekirinên dewletê de, cîhan bi tevahî statîk e. Ger rêjeya nûvekirina dewletê kêm be, wê gavê dê tevger pir biqewimin bin.

Gelek teknîk hene ku bandora vê pirsgirêkê kêm bikin, û ez ê di beşa paşîn de wan vebêjim.

Teknîkên Smoothing Latency

Hemî teknîkên ku di vê beşê de têne diyar kirin di rêzê de bi berfirehî têne nîqaş kirin Fast-Paced Multiplayer Gabriel Gambetta. Ez pir pêşniyar dikim ku hûn vê rêzika gotarên hêja bixwînin. Di heman demê de ew demoyek înteraktîf jî vedigire ku dihêle hûn bibînin ka van teknîkan di pratîkê de çawa dixebitin.

Teknolojiya yekem ev e ku meriv encama têketinê rasterast bêyî ku li benda bersivek serverê bimîne bicîh bîne. Tê gotin pêşbîniya alîgiriya xerîdar. Lêbelê, gava ku xerîdar nûvekirinek ji serverê werdigire, divê verast bike ku pêşbîniya wê rast bû. Ger ne wusa be, wê hingê ew tenê hewce dike ku rewşa xwe li gorî tiştê ku ji serverê wergirtiye biguhezîne, ji ber ku server otorîter e. Ev teknîk cara yekem di Quake de hate bikar anîn. Hûn dikarin li ser wê di gotarê de bêtir bixwînin Nirxandina koda Quake Engine Fabien Sanglars [wergerandin li ser Habré].

Koma duyemîn a teknîkan tê bikar anîn da ku tevgera saziyên din di navbera du nûvekirinên dewletê de xweş bike. Ji bo çareserkirina vê pirsgirêkê du rê hene: navberkirin û ekstrapolasyon. Di rewşa navberê de, du halên dawîn têne girtin û derbasbûna ji yekê bo ya din tê xuyang kirin. Kêmasiya wê ev e ku ew dibe sedema derengiyek piçûk ji ber ku xerîdar her gav tiştê ku di paşerojê de qewimiye dibîne. Extrapolation li ser pêşbînkirina cîhê ku divê niha li gorî rewşa paşîn a ku ji hêla xerîdar ve hatî wergirtin de be. Kêmasiya wê ev e ku heke sazûman bi tevahî rêça tevgerê biguhezîne, wê hingê dê di navbera pêşbînî û pozîsyona rastîn de xeletiyek mezin derkeve.

Teknîka herî dawî, ya herî pêşkeftî ku tenê di FPS-ê de bikêrhatî ye tezmînata derengiyê. Dema ku tezmînata derengiyê bikar tîne, server dema ku ew li hedefê diavêje derengiyên xerîdar digire. Mînakî, ger lîstikvanek li ser ekrana xwe guleyek serê xwe bikira, lê di rastiyê de armanca wan ji ber derengiyê li cîhek din bûya, wê hingê neheqî ye ku meriv ji lîstikvan re mafê kuştina ji ber derengiyê nehêle. Ji ber vê yekê, server wextê vedigerîne dema ku lîstikvan gulebaran dike da ku tiştê ku lîstikvan li ser ekrana xwe dîtiye simule bike û lihevketina di navbera guleya wan û armancê de kontrol bike.

Glenn Fiedler (wek herdem!) di 2004 de gotarek nivîsand Tora Physics (2004), ku tê de wî bingeha hevdengkirina simulasyonên fîzîkê di navbera server û xerîdar de danî. Di sala 2014an de rêzeke nû ya gotaran nivîsî Networking Physics, ku teknîkên din ji bo hevdemkirina simulasyonên fîzîkê diyar kir.

Di wiki Valve de du gotar jî hene, Çavkanî Multiplayer Networking и Rêbazên Telafîkirina Derengiyê Di Sêwirandin û Optimîzasyona Protokola Di lîstikê de Xerîdar/Perkêşker ku tezmînata derengmayînê dihesibînin.

Pêşîlêgirtina xapandinê

Ji bo pêşîlêgirtina xapandinê du teknîkên sereke hene.

Yekem: şandina pakêtên xerab ji bo xapînokan dijwartir dike. Wekî ku li jor behs kir, rêyek baş a pêkanîna vê şîfrekirinê ye.

Ya duyemîn: serverek otorîter divê tenê fermanan / têketin / çalakiyan werbigire. Pêdivî ye ku xerîdar ji bilî şandina têketinê nekare rewşa serverê biguhezîne. Dûv re, her gava ku server têketinê distîne, divê berî karanîna wê kontrol bike ka ew derbasdar e.

Mantiqa sepanê: encam

Ez pêşniyar dikim ku hûn rêyek ji bo simulasyona derengiyên bilind û rêjeyên nûvekirina nizm bicîh bikin da ku hûn reftariya lîstika xwe di şert û mercên nebaş de biceribînin, tewra dema ku xerîdar û server li ser heman komputerê dixebitin. Ev ê pêkanîna teknîkên derengmayînê pir hêsan bike.

Çavkaniyên Alîkar ên Din

Heke hûn dixwazin çavkaniyên din li ser modelên torê bigerin, hûn dikarin wan li vir bibînin:

  • Blog Glenn Fiedler - Tevahiya bloga wî hêjayî xwendinê ye, li wir gelek gotarên hêja hene. Ev e Hemî gotarên li ser teknolojiyên torê têne berhev kirin.
  • Tora Lîstika Awesome ji hêla M. Fatih MAR ve navnîşek berfireh a gotar û vîdyoyên li ser motorên lîstika vîdyoyê ya serhêl e.
  • В wiki ya r/gamedev subreddit Gelek girêdanên kêrhatî jî hene.

Source: www.habr.com

Add a comment