үйрөнчүктөр үчүн оюндарда тармак модели жөнүндө

үйрөнчүктөр үчүн оюндарда тармак модели жөнүндө
Акыркы эки жумада мен өз оюнум үчүн онлайн кыймылдаткычтын үстүндө иштеп жатам. Буга чейин мен оюндарда тармактык байланыш жөнүндө эч нерсе билчү эмесмин, ошондуктан бардык түшүнүктөрдү түшүнүү жана өзүмдүн тармактык кыймылдаткычымды жаза алуу үчүн көптөгөн макалаларды окуп, көптөгөн эксперименттерди жасадым.

Бул колдонмодо мен сиз менен өз оюн кыймылдаткычыңызды жазуудан мурун үйрөнүшүңүз керек болгон ар кандай түшүнүктөрдү, ошондой эле аларды үйрөнүү үчүн эң мыкты ресурстарды жана макалаларды бөлүшкүм келет.

Жалпысынан тармактын архитектурасынын эки негизги түрү бар: тең-теңге жана кардар-сервер. Peer-to-peer (p2p) архитектурасында маалыматтар туташкан оюнчулардын каалаган жуптарынын ортосунда өткөрүлөт, ал эми кардар-сервер архитектурасында маалыматтар оюнчулар менен сервердин ортосунда гана өткөрүлөт.

Кээ бир оюндарда тең-теңге түз архитектура дагы эле колдонулса да, кардар-сервер стандарт болуп саналат: аны ишке ашыруу оңой, каналдын кеңдигин талап кылат жана алдоодон коргоону жеңилдетет. Ошондуктан, бул окуу куралында биз кардар-сервер архитектурасына көңүл бурабыз.

Атап айтканда, бизди авторитардык серверлер кызыктырат: мындай системаларда сервер дайыма туура болот. Мисалы, эгер оюнчу координаттардамын деп ойлосо (10, 5) жана сервер ага (5, 3) экенин айтса, анда кардар анын ордун вице эмес, сервер кабарлаган позицияга алмаштыруусу керек. тескерисинче. Авторитеттүү серверлерди колдонуу алдамчыларды аныктоону жеңилдетет.

Тармактык оюн системалары үч негизги компоненттен турат:

  • Транспорт протоколу: маалыматтар кардарлар менен сервердин ортосунда кандайча өткөрүлөт.
  • Колдонмо протоколу: кардарлардан серверге жана серверден кардарларга эмне жана кандай форматта берилет.
  • Колдонмо логикасы: өткөрүлүп берилген маалыматтар кардарлардын жана сервердин абалын жаңыртуу үчүн кандайча колдонулат.

Ар бир бөлүктүн ролун жана алар менен байланышкан кыйынчылыктарды түшүнүү абдан маанилүү.

Транспорттук протокол

Биринчи кадам сервер менен кардарлардын ортосунда маалыматтарды ташуу үчүн протоколду тандоо болуп саналат. Бул үчүн эки Интернет протоколу бар: TCP и UDP. Бирок сиз алардын бирине негизделген өзүңүздүн транспорттук протоколуңузду түзө аласыз же аларды колдонгон китепкананы колдоно аласыз.

TCP жана UDP салыштыруу

TCP жана UDP экөө тең негизделет IP. IP пакетти булактан алуучуга өткөрүүгө мүмкүндүк берет, бирок жөнөтүлгөн пакет эртеби-кечпи алуучуга жетээрине, ага жок дегенде бир жолу жете тургандыгына жана пакеттердин ырааттуулугу туура келерине кепилдик бербейт. тартип. Мындан тышкары, бир пакетте мааниси менен берилген маалыматтын чектелген көлөмүн гана камтышы мүмкүн АДАМ.

UDP - бул IPдин үстүндөгү жука катмар. Ошондуктан, ал бирдей чектөөлөр бар. Ал эми, TCP көптөгөн өзгөчөлүктөргө ээ. Бул каталарды текшерүү менен эки түйүн ортосунда ишенимдүү, иреттүү байланышты камсыз кылат. Демек, TCP абдан ыңгайлуу жана башка көптөгөн протоколдордо колдонулат, мис. HTTP, FTP и SMTP. Бирок бул өзгөчөлүктөрдүн баары бир баада келет: кечигүү.

Бул функциялар эмне үчүн кечиктирүүгө алып келиши мүмкүн экенин түшүнүү үчүн, TCP кантип иштээрин түшүнүшүбүз керек. Жөнөтүүчү түйүн пакетти кабыл алуучу түйүнгө өткөрүп бергенде, ал ырастоо (ACK) алууну күтөт. Эгер белгилүү бир убакыттан кийин ал аны албаса (анткени пакет же тастыктоо жоголгон же башка себептер менен), анда ал пакетти кайра жөнөтөт. Андан тышкары, TCP пакеттердин туура тартипте кабыл алынышын кепилдейт, ошондуктан жоголгон пакет алынганга чейин, башка бардык пакеттер, алар кабыл алуучу хост тарабынан кабыл алынган болсо да, иштетилбейт.

Бирок сиз ойлогондой, көп оюнчу оюндарында күтүү өтө маанилүү, айрыкча FPS сыяктуу экшн жанрларында. Ошондуктан көптөгөн оюндар UDPди өз протоколу менен колдонушат.

Жергиликтүү UDP негизиндеги протокол ар кандай себептерден улам TCPге караганда натыйжалуураак болушу мүмкүн. Мисалы, ал кээ бир пакеттерди ишенимдүү, башкаларын ишенимсиз деп белгилей алат. Ошондуктан, ишенимсиз пакет алуучуга жетеби же жокпу, баары бир. Же ал бир агымдагы жоголгон пакет калган агымдарды жайлатпаш үчүн бир нече маалымат агымын иштете алат. Мисалы, оюнчу киргизүү үчүн жип жана чат билдирүүлөрү үчүн башка жип болушу мүмкүн. Эгер шашылыш эмес чат билдирүүсү жоголсо, ал шашылыш болгон киргизүүнү жайлата албайт. Же проприетардык протокол ишенимдүүлүктү TCPге караганда видео оюн чөйрөсүндө натыйжалуураак болушу үчүн ишке ашырышы мүмкүн.

Демек, TCP ушунчалык көп сорсо, анда биз UDP негизинде өзүбүздүн транспорттук протоколду түзөбүзбү?

Бул бир аз татаалыраак. TCP оюн тармак тутумдары үчүн дээрлик оптималдуу эмес болсо да, ал сиздин конкреттүү оюнуңуз үчүн абдан жакшы иштеп, баалуу убакытты үнөмдөй алат. Мисалы, кезекке негизделген оюн же LAN түйүндөрүндө гана ойной турган оюн үчүн кечигүү көйгөй болбошу мүмкүн, мында кечигүү жана пакет жоготуу интернетке караганда бир топ төмөн.

Көптөгөн ийгиликтүү оюндар, анын ичинде World of Warcraft, Minecraft жана Terraria, TCP колдонот. Бирок, көпчүлүк FPSтер өздөрүнүн UDP негизиндеги протоколдорун колдонушат, ошондуктан биз төмөндө алар жөнүндө көбүрөөк сүйлөшөбүз.

TCP колдонууну чечсеңиз, анын өчүрүлгөнүн текшериңиз Наглдын алгоритми, анткени ал жөнөтүүдөн мурун пакеттерди буферлейт, бул күтүү убактысын жогорулатат.

Көп оюнчу оюндарынын контекстинде UDP жана TCP ортосундагы айырмачылыктар жөнүндө көбүрөөк билүү үчүн Гленн Фидлердин макаласын окуй аласыз. UDP vs. TCP.

Өз протоколу

Ошентип, сиз өзүңүздүн транспорттук протоколуңузду түзгүңүз келеби, бирок эмнеден баштоону билбей жатасызбы? Сиз бактылуусуз, анткени Гленн Фидлер бул тууралуу эки укмуштуудай макала жазган. Алардан көптөгөн акылдуу ойлорду табасың.

Биринчи макала Оюн программисттери үчүн тармак 2008, экинчисине караганда жеңилирээк, Оюн тармагынын протоколун түзүү 2016. Мен сизге улуусунан баштоону сунуш кылам.

Гленн Фидлер UDP негизинде ыңгайлаштырылган протоколду колдонуунун чоң жактоочусу экенине көңүл буруңуз. Жана анын макалаларын окугандан кийин, сиз TCP видео оюндарында олуттуу кемчиликтери бар деген пикирин кабыл алып, өзүңүздүн протоколуңузду ишке ашырууну каалайсыз.

Бирок, эгер сиз тармакта жаңы болсоңуз, өзүңүзгө жакшылык кылыңыз жана TCP же китепкананы колдонуңуз. Өзүңүздүн транспорттук протоколуңузду ийгиликтүү ишке ашыруу үчүн алдын ала көп нерсени үйрөнүшүңүз керек.

Тармактык китепканалар

Эгер сизге TCPге караганда эффективдүүрөөк нерсе керек болсо, бирок өзүңүздүн протоколуңузду ишке ашыруу жана көп майда-чүйдөсүнө чейин убара болгуңуз келбесе, анда тармактык китепкананы колдонсоңуз болот. Алардан бир топ бар:

  • yojimbo Гленн Фидлер
  • RakNet, бул мындан ары колдоого алынбайт, бирок анын бир айрысы SLikeNet Ал дагы эле активдүү окшойт.
  • ENet көп оюнчу FPS үчүн түзүлгөн китепкана болуп саналат куб
  • GameNetworkingSockets Клапан

Мен алардын баарын сынап көргөн жокмун, бирок мен ENetти жактырам, анткени аны колдонуу оңой жана ишенимдүү. Мындан тышкары, анда так документтер жана үйрөнчүктөр үчүн окуу куралы бар.

Транспорттук протокол: Корутунду

Жыйынтыктап айтканда: эки негизги транспорттук протоколдор бар: TCP жана UDP. TCP көптөгөн пайдалуу өзгөчөлүктөргө ээ: ишенимдүүлүк, пакет тартибин сактоо, каталарды аныктоо. UDPде мунун баары жок, бирок TCP өзүнүн табияты боюнча күтүү убактысын көбөйттү, бул кээ бир оюндар үчүн кабыл алынгыс. Башкача айтканда, аз күтүү убактысын камсыз кылуу үчүн, сиз UDP негизинде өз протоколуңузду түзө аласыз же UDPде транспорттук протоколду ишке ашырган жана көп оюнчу видео оюндарына ылайыкташтырылган китепкананы колдонсоңуз болот.

TCP, UDP жана китепкананын ортосундагы тандоо бир нече факторлордон көз каранды. Биринчиден, оюндун муктаждыктарынан: ага аз күтүү керекпи? Экинчиден, өтүнмөнүн протоколунун талаптарынан: ага ишенимдүү протокол керекпи? Кийинки бөлүмдө көрө турганыбыздай, ишенимсиз протокол абдан ылайыктуу болгон арыз протоколун түзсө болот. Акыр-аягы, сиз да тармак кыймылдаткычын иштеп тажрыйбасын эске алуу керек.

Менин эки кеңешим бар:

  • Колдонмонун калган бөлүгүнөн транспорттук протоколду мүмкүн болушунча абстракциялаңыз, аны бардык кодду кайра жазбастан оңой алмаштырууга болот.
  • Ашыкча оптималдаштырбаңыз. Эгер сиз тармактык эксперт болбосоңуз жана сизге UDP негизиндеги ыңгайлаштырылган транспорттук протокол керекпи же жокпу, так билбесеңиз, TCP же ишенимдүүлүктү камсыз кылган китепканадан баштай аласыз, андан кийин сынап көрүп, өндүрүмдүүлүгүн өлчөсөңүз болот. Көйгөйлөр келип чыкса жана анын себеби транспорттук протоколдо экенине ишенсеңиз, анда өзүңүздүн транспорттук протоколуңузду түзүүгө убакыт келип калышы мүмкүн.

Бул бөлүктүн аягында мен сизге окууну сунуш кылам Көп оюнчу оюн программалоосуна киришүү Бул жерде талкууланган көптөгөн темаларды камтыган Брайан Хук тарабынан.

Колдонмо протоколу

Эми биз кардарлар менен сервердин ортосунда маалымат алмаша алгандан кийин, кандай маалыматтарды жана кандай форматта өткөрүүнү чечишибиз керек.

Классикалык схема кардарлар киргизүүнү же аракеттерди серверге жөнөтөт, ал эми сервер учурдагы оюн абалын кардарларга жөнөтөт.

Сервер толук абалды эмес, ойноткучтун жанында жайгашкан объекттери менен чыпкаланган абалды жөнөтөт. Ал муну үч себеп менен кылат. Биринчиден, толук мамлекет жогорку жыштыкта ​​берилиши үчүн өтө чоң болушу мүмкүн. Экинчиден, кардарларды негизинен визуалдык жана аудио маалыматтар кызыктырат, анткени оюндун логикасынын көбү оюн серверинде симуляцияланган. Үчүнчүдөн, кээ бир оюндарда оюнчуга белгилүү бир маалыматтарды, мисалы, картанын аркы тарабындагы душмандын позициясын билүүнүн кереги жок, антпесе ал пакеттерди жыттап, аны өлтүрүш үчүн кайда жылышын так биле алат.

Сериялаштыруу

Биринчи кадам - ​​биз жөнөткүбүз келген маалыматтарды (киргизүү же оюн абалы) өткөрүүгө ылайыктуу форматка айландыруу. Бул жараян деп аталат сериялаштыруу.

Ошол замат акылга келген ой JSON же XML сыяктуу адам окуй турган форматты колдонуу. Бирок бул таптакыр натыйжасыз болуп, каналдын көбүн текке кетирет.

Анын ордуна экилик форматты колдонуу сунушталат, ал бир топ компакттуу. Башкача айтканда, пакеттерде бир нече байт гана болот. Бул жерде ойлоно турган маселе бар байт тартиби, ар кандай компьютерлерде ар кандай болушу мүмкүн.

Маалыматтарды сериялаштыруу үчүн китепкананы колдонсоңуз болот, мисалы:

Жөн гана китепкана көчмө архивдерди түзөрүн жана эмиандуулукка кам көрөрүн текшериңиз.

Альтернативалык чечим - аны өзүңүз ишке ашыруу; бул өзгөчө кыйын эмес, өзгөчө, эгер сиз кодуңузга маалымат борборлоштурулган мамилени колдонсоңуз. Мындан тышкары, бул китепкананы колдонууда дайыма эле мүмкүн боло бербеген оптималдаштырууларды аткарууга мүмкүндүк берет.

Гленн Фидлер сериялаштыруу жөнүндө эки макала жазган: Окуу жана жазуу пакеттери и Сериялаштыруу стратегиялары.

Кысуу

Кардарлар менен сервердин ортосунда берилүүчү маалыматтардын көлөмү каналдын өткөрүү жөндөмдүүлүгү менен чектелет. Берилиштерди кысуу ар бир сүрөткө көбүрөөк маалыматтарды өткөрүп берүүгө, жаңыртуу жыштыгын жогорулатууга же жөн гана канал талаптарын кыскартууга мүмкүндүк берет.

Бит пакеттөө

Биринчи техника бит таңгактоо болуп саналат. Бул керектүү маанини сүрөттөө үчүн зарыл болгон так санын колдонуудан турат. Мисалы, сизде 16 түрдүү мааниге ээ боло турган энум бар болсо, анда бүт байттын ордуна (8 бит), сиз болгону 4 битти колдоно аласыз.

Гленн Фидлер муну кантип ишке ашырууну макаланын экинчи бөлүгүндө түшүндүрөт Окуу жана жазуу пакеттери.

Бит таңгактоо кийинки бөлүмдүн темасы боло турган үлгүлөрдү алуу менен өзгөчө жакшы иштейт.

Үлгүлөө

Үлгүлөө маанини коддоо үчүн мүмкүн болгон маанилердин бир бөлүгүн гана колдонгон жоготуулуу кысуу ыкмасы. Дискретизацияны ишке ашыруунун эң оңой жолу - калкыма чекиттерди тегеректөө.

Гленн Фидлер (дагы!) өзүнүн макаласында үлгүлөрдү кантип иш жүзүндө колдонууну көрсөтөт Snapshot Compression.

Компрессия алгоритмдери

Кийинки техника жоготуусуз кысуу алгоритмдери болот.

Бул жерде, менин оюмча, сиз билишиңиз керек болгон эң кызыктуу үч алгоритм:

  • Хаффман коддоосу алдын ала эсептелген код менен, ал абдан тез жана жакшы натыйжаларды бере алат. Ал Quake3 тармак кыймылдаткычында пакеттерди кысуу үчүн колдонулган.
  • сжатия маалыматтын көлөмүн эч качан көбөйтпөгөн жалпы максаттагы кысуу алгоритми. Кантип көрүүгө болот бул жерде, ал ар кандай колдонмолордо колдонулган. Бул штаттарды жаңыртуу үчүн ашыкча болушу мүмкүн. Бирок серверден кардарларга активдерди, узун тексттерди же жерди жөнөтүш керек болсо, бул пайдалуу болушу мүмкүн.
  • Узундуктарды көчүрүү - Бул, кыязы, эң жөнөкөй кысуу алгоритми, бирок ал маалыматтардын айрым түрлөрү үчүн абдан натыйжалуу жана zlib алдында алдын ала иштетүү кадамы катары колдонулушу мүмкүн. Ал көптөгөн чектеш элементтер кайталанган плиткалар же вокселдерден турган рельефти кысуу үчүн өзгөчө ылайыктуу.

Delta кысуу

Акыркы кысуу ыкмасы дельта кысуу болуп саналат. Бул учурдагы оюн абалы менен кардар кабыл алган акыркы абалдын ортосундагы айырмачылыктар гана берилишинен турат.

Ал биринчи жолу Quake3 тармак кыймылдаткычында колдонулган. Бул жерде аны кантип колдонууну түшүндүргөн эки макала бар:

Гленн Фидлер макаласынын экинчи бөлүгүндө да колдонгон Snapshot Compression.

Шифрлөө

Мындан тышкары, сизге кардарлар менен сервердин ортосунда маалымат берүүнү шифрлөө керек болушу мүмкүн. Мунун бир нече себептери бар:

  • купуялык/купуялуулук: билдирүүлөрдү алуучу гана окуй алат жана тармакты жыттаган башка эч ким аларды окуй албайт.
  • аутентификация: оюнчунун ролун ойногусу келген адам анын ачкычын билиши керек.
  • Читтин алдын алуу: Зыяндуу оюнчулар үчүн өз алдоо пакеттерин түзүү бир топ кыйыныраак болот, алар шифрлөө схемасын кайра жасап, ачкычты табышы керек (ар бир туташууда өзгөрөт).

Мен бул үчүн китепкананы колдонууну сунуштайм. колдонууну сунуштайм либсодий, анткени ал өзгөчө жөнөкөй жана эң сонун окуу куралдары бар. Өзгөчө кызыктуу окуу куралы болуп саналат ачкыч алмашуу, бул ар бир жаңы туташуу менен жаңы ачкычтарды жаратууга мүмкүндүк берет.

Өтүнмөнүн протоколу: Корутунду

Бул биздин арыз протоколубузду аяктайт. Мен кысуу толугу менен милдеттүү эмес деп эсептейм жана аны колдонуу чечими оюнга жана талап кылынган өткөрүү жөндөмдүүлүгүнөн гана көз каранды. Шифрлөө, менин оюмча, милдеттүү, бирок биринчи прототипте сиз ансыз деле кыла аласыз.

Колдонмо логикасы

Биз азыр кардардагы абалды жаңырта алдык, бирок кечигүү маселеси келип чыгышы мүмкүн. Оюнчу, киргизүүнү аяктагандан кийин, анын дүйнөгө кандай таасир тийгизгенин көрүү үчүн оюндун абалы серверден жаңырышын күтүшү керек.

Анын үстүнө, эки мамлекеттик жаңыртуулардын ортосунда дүйнө толугу менен статикалык. Эгерде мамлекеттик жаңыртуу ылдамдыгы төмөн болсо, анда кыймылдар абдан ызы-чуу болот.

Бул көйгөйдүн таасирин азайтуунун бир нече ыкмалары бар, мен аларды кийинки бөлүмдө карайм.

Latency Smoothing Techniques

Бул бөлүмдө сүрөттөлгөн бардык техникалар сериясында майда-чүйдөсүнө чейин талкууланат Тез темпте көп оюнчу Габриэл Гамбетта. Мен бул эң сонун макалалар сериясын окууну сунуштайм. Ал ошондой эле бул ыкмалардын иш жүзүндө кандайча иштээрин көрүүгө мүмкүндүк берген интерактивдүү демонстрацияны камтыйт.

Биринчи ыкма - серверден жооп күтпөстөн, киргизүү натыйжасын түздөн-түз колдонуу. деп аталат кардар тарабынан болжолдоо. Бирок, кардар серверден жаңыртууларды алганда, анын божомолу туура болгонун текшериши керек. Эгер андай болбосо, анда ал серверден алганына жараша абалын өзгөртүүсү керек, анткени сервер авторитардык. Бул техника биринчи жолу жер титирөөдө колдонулган. Бул тууралуу кененирээк макаладан окуй аласыз Quake Engine кодун карап чыгуу Фабиен Сангларс [котормо Habré боюнча].

Техникалардын экинчи топтому эки мамлекеттик жаңыртуунун ортосундагы башка объекттердин кыймылын жылмакай кылуу үчүн колдонулат. Бул маселени чечүүнүн эки жолу бар: интерполяция жана экстраполяция. Интерполяцияда акыркы эки абал алынып, биринен экинчисине өтүү көрсөтүлөт. Анын кемчилиги, кардар ар дайым өткөн окуяларды көрүп турат, анткени ал бир аз кечигүүнү пайда кылат. Экстраполяция - бул кардар кабыл алган акыркы абалдын негизинде субъекттер кайда болушу керек экенин алдын ала айтуу. Анын кемчилиги, эгерде субъект кыймылдын багытын толугу менен өзгөртсө, анда болжол менен иш жүзүндөгү позициянын ортосунда чоң катачылык болот.

FPSде гана пайдалуу эң акыркы, эң алдыңкы техника кечиктирилген компенсация. Кечигүүнүн компенсациясын колдонууда сервер кардардын бутага атканда кечигүүлөрүн эске алат. Мисалы, эгер оюнчу өз экранында башын атып түшүрсө, бирок чындыгында алардын бутасы кечиктирилгендиктен башка жерде болсо, анда оюнчунун кечигип өлтүрүү укугунан баш тартуу адилетсиздик болот. Ошондуктан, сервер оюнчу өз экранында көргөн нерсесин окшоштуруу жана алардын атуу менен бутанын кагылышуусун текшерүү үчүн оюнчу аткан учурга убакытты артка кайтарат.

Гленн Фидлер (ар дайымкыдай!) 2004-жылы макала жазган Тармак физикасы (2004), анда ал сервер менен кардар ортосунда физикалык симуляцияларды синхрондоштуруу үчүн негиз салган. 2014-жылы ал макалалардын жаңы сериясын жазган Тармак физикасыфизикалык симуляцияларды синхрондоштуруунун башка ыкмаларын сүрөттөгөн.

Valve викиде дагы эки макала бар, Булак Multiplayer Networking и Кардар/Сервер Оюндагы протоколду долбоорлоодо жана оптималдаштырууда кечиктирүүнү компенсациялоо ыкмалары кечиктирүүлөр үчүн компенсацияларды карап чыгат.

Алдануунун алдын алуу

Алдоону алдын алуу үчүн эки негизги ыкма бар.

Биринчиси: алдамчыларга зыяндуу пакеттерди жөнөтүүнү кыйындатуу. Жогоруда айтылгандай, муну ишке ашыруунун жакшы жолу шифрлөө болуп саналат.

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

Колдонуу логикасы: корутунду

Кардар менен сервер бир компьютерде иштеп турганда да, начар шарттарда оюнуңуздун жүрүм-турумун сынап көрүү үчүн жогорку кечигүүлөрдү жана жаңылануу ылдамдыгын имитациялоо ыкмасын ишке ашырууну сунуштайм. Бул ке-чиктирууну тегиздее техникасын ишке ашырууну бир кыйла жецилдетет.

Башка пайдалуу ресурстар

Тармактык моделдер боюнча башка ресурстарды изилдегиңиз келсе, аларды бул жерден таба аласыз:

  • Гленн Фидлердин блогу – анын бүт блогу окууга татыктуу, ал жерде көптөгөн сонун макалалар бар. бул Тармактык технологиялар боюнча бардык макалалар чогултулган.
  • Awesome Game Networking M. Fatih MAR - бул онлайн видео оюн кыймылдаткычтары боюнча макалалардын жана видеолордун толук тизмеси.
  • В Wiki of the r/gamedev subreddit Ошондой эле көптөгөн пайдалуу шилтемелер бар.

Source: www.habr.com

Комментарий кошуу