ఈ ఏడాది మేలో నేను ప్లేయర్గా పాల్గొన్నాను
మల్టీప్లేయర్ గేమ్లలోని సమస్యలను ట్రాక్ చేయడం చాలా కష్టం. అవి సాధారణంగా నిర్దిష్ట నెట్వర్క్ సెట్టింగ్ల క్రింద మరియు చాలా నిర్దిష్ట గేమ్ స్టేట్లలో (ఈ సందర్భంలో, 200 కంటే ఎక్కువ మంది ఆటగాళ్లు) జరుగుతాయి. మరియు సమస్య పునరుత్పత్తి చేయబడినప్పటికీ, అది సరిగ్గా డీబగ్ చేయబడదు ఎందుకంటే బ్రేక్పాయింట్లను చొప్పించడం గేమ్ను ఆపివేస్తుంది, టైమర్లను గందరగోళానికి గురి చేస్తుంది మరియు సాధారణంగా గడువు ముగిసినందున కనెక్షన్ సమయం ముగియడానికి కారణమవుతుంది. కానీ పట్టుదల మరియు అనే అద్భుతమైన సాధనం ధన్యవాదాలు
సంక్షిప్తంగా, బగ్ మరియు ఆలస్యం స్థితి అనుకరణ యొక్క అసంపూర్ణ అమలు కారణంగా, క్లయింట్ కొన్నిసార్లు ఒక క్లాక్ సైకిల్లో నెట్వర్క్ ప్యాకెట్ను పంపాల్సిన పరిస్థితిని ఎదుర్కొంటుంది, దాదాపు 400 గేమ్ ఎంటిటీలను ఎంచుకోవడానికి ప్లేయర్-ఇన్పుట్ చర్యలను కలిగి ఉంటుంది ( మేము దానిని "మెగాప్యాకెట్" అని పిలుస్తాము). ఆ తర్వాత, సర్వర్ ఈ ఇన్పుట్ చర్యలన్నింటినీ సరిగ్గా స్వీకరించడమే కాకుండా, వాటిని అన్ని ఇతర క్లయింట్లకు కూడా పంపాలి. మీకు 200 మంది క్లయింట్లు ఉంటే, ఇది త్వరగా సమస్య అవుతుంది. సర్వర్కి ఛానెల్ త్వరగా అడ్డుపడుతుంది, ఫలితంగా ప్యాకెట్లు పోతాయి మరియు తిరిగి అభ్యర్థించిన ప్యాకెట్ల క్యాస్కేడ్ ఏర్పడుతుంది. ఇన్పుట్ చర్యలను వాయిదా వేయడం వలన ఎక్కువ మంది క్లయింట్లు మెగాప్యాకెట్లను పంపడం ప్రారంభిస్తారు మరియు వారి హిమపాతం మరింత బలపడుతుంది. విజయవంతమైన క్లయింట్లు తిరిగి పొందగలుగుతారు, మిగిలినవన్నీ పడిపోతాయి.
సమస్య చాలా ప్రాథమికమైనది మరియు దాన్ని పరిష్కరించడానికి నాకు 2 వారాలు పట్టింది. ఇది చాలా సాంకేతికంగా ఉంది, కాబట్టి నేను జ్యుసి సాంకేతిక వివరాలను క్రింద వివరిస్తాను. అయితే ముందుగా, జూన్ 0.17.54న విడుదలైన వెర్షన్ 4 నుండి, తాత్కాలిక కనెక్షన్ సమస్యల నేపథ్యంలో, మల్టీప్లేయర్ మరింత స్థిరంగా మారింది మరియు ఆలస్యం దాచడం చాలా తక్కువ బగ్గీ (తక్కువ బ్రేకింగ్ మరియు టెలిపోర్టింగ్) అని మీరు తెలుసుకోవాలి. అలాగే, పోరాట జాప్యాలు దాచబడే విధానాన్ని నేను మార్చాను మరియు ఇది వాటిని కొద్దిగా సున్నితంగా చేస్తుందని ఆశిస్తున్నాను.
మల్టీప్లేయర్ మెగా ప్యాక్ - సాంకేతిక వివరాలు
సులభంగా చెప్పాలంటే, గేమ్లోని మల్టీప్లేయర్ ఇలా పనిచేస్తుంది: క్లయింట్లందరూ ప్లేయర్ ఇన్పుట్ను మాత్రమే స్వీకరించడం మరియు పంపడం ద్వారా గేమ్ స్థితిని అనుకరిస్తారు ("ఇన్పుట్ చర్యలు" అని పిలుస్తారు ఇన్పుట్ చర్యలు) సర్వర్ యొక్క ప్రధాన పని బదిలీ చేయడం ఇన్పుట్ చర్యలు మరియు క్లయింట్లందరూ ఒకే సైకిల్లో ఒకే విధమైన చర్యలను చేస్తారని నిర్ధారిస్తుంది. మీరు దీని గురించి పోస్ట్లో మరింత చదవవచ్చు.
సర్వర్ ఏ చర్యలు తీసుకోవాలనే దాని గురించి నిర్ణయాలు తీసుకోవలసి ఉంటుంది కాబట్టి, ప్లేయర్ యొక్క చర్యలు క్రింది మార్గంలో కదులుతాయి: ప్లేయర్ యాక్షన్ -> గేమ్ క్లయింట్ -> నెట్వర్క్ -> సర్వర్ -> నెట్వర్క్ -> గేమ్ క్లయింట్. దీనర్థం ఆటగాడి యొక్క ప్రతి చర్య అది నెట్వర్క్ ద్వారా రౌండ్-ట్రిప్ పాత్ చేసిన తర్వాత మాత్రమే నిర్వహించబడుతుంది. దీని కారణంగా, గేమ్ చాలా నెమ్మదిగా అనిపించేది, కాబట్టి గేమ్లో మల్టీప్లేయర్ కనిపించిన వెంటనే, ఆలస్యాన్ని దాచడానికి ఒక విధానం ప్రవేశపెట్టబడింది. లేటెన్సీ దాచడం అనేది ఇతర ప్లేయర్ల చర్యలను మరియు సర్వర్ నిర్ణయం తీసుకోవడాన్ని పరిగణనలోకి తీసుకోకుండా ప్లేయర్ ఇన్పుట్ను అనుకరిస్తుంది.
Factorio గేమ్ స్థితిని కలిగి ఉంది ఆట స్థితి మ్యాప్, ప్లేయర్, ఎంటిటీలు మరియు మిగతా వాటి యొక్క పూర్తి స్థితి. ఇది సర్వర్ నుండి స్వీకరించబడిన చర్యల ఆధారంగా అన్ని క్లయింట్లలో నిర్ణయాత్మకంగా అనుకరించబడుతుంది. గేమ్ స్థితి పవిత్రమైనది మరియు అది ఎప్పుడైనా సర్వర్ లేదా మరేదైనా క్లయింట్తో విభేదించడం ప్రారంభిస్తే, డీసింక్రొనైజేషన్ జరుగుతుంది.
మినహా ఆట స్థితి మాకు ఆలస్యమైన స్థితి ఉంది జాప్యం స్థితి. ఇది ప్రధాన రాష్ట్రం యొక్క చిన్న ఉపసమితిని కలిగి ఉంది. జాప్యం స్థితి ఇది పవిత్రమైనది కాదు మరియు ఆటగాడి నుండి వచ్చే ఇన్పుట్ల ఆధారంగా భవిష్యత్తులో గేమ్ స్థితి ఎలా ఉంటుందో చిత్రాన్ని సూచిస్తుంది ఇన్పుట్ చర్యలు.
దీన్ని చేయడానికి, మేము రూపొందించిన కాపీని ఉంచుతాము ఇన్పుట్ చర్యలు ఆలస్యం క్యూలో.
అంటే, క్లయింట్ వైపు ప్రక్రియ ముగింపులో, చిత్రం ఇలా కనిపిస్తుంది:
- దరఖాస్తు చేసుకోండి ఇన్పుట్ చర్యలు ఆటగాళ్లందరికీ ఆట స్థితి ఈ ఇన్పుట్ చర్యలు సర్వర్ నుండి స్వీకరించబడిన విధానం.
- ఆలస్యం క్యూ నుండి అన్నింటినీ తీసివేయండి ఇన్పుట్ చర్యలు, సర్వర్ ప్రకారం, ఇది ఇప్పటికే వర్తింపజేయబడింది ఆట స్థితి.
- తొలగించు జాప్యం స్థితి మరియు దానిని రీసెట్ చేయండి, కనుక ఇది సరిగ్గా అదే విధంగా కనిపిస్తుంది ఆట స్థితి.
- ఆలస్యం క్యూ నుండి అన్ని చర్యలను వర్తింపజేయండి జాప్యం స్థితి.
- డేటా ఆధారంగా ఆట స్థితి и జాప్యం స్థితి ఆటగాడికి ఆటను అందించండి.
ప్రతి బీట్లో ఇవన్నీ పునరావృతమవుతాయి.
చాలా కష్టం? విశ్రాంతి తీసుకోకండి, అంతే కాదు. నమ్మదగని ఇంటర్నెట్ కనెక్షన్లను భర్తీ చేయడానికి, మేము రెండు మెకానిజమ్లను సృష్టించాము:
- దాటవేయబడిన టిక్లు: సర్వర్ దానిని నిర్ణయించినప్పుడు ఇన్పుట్ చర్యలు అతను అందుకోకపోతే, ఆట యొక్క వ్యూహంలో అమలు చేయబడుతుంది ఇన్పుట్ చర్యలు కొంతమంది ఆటగాడు (ఉదాహరణకు, పెరిగిన ఆలస్యం కారణంగా), అతను వేచి ఉండడు, కానీ ఈ క్లయింట్కి తెలియజేస్తాడు “నేను మీ ఖాతాలోకి తీసుకోలేదు. ఇన్పుట్ చర్యలు, నేను వాటిని తదుపరి బార్లో జోడించడానికి ప్రయత్నిస్తాను. ఒక ప్లేయర్ యొక్క కనెక్షన్ (లేదా కంప్యూటర్తో) సమస్యల కారణంగా, ప్రతి ఒక్కరికీ మ్యాప్ నవీకరణ మందగించకుండా ఇది జరుగుతుంది. ఇది గమనించదగ్గ విషయం ఇన్పుట్ చర్యలు విస్మరించబడవు, కానీ వాయిదా వేయబడతాయి.
- పూర్తి రౌండ్-ట్రిప్ లేటెన్సీ: క్లయింట్ మరియు సర్వర్ మధ్య రౌండ్-ట్రిప్ లేటెన్సీ ప్రతి క్లయింట్కు ఎంత ఉందో ఊహించడానికి సర్వర్ ప్రయత్నిస్తుంది. ప్రతి 5 సెకన్లకు, ఇది క్లయింట్తో అవసరమైన విధంగా కొత్త ఆలస్యాన్ని చర్చిస్తుంది (గతంలో కనెక్షన్ ఎలా ప్రవర్తించిందనే దానిపై ఆధారపడి), మరియు తదనుగుణంగా రౌండ్ ట్రిప్ ఆలస్యాన్ని పెంచుతుంది లేదా తగ్గిస్తుంది.
స్వతహాగా, ఈ మెకానిజమ్లు చాలా సరళంగా ఉంటాయి, కానీ అవి కలిసి ఉపయోగించినప్పుడు (ఇది తరచుగా కనెక్షన్ సమస్యలతో జరుగుతుంది), కోడ్ లాజిక్ నిర్వహించడం కష్టమవుతుంది మరియు చాలా ఎడ్జ్ కేసులతో ఉంటుంది. అదనంగా, ఈ మెకానిజమ్లు అమలులోకి వచ్చినప్పుడు, సర్వర్ మరియు ఆలస్యం క్యూ ప్రత్యేకతను సరిగ్గా అమలు చేయాలి ఇన్పుట్ చర్య అనే స్టాప్ మూవ్మెంట్ఇన్నెక్స్ట్టిక్. దీనికి ధన్యవాదాలు, కనెక్షన్ సమస్యల విషయంలో, పాత్ర తనంతట తానుగా నడవదు (ఉదాహరణకు, రైలు కింద).
ఎంటిటీ ఎంపిక ఎలా పని చేస్తుందో ఇప్పుడు నేను మీకు వివరించాలి. ఆమోదించబడిన రకాల్లో ఒకటి ఇన్పుట్ చర్య ఒక ఎంటిటీ ఎంపిక స్థితిలో మార్పు. ఆటగాడు మౌస్తో ఏ ఎంటిటీపై కదులుతాడో ఇది అందరికీ చెబుతుంది. మీరు చూడగలిగినట్లుగా, క్లయింట్లు తరచుగా పంపే ఇన్పుట్ చర్యలలో ఇది ఒకటి, కాబట్టి బ్యాండ్విడ్త్ను సేవ్ చేయడానికి, మేము దీన్ని ఆప్టిమైజ్ చేసాము, తద్వారా ఇది వీలైనంత తక్కువ స్థలాన్ని తీసుకుంటుంది. ఇది ఇలా అమలు చేయబడుతుంది: ప్రతి ఎంటిటీని ఎంచుకున్నప్పుడు, సంపూర్ణ, అధిక-ఖచ్చితమైన మ్యాప్ కోఆర్డినేట్లను నిల్వ చేయడానికి బదులుగా, గేమ్ మునుపటి ఎంపిక నుండి తక్కువ-ఖచ్చితమైన సంబంధిత ఆఫ్సెట్ను నిల్వ చేస్తుంది. మౌస్ ఎంపిక సాధారణంగా మునుపటి ఎంపికకు చాలా దగ్గరగా జరుగుతుంది కాబట్టి ఇది బాగా పనిచేస్తుంది. ఇది రెండు ముఖ్యమైన అవసరాలకు దారితీస్తుంది: ఇన్పుట్ చర్యలు ఎప్పుడూ దాటవేయకూడదు మరియు సరైన క్రమంలో చేయాలి. ఈ అవసరాలు తీర్చబడ్డాయి ఆట స్థితి. కానీ పని నుండి జాప్యం స్థితి ఆటగాడికి "తగినంత అందంగా కనిపించడం"లో, వారు ఆలస్యం స్థితిలో సంతృప్తి చెందలేదు. జాప్యం స్థితి పరిగణలోకి తీసుకోదు
ఇది ఎక్కడికి వెళుతుందో మీరు ఇప్పటికే ఊహించవచ్చు. చివరగా, మేము మెగాప్యాకేజీ సమస్య యొక్క కారణాలను చూడటం ప్రారంభించాము. సమస్య యొక్క మూలం ఎంటిటీ ఎంపిక లాజిక్పై ఆధారపడి ఉంటుంది జాప్యం స్థితి, మరియు ఈ రాష్ట్రం ఎల్లప్పుడూ సరైన సమాచారాన్ని కలిగి ఉండదు. కాబట్టి మెగాప్యాకెట్ ఇలా ఉత్పత్తి చేయబడుతుంది:
- ప్లేయర్ కనెక్షన్ సమస్యలను ఎదుర్కొంటున్నాడు.
- చక్రాలను దాటవేయడం మరియు రౌండ్-ట్రిప్ ప్రసార ఆలస్యాన్ని నియంత్రించే విధానాలు అమలులోకి వస్తాయి.
- ఆలస్యం స్థితి క్యూ ఈ మెకానిజమ్లకు కారణం కాదు. దీని వలన కొన్ని చర్యలు ముందుగానే తీసివేయబడతాయి లేదా తప్పు క్రమంలో అమలు చేయబడతాయి, ఫలితంగా తప్పు జరుగుతుంది జాప్యం స్థితి.
- ప్లేయర్కు కనెక్షన్ సమస్య లేదు మరియు సర్వర్తో చేరుకోవడానికి 400 సైకిళ్ల వరకు అనుకరిస్తుంది.
- ప్రతి సైకిల్లో, ఎంటిటీ ఎంపికను మారుస్తూ, ఒక కొత్త చర్య రూపొందించబడుతుంది మరియు సర్వర్కు పంపడానికి సిద్ధం చేయబడుతుంది.
- క్లయింట్ 400+ ఎంటిటీ ఎంపిక మార్పుల మెగాప్యాకెట్ను సర్వర్కు పంపుతుంది (మరియు ఇతర చర్యలతో: ఫైరింగ్ స్థితి, నడక స్థితి మొదలైనవి కూడా ఈ సమస్యతో బాధపడ్డాయి).
- సర్వర్ 400 ఇన్పుట్ చర్యలను అందుకుంటుంది. ఒకే ఇన్పుట్ చర్యను దాటవేయడానికి ఇది అనుమతించబడదు కాబట్టి, ఇది ఈ చర్యలను చేయమని క్లయింట్లందరికీ నిర్దేశిస్తుంది మరియు వాటిని నెట్వర్క్ ద్వారా పంపుతుంది.
వ్యంగ్యం ఏమిటంటే, బ్యాండ్విడ్త్ను సంరక్షించడానికి రూపొందించిన యంత్రాంగం భారీ నెట్వర్క్ ప్యాకెట్లకు దారితీసింది.
మేము అన్ని అప్డేట్ ఎడ్జ్ కేసులను పరిష్కరించడం ద్వారా మరియు క్యూ మద్దతును ఆలస్యం చేయడం ద్వారా ఈ సమస్యను పరిష్కరించాము. దీనికి కొంత సమయం పట్టినప్పటికీ, శీఘ్ర హక్స్పై ఆధారపడకుండా చివరికి దాన్ని సరిగ్గా పొందడం విలువైనదే.
మూలం: www.habr.com