Hello! Iziquko Sergey Kachan, kwaye ndiyabakhokelela i-client kwi-War Robots project. I-War Robots ifumaneka iminyaka emininzi, kwaye ngexesha elandelayo le mdlalo lithunyelwe iintlobo ezininzi: i-robots, i-weapons, i-drones, i-titans, i-pilots, njl. Kwaye ukuba zonke oku ukusebenza, kufuneka ukugcina inani elikhulu iintlobo ezahlukeneyo zebhanki. Le nkcukacha zithunyelwe kwi-"izinga". Namhlanje ndiya kubhalwe malunga ne-balances eyenziwe kwiprojekthi yethu, into efanayo kwelinye iinyanga ezidlulileyo ze-11, kunye neendlela ezivela kwakhona. I-Balances kwi-Project Njengomnye iiprojekthi, i-War Robots ingahlukaniswa kwiinkalo ezimbili: i-meta kunye ne-core gameplay. Yintoni umsebenzi olungaphezulu kwi-core game but still affects the gameplay. Oku kubandakanya ukuthenga kunye nokuphucula iinkcukacha ze-game, ukuthatha inxaxheba kwi-social okanye kwi-event. Meta gameplay (metagaming) is the main repeating cycle of actions that the player performs in the game to their goals. In our case, it is robot battles on specific maps. Core gameplay (core gameplay loop) Yonke ingxenye yeprojekthi kufuneka i-balance yayo, ngoko sincoma i-balance kwiiyure ezimbini - i-meta kunye ne-core. I-War Robots nayo iye yaziwa , leyo kufuneka izicwangciso zabo ezahlukeneyo. Skirmish modes i is a modification of existing modes or maps with different characteristics or rules. I-Skirmish modes is often event-based, available to players during various holidays, mainly for fun. Ngokwesibonelo, abadlali angakwazi ukutya ngamnye ngexesha elinye okanye ukuqhuba ngokufanelekileyo. Skirmish mode Ngoko kuxhomekeke, sinayo i-balances ze-4: i-2 ye-default mode kunye ne-2 ye-Skirmish mode. Kwiminyaka engama-11, i-War Robots iye iye iye zithunyelwe kwinqanaba emangalisayo: 95 iibhodi 21 I-Titanic 175 izihlangu ezahlukeneyo 40 iindiza 16 Ukutya inombolo eningi le skins, iimodeli, iimoduli, iipilots, iintambo, iinkcukacha ekupheleni, kunye neenkcukacha Kwaye njengoko ungathanda, ukwenza yonke le nkonzo kufuneka ukugcina ulwazi malunga nenkqubo, i-statistics, ukufikelela, iimali, kunye nokunye kakhulu. Ngenxa yoko, izilinganiso zethu zangaphantsi ubungakanani: Default mode Skirmish mode Meta balance 9.2 MB 9.2 MB Core balance 13.1 MB 13.1 MB Meta balance 9.2 MB 9.2 MB Core balance 13.1 MB 13.1 MB Emva kweziphumo ezincinane, siphinde ukuba umdlali kufuneka download . Yinto kakhulu kakhulu! 44.6 MB Kwakhona, siye siphinde ukuba abalandeli abalandeli amaninzi iinkcukacha ezininzi yonke imibuzo. Kwaye ukusabalalisa idatha ezininzi nge-CDN ayikho ngokufanelekileyo. Just to remind you: War Robots has reached Ngo-2024, ubudlelwane yethu ngenyanga esebenzayo yaba Yaye Ukubhalisa ngosuku zonke. 300 million registered users 4.7 million people 690 thousand players Ngoko ufumana inani le data. Abaninzi, ngoko? Thina ndingathanda. Ngoko ke, siye ndingathanda ukwenza yonke into yokunciphisa ubungakanani ubunzima bethu! Ukukhusela kwimeko Indawo yokuqala yaba ukuyifaka kwi-balances kunye nokufumana: "Yintoni oku kuthatha indawo eninzi?" Ukusuka kwimveliso yonke imibuzo yaye into yokuzonwabisa - kuya kuthatha iiyure. Ngoko ke, sinika iindlela ezininzi ezivela kwaye zihlanganisa zonke iinkcukacha eziluncedo malunga neengxaki. Izixhobo uyavuma ifayile ye-balance njenge-input kwaye, usebenzisa i-reflection, uqhagamshelane kuzo zonke izakhiwo, ukuthatha iinkcukacha malunga neengxaki zeinkcukacha ezihlaziywa kunye neentsimbi efunyenwe ngamnye. Iziphumo ziye zithembisa: Ukucinga % in balance Usage count String 28.478 % 164 553 Int32 27.917 % 161 312 Boolean 6.329 % 36 568 Double 5.845 % 33 772 Int64 4.682 % 27 054 Custom structures 26.749 % — String I-28.478% 16553 Ukutyeba Int32 I-27.917% 161 312 Boolean I-329% I-36 568 Double 5.845% ngexesha 33 772 Int64 4.682 Iinkcukacha 27 054 Ukutyeba Custom structures Iimpawu ze-26.749% — Ukucaciswa % in balance Usage count String 34.259 % 232 229 Double 23.370 % 158 418 Int32 20.955 % 142 050 Boolean 5.306 % 34 323 Custom structures 16.11 % — String I-34.259 % 232 229 Double I-23.370% I-158 418 Int32 I-20.955 % I-242 050 Boolean I-5306 I-100% 34 323 Custom structures I-16.11% — Emva kokuhlolwa kwimeko, siphinde ukuba , kwaye into kufuneka kwenziwe ngayo. strings were taking up far too much space Ngoko ke, thina ukwakha isixhobo esinye. Le nto i-scanned ifayile ye-balance kwaye iye yenza i-mapping yeenxalenye ze-strings kunye nenani yeenxalenye ze-duplicated. Iimiphumo ayikwazanga. Ezinye iingxaki ziye zibonwa ezininzi amaxesha ezisetyhini! Ndingathanda iingxaki. Ngoku umbuzo: Indlela yokulungisa? Ukuphucula i-Balances Ngenxa yinkqubo ezibonakalayo, asikwazi ukunciphisa i-strings ngokupheleleyo. I-strings isetyenziselwa izinto ezifana ne-localization keys kunye ne-ID ezahlukeneyo. Kodwa into efunyenwe ukuba ukunciphisa i-duplication ye-strings. Umzekelo umzekelo umzekelo umzekelo umzekelo umzekelo umzekelo umzekelo: Yenza i-list ye-strings eyenziwe ngalinye ngalinye ye-balance (ngoku, i-storage eyenziwe). Thumela le nqaku kunye needatha. public class BalanceMessage { public BalanceMessageData Data; public StringStorage Storage; public string Version; } I-StringStorage ikakhulu i-wrapper ekubeni i-list ye-strings. Xa sinikezela i-string storage, yonke isakhiwo se-balance ibamba i-index ye-string ebonakalayo. Emva koko, xa sinikezela idatha, sinikezela kuphela i-index kwaye sinikezela ngokukhawuleza. public class StringStorage { public List<string> Values; public string GetValue(StringIdx id) => Values[id]; } Kwimeko yokuthumela i-strings ngokufanayo ngaphakathi kwizakhiwo ze-balance, siqale i-index ye-string ebonakalayo kwi-string storage. Kwiintsuku: public class SomeBalanceMessage { public string Id; public string Name; public int Amount; } emva : public class SomeBalanceMessageV2 { public StringIdx Id; public StringIdx Name; public int Amount; } I-StringIdx ikakhulukazi kuphela i-wrapper emgqeni int. Ngokwenza oku, sincoma ngokupheleleyo i-string transfers emgqeni ngaphakathi kwezakhiwo ze-balance. public readonly struct StringIdx : IEquatable<StringIdx> { private readonly int _id; internal StringIdx(int value) {_id = value; } public static implicit operator int(StringIdx value) => value._id; public bool Equals(StringIdx other) => _id == other._id; } Ukusetyenziswa oku kukunciphisa inani le-strings ngexesha elizigidi. String usage count String usage count Before After Meta balance 164 553 10 082 Core balance 232 229 14 228 Before After Meta balance 16553 Ukutyeba I-10 082 Core balance 232 229 14 228 Ukungabonakali? Kodwa ke ngexesha lokuqala - siye siphinde. Ukuguqulwa kwe-Data Protocol Ukudibanisa kunye nokutya izakhiwo izilinganiso, sisebenzisa . MessagePack I-MessagePack i-binary data serialization format yenzelwe njengoko i-alternative engaphezulu kunye ne-JSON. I-MessagePack yenzelwe ukulayisha idatha ephumelelayo phakathi kwizicelo okanye iinkonzo, okuvumela ukunciphisa ubungakanani idatha kakhulu - ikakhulukazi lula apho ukusebenza kunye ne-bandwidth kubaluleke. Okokuqala, i-MessagePack yaba kwi-JSON-like format, apho idatha ezisetyenziswa . Oku kukuba elula, kodwa nangokunxibelelana ngokubanzi. Ngoko siqhelekileyo siqhelise ukuxhaswa kunye nokuguqula kwi . string keys binary byte array Kwiintsuku: public class SomeBalanceMessage { [Key("id")] public string Id; [Key("name")] public string Name; [Key("amount")] public int Amount; } emva : public class SomeBalanceMessageV2 { [Key(0)] public StringIdx Id; [Key(1)] public StringIdx Name; [Key(2)] public int Amount; } Kwakhona siphuma zonke iincwadi ezamahala - ngaphandle kokuthunyelwa, ngoku sinikezela iindleko ze-null. Oku ukunciphisa ubungakanani kwedatha ngokubanzi kunye nexesha elidlulileyo yokufaka kunye ne-deserialization. Ukubonisa iimveliso Umgangatho we-golden ye-development elungileyo (kwaye omnye oya kutshintshele iingxaki ezininzi) kufuneka usebenzise iimpawu ezintsha ngokufanelekileyo ukuba uyakwazi ukuvelisa ngokushesha xa kukho into elungileyo. Ngoko ke, sinikezela zonke iimpawu ezintsha emzimbeni "iingxaki". Ukwenza lo mfuneko, siya kuxhaswa iiyunithi ezimbini ze-balances ngexesha elidlulileyo kunye ne-optimized. Ngexesha lokuvelisa, musa ukhuseleko ukuba zonke iinkcukacha zithunyelwe ngokufanelekileyo. Izilwanyana ezitsha kunye nezilwanyana ezintsha - ngaphandle kwe-format okanye i-structure - ziye zithunyelwa izilwanyana ezifanelekileyo. Kwaye khumbula, izilwanyana ezihlaziywa ziye zibonisa izilwanyana zayo ngokucacileyo, kodwa kungekho kufuneka zithunyane nawo ngaphandle kwe-size yabo. Ukuze ukufumana oku, sinikezela inani elikhulu lombhalo lombhalo lombhalo lombhalo. Okokuqala, sinxibelelanisa zonke iifolda "ngaphandle" - ukubuyekeza zonke iifolda ngokucacileyo. Oku kwenziwa, kodwa kunzima ixesha, kwaye ngexesha elincinane lokuguqulwa kwizilinganiselo uya kubandakanya iifolda, ukhangela kwakhona ngokugqithisileyo. Oku kwandisa kwaye kunzima kakhulu. Okwangoku, siye kwakhona kwaye siye kwenziwe indlela efanelekileyo yokuhlola ukusabela izilwanyana. Ukukhuselwa kwakhona. Sifumana iiyure ezimbini ze-balance structures, njenge-SomeBalanceMessage kunye ne-SomeBalanceMessageV2, kwaye i-iterated phezu kwabo - ukuguqula iinkcukacha ze-field, iinombolo kunye neeyure. Ukuba nayiphi na ingxaki engabonakaliwe, sincoma i-problem. Le nkqubo yandisa ixesha elikhulu emva kokuba. Imiphumo Optimization Ukusetyenziswa kwezi zokusetyenziswa, sikwazi ukunciphisa ubungakanani yeefayile ezithunyelwe kwi-network kunye nexesha elidlulileyo yokusetyenziswa kwi-client. Kwakhona sikunciphisa inani le-memory ebonakalayo kwi-client side emva kwe-balance deserialization. Ubungakanani File Old balances Optimized balances Profit Meta balance 9.2 MB 1.28 MB - 86 % Core balance 13.1 MB 2.22 MB - 83 % Meta balance 9.2 MB 1.28 MB - I-86% Core balance 13.1 MB 2.22 MB - I-83% ixesha Deserialization Old balances Optimized balances Profit Meta balance 967 ms 199 ms - 79 % Core balance 1165 ms 265 ms - 77 % Meta balance 967 ms 199 iimveliso - I-79% Core balance 1165 ms 265 iintsuku - I-77% Iinkcukacha kwi-memory Old balances Optimized balances Profit Meta + Core ~ 45.3 MB ~ 33.5 MB - 26 % Meta + Core ~ 45.3 MB ~ 33,5 MB - I-26% Imibuzo Iimiphumo ye-optimization iyathanda ngokupheleleyo. Iifayile ze-balance ziye zithanjwe ngaphezulu kwe-80%. I-traffic yandaphantsi, kwaye abadlali babonakala. Ukususela: Qinisekisa idatha esithunyelwe, kwaye awubhalisa into engabikhoyo. I-strings ifumaneka kwi-storage eyodwa ukuze akufanele ukuvelisa i-duplicates. Kwaye ukuba idatha yakho ye-custom (iimali, i-statistics, njl) inezinto ezininzi yokuguqula, nqakraza i-strings ezininzi kwi-storage ezininzi. Oku kunceda iimigabytes ezininzi - kwaye imali ezininzi kwi-CDN servers.