ssh · eieio.games కంటే సెకనుకు 100M పిక్సెల్స్ రెండరింగ్

ssh · eieio.games కంటే సెకనుకు 100M పిక్సెల్స్ రెండరింగ్


నేను అందుబాటులో ఉండే భారీ మల్టీప్లేయర్ స్నేక్ గేమ్‌ని రూపొందించాను ssh. రన్నింగ్ ద్వారా ఆడండి ssh snakes.run మీ టెర్మినల్‌లో:

గేమ్ బ్యాకెండ్ – స్నేక్ సెషన్ హ్యాండ్లర్ డెమోన్ లేదా sshd – వేలకొద్దీ కాకరెంట్ ప్లేయర్‌లను హ్యాండిల్ చేయగలదు మరియు సెకనుకు వంద మిలియన్ పిక్సెల్‌లకు పైగా రెండరింగ్ చేయగలదు.

గురించి మరింత తెలుసుకోవడానికి మీరు ఈ పేజీని సందర్శించవచ్చు ssh మరియు దాని చరిత్ర. గేమ్ ఎలా పని చేస్తుందో తెలుసుకోవడానికి చదవండి!


సవాళ్లు

పాములను నిర్మించడంలో నేను ఎదుర్కొన్న 3 ప్రధాన సవాళ్లు ఉన్నాయి.రన్.

  • ప్రదర్శన: టెర్మినల్‌లో పాము అందంగా కనిపించేలా చేయడం
  • బ్యాండ్‌విడ్త్: నా ప్రారంభ కోడ్ షాకింగ్ మొత్తాన్ని బ్యాండ్‌విడ్త్‌ని ఉపయోగించింది
  • పనితీరు: వేలాది మంది ఉమ్మడి ఆటగాళ్లకు మద్దతు ఇవ్వడం కష్టం

కానీ మేము ఆ సవాళ్లను ఎదుర్కొనే ముందు, గేమ్ ఎలా పని చేస్తుంది మరియు అది ఎలా రూపొందించబడింది అనే దాని గురించి శీఘ్ర పర్యటనను అందిస్తాము.

బేసిక్స్

అందరూ ఒకే చుట్టే ప్లేఫీల్డ్‌కి కనెక్ట్ అవుతారు. సాధారణ పాము నియమాలు వర్తిస్తాయి – మీరు పామును కొట్టినట్లయితే పెరగడానికి మరియు చనిపోవడానికి మీరు పండు తింటారు.

ssh ఒక మూగ క్లయింట్; ఇది సర్వర్ ద్వారా పంపబడిన వచన పంక్తులను స్వీకరిస్తుంది, డీక్రిప్ట్ చేస్తుంది మరియు ప్రదర్శిస్తుంది. కాబట్టి మా గేమ్‌ను అమలు చేయడానికి మేము ప్రతి ఫ్రేమ్ సర్వర్ వైపు రెండర్ చేస్తాము మరియు వాటిని మా క్లయింట్‌లకు రిలే చేస్తాము.

గేమ్ బబుల్టీయా (TUI ఫ్రేమ్‌వర్క్) ఉపయోగించి ఫ్రేమ్‌లను అందిస్తుంది, ఇది వరకు కట్టిపడేస్తుంది ssh కోరిక ద్వారా. నేను బ్యాండ్‌విడ్త్‌ని తగ్గించడానికి మరియు పనితీరును మెరుగుపరచడానికి బబుల్‌టియా మరియు గోస్ ssh లైబ్రరీ రెండింటినీ ఫోర్క్ చేసాను.

పాముల కోసం నిర్మాణ రేఖాచిత్రం.రన్. క్లయింట్‌లకు ఒక్కొక్కరికి వారి స్వంత బబుల్‌టియా / విష్ సెషన్ ఇవ్వబడుతుంది, అది ఒకే గేమ్ సర్వర్ ప్రాసెస్‌తో మాట్లాడుతుంది. SSH (సెక్యూర్ స్నేక్ హోమ్) ప్రోటోకాల్ ఉపయోగించి ట్రాఫిక్ పంపబడుతుంది.

గేమ్ సర్వర్ సెకనుకు 10 “టిక్క్స్” వద్ద నడుస్తుంది. మేము ప్రతి టిక్‌ను తరలించి, ప్లేయర్‌లను పెంచుతాము, పండ్లను తింటాము, ఘర్షణలను గణిస్తాము మరియు కొత్త గేమ్‌స్టేట్‌ను క్లయింట్‌లకు ప్రసారం చేస్తాము.

కాబట్టి ఇదంతా చాలా సులభం. మన పాములను ఎలా గీయాలి?

ఒక్కో అక్షరానికి రెండు పిక్సెల్‌లు

నా తొలి నమూనా పాములు మరియు పండ్ల కోసం Ascii అక్షరాలను ఉపయోగించింది. ఇది ఒక సమస్యని కలిగి ఉంది – టెర్మినల్ అక్షరాలు వెడల్పు కంటే రెండింతలు పొడవుగా ఉంటాయి కాబట్టి, నిలువు కదలిక క్షితిజ సమాంతర కదలిక కంటే చాలా వేగంగా అనిపించింది:

దీన్ని పరిష్కరించడానికి, నేను యూనికోడ్ బ్లాక్ ఎలిమెంట్స్‌కి మారాను. బ్లాక్ ఎలిమెంట్స్ అనేది (విచిత్రంగా అసంపూర్ణమైన) బ్లాక్ యూనికోడ్ అక్షరాల సమితి UPPER_HALF_BLOCK (▀), LOWER_HALF_BLOCK (▄), మరియు FULL_BLOCK (█) 1.

1

అవి ఏ కారణం చేతనైనా మీ కోసం రెండర్ చేయకపోతే, UPPER_HALF_BLOCK అనేది అక్షరం యొక్క పూర్తి వెడల్పు మరియు ఎగువ సగాన్ని తీసుకునే చతురస్రం మరియు FULL_BLOCK అనేది అక్షరం యొక్క పూర్తి వెడల్పు మరియు ఎత్తును తీసుకునే దీర్ఘచతురస్రం.

అక్షరాన్ని దిగువ బ్లాక్‌గా మరియు ఆపై ఎగువ బ్లాక్‌గా రెండరింగ్ చేయడం వలన మీకు ఒకే అక్షరంలో రెండు “ఫ్రేమ్‌ల” చలనం లభిస్తుంది మరియు చాలా సున్నితంగా కనిపిస్తుంది.

దాని పైన, మేము ముందు మరియు నేపథ్య రంగులను ఉపయోగించి రెండు పూర్తి పిక్సెల్‌ల రంగును పొందవచ్చు. మేము ఎగువ బ్లాక్‌ను సియాన్ యొక్క ముందు రంగు మరియు ఎరుపు నేపథ్య రంగుతో రెండర్ చేస్తే, ఎరుపు పిక్సెల్ పైన కూర్చున్న సియాన్ పిక్సెల్ వస్తుంది!

ఇది నేను ఇంతకు ముందు ఉన్నదాని కంటే మెరుగ్గా కనిపించింది. కానీ అది బ్యాండ్‌విడ్త్ హాగ్.

బ్యాండ్‌విడ్త్ సమస్య

నేను మల్టీప్లేయర్ గేమ్‌ను రూపొందించినప్పుడు నేను ప్రొఫైల్ చేసే మొదటి విషయం బ్యాండ్‌విడ్త్ వినియోగం. అనుకోకుండా చాలా ఎక్కువ బ్యాండ్‌విడ్త్‌ని ఉపయోగించడం సులభం మరియు ఇది సాధారణంగా నా అపరిమితమైన ఖర్చు కాబట్టి నేను దానిని తగ్గించాలనుకుంటున్నాను.


--------------------------------
frame 1072
bytes 3783800
bytes per frame 3529
--------------------------------

నేను ఒక్కోదానికి ~3,500 బైట్‌లను ఉపయోగించినట్లు టెస్టింగ్ నాకు చెప్పింది ఫ్రేమ్ – 10 FPS వద్ద, అది ~35 KB/సెకను. చక్కటి T1 లైన్ దానిని నిర్వహించగలిగినప్పటికీ, ఇది 56k మోడెమ్‌ను సులభంగా నింపుతుంది. మరియు 1,000 క్లయింట్‌లకు మద్దతు ఇవ్వడం అంటే 35 మందిని నెట్టడం మెగాబైట్లు రెండవది – చాలా ఎక్కువ!

నా బ్యాండ్‌విడ్త్ వినియోగాన్ని అర్థం చేసుకోవడానికి నేను బబుల్‌టియా రెండరింగ్ ఎలా పని చేసిందో చూసాను (హాస్యాస్పదంగా, నేను ఈ బ్లాగ్ 2ని ప్రచురించడానికి ముందు బబుల్‌టీయా వారి రెండరర్‌లో భారీ మెరుగుదలలు చేసింది).

2

ఈ గేమ్‌కి బబుల్‌టియా v2 ఎంత మెరుగ్గా ఉంటుందో నేను ప్రొఫైల్ చేయలేదు. నా అంతర్ దృష్టి ఏమిటంటే బబుల్టీయా v2 ఉండాలి దాదాపు నా అమలు వలె బ్యాండ్‌విడ్త్ సమర్ధవంతంగా ఉంటుంది, కానీ చిన్నవిషయం కాని నెమ్మదిగా.

ఆ సమయంలో బబుల్టీయా రెండరింగ్ పనిచేసిన విధానం:

  • మీరు ప్రతి ఫ్రేమ్‌కి ఒక స్ట్రింగ్ ఇచ్చారు
  • ఇది ఆ తీగను పంక్తులుగా విభజించింది
  • ఒక లైన్ చివరి ఫ్రేమ్‌లో ఉన్నట్లే ఉంటే, అది దాటవేయబడింది
  • లేకపోతే, క్లయింట్‌కు బబుల్‌టీయా మొత్తం లైన్‌ను మళ్లీ పంపింది

మన పాము క్రిందికి కదులుతున్న చిన్న గ్రిడ్ కోసం ఇది ఇలా కనిపిస్తుంది. మేము 3 మొత్తం పంక్తులను తొలగించి, మళ్లీ ముద్రించామని గమనించండి!

(మీరు స్టెప్ మరియు ప్లే బటన్‌లను ఉపయోగించి ఈ అనుకరణలను ముందుకు తీసుకెళ్లవచ్చు)

మా ప్లేఫీల్డ్ (వరకు) 80×35, మరియు ప్రతి ఫ్రేమ్‌లో దాదాపు ప్రతి లైన్ మారుతుంది. అంటే మనం పంపవచ్చు 80*35*10 = 28000 తెరపై ఉన్న పాత్రల కోసం ఒక సెకను బైట్ చేస్తుంది. మరియు అది రంగులు లేదా SSH ఓవర్‌హెడ్ వంటి వాటిని లెక్కించడానికి ముందు!

మనం బాగా చేయగలం.

స్టేట్‌ఫుల్ రెండరింగ్ మరియు VT100 సీక్వెన్సులు

టెర్మినల్ అప్లికేషన్‌లు “కర్సర్”ని కలిగి ఉంటాయి, అవి టెక్స్ట్ ఎడిటర్ లాగా కదలగలవు. మీరు VT100 సీక్వెన్స్‌లను ఉపయోగించడం ద్వారా కర్సర్‌కు “3వ పంక్తికి వెళ్లండి, అన్నింటినీ తొలగించండి, ఆపై ఈ కొత్త వచనాన్ని ప్రింట్ చేయండి” అని చెప్పవచ్చు. మరియు మీరు మొత్తం లైన్‌ను మళ్లీ విడుదల చేయకుండా, ఇప్పటికే ఉన్న అక్షరాలను కొత్త వాటితో భర్తీ చేయడానికి దీన్ని ఉపయోగించవచ్చు.

ఇది మా అనుకూల రెండరర్ యొక్క ఆధారం – మేము ప్రతి సెల్‌ను వేరు చేస్తాము మరియు మార్చబడిన అక్షరాలను మాత్రమే ముద్రిస్తాము. పై నుండి అదే ఉదాహరణ ఇక్కడ ఉంది – కానీ ఇప్పుడు మేము 6 మార్చబడిన సెల్‌లను ప్యాచ్ చేస్తాము.

క్షితిజ సమాంతర కదలిక కోసం మనం మరింత మెరుగ్గా చేయవచ్చు. మీ పాము కుడివైపుకు కదులుతున్నట్లయితే, స్క్రీన్ ఎడమ అంచున ఉన్న ప్రతి అక్షరాన్ని తొలగించి, కుడి అంచున కొత్తదాన్ని చొప్పించడం ద్వారా మేము ప్రారంభిస్తాము. ఆ తరువాత, మేము మా ప్యాచింగ్ (అవసరమైతే) చేస్తాము. ఇది స్వయంచాలకంగా పండ్లను తిరిగి ముద్రించాల్సిన అవసరం లేకుండానే సరైన స్థానానికి తరలిస్తుంది!

ఈ మార్పులతో బ్యాండ్‌విడ్త్ వినియోగం దాదాపు 4.5 KB/సెకనుకు పడిపోయింది 3. చాలా మెరుగుపడింది, కానీ మేము ఇంకా మెరుగ్గా చేయగలము.

DECSTBM మరియు DECLRMM గురించి ఏమిటి?

DECSTBM మరియు DECLRMM టెర్మినల్‌లో “మార్జిన్‌లను” సెట్ చేయడానికి మరియు ఆ మార్జిన్‌లలో “స్క్రోల్” చేయడానికి మిమ్మల్ని అనుమతిస్తాయి. DECSTBM నిలువు అంచుల కోసం మరియు DECLRMM సమాంతర వాటి కోసం.

ఉదాహరణకు, DECSTBMని ఉపయోగించి మీరు “పై మార్జిన్‌ని 5వ పంక్తికి మరియు దిగువ మార్జిన్‌ను 10వ పంక్తికి సెట్ చేసి, ఆపై 1 పైకి స్క్రోల్ చేయండి” అని చెప్పవచ్చు – ఇది 5వ పంక్తిని తొలగించడం ద్వారా మీరు వివరించిన ప్రాంతాన్ని “స్క్రోల్” చేస్తుంది, రీజియన్‌లోని మిగతావన్నీ 1 లైన్ ద్వారా పైకి మార్చడం మరియు 10వ పంక్తిలో కొత్త పంక్తిని చొప్పించడం.

మా యూనికోడ్ హాఫ్-బ్లాక్ షెనానిగన్‌ల కారణంగా DECSTBM పని చేయదు. మేము ప్రతి టెర్మినల్ క్యారెక్టర్‌లో రెండు పిక్సెల్‌లను స్క్వీజ్ చేస్తున్నాము, కాబట్టి మేము సగం పిక్సెల్‌లలో “స్క్రోల్” చేయాలనుకుంటున్నాము; మేము నిలువుగా కదులుతున్నప్పుడు మా స్క్రోల్ దిగువ సగం బ్లాక్‌లను ఎగువ సగం బ్లాక్‌లుగా మార్చాలి. ఆ ఆపరేషన్ ఉనికిలో లేదు.

DECLRMM మాకు పని చేస్తుంది – అడ్డంగా కదులుతున్నప్పుడు ప్రతి పంక్తిలో ఒక అక్షరాన్ని తొలగించడం ద్వారా మనం చేస్తున్నది ఇంచుమించుగా ఉంటుంది – కానీ ఇది చాలా తక్కువ టెర్మినల్ మద్దతును కలిగి ఉంది కాబట్టి నేను దానిపై ఆధారపడదలుచుకోలేదు.

3

ఇక్కడ అన్ని కొలతలు ఒకే ఆటగాడి కోసం; పెద్ద సంఖ్యలో ఆటగాళ్లతో బ్యాండ్‌విడ్త్ కోసం స్థిరమైన సంఖ్యలను అందించడం చాలా కష్టం. సాధారణంగా బ్యాండ్‌విడ్త్ వినియోగం ఎక్కువ మంది ప్లేయర్‌లతో ఎక్కువగా ఉంటుంది, అయితే ఈ ఆప్టిమైజేషన్‌లు ఇప్పటికీ చాలా సహాయపడతాయి.

స్టేట్‌ఫుల్ 4-బిట్ రంగులు

టెర్మినల్‌లో రంగు పని చేసే విధానం ఏమిటంటే మీరు ఒక సీక్వెన్స్‌ని ప్రతిధ్వనించడం \x1b(38:5:161m టెర్మినల్‌కు చెప్పడానికి “ముందుభాగం కోసం రంగు 161 (ఎరుపు) ఉపయోగించండి.” మీరు క్రమాన్ని పంపడం ద్వారా “రీసెట్” చేసే వరకు అన్ని అక్షరాలు 161 ముందు రంగును కలిగి ఉంటాయి \x1b(0m.

వాస్తవానికి, నేను లిప్‌గ్లాస్‌ని ఉపయోగించి ఈ రంగులను ఎంచుకున్నాను – టెర్మినల్ టెక్స్ట్ స్టైలింగ్ కోసం టెర్మినల్ యుటిలిటీ. మీరు లిప్‌గ్లాస్‌కు స్ట్రింగ్ మరియు కావలసిన రంగును ఇస్తారు మరియు అది మీకు స్ట్రింగ్‌ను ఇస్తుంది COLOR_CODE + YOUR_STRING + రీసెట్.

కానీ అది ఒక చాలా రీసెట్ చేయడం! బదులుగా మా రెండరర్‌లో ప్రస్తుత ముందుభాగం మరియు నేపథ్య రంగును ట్రాక్ చేయడం ద్వారా మరియు మనకు కావలసిన రంగు మారినప్పుడు మాత్రమే కొత్త కలర్ ఎస్కేప్ సీక్వెన్స్‌ను విడుదల చేయడం ద్వారా బ్యాండ్‌విడ్త్ సమూహాన్ని సేవ్ చేయవచ్చు. ఇది బుక్ కీపింగ్ యొక్క బాధించే మొత్తం, అయితే ఇది విడుదలయ్యే ఎస్కేప్ కోడ్‌ల మొత్తాన్ని గణనీయంగా తగ్గిస్తుంది.

చివరి సర్దుబాటుగా, నేను 8 బిట్ ansi రంగుల నుండి మారాను \x1b(38:5:161m వంటి 4 బిట్ రంగులు \x1b(31m. ఇది మా రంగు పరిధిని పరిమితం చేస్తుంది, అయితే ఇది ఒక్కో రంగుకు 6 బైట్‌ల వంటి వాటిని ఆదా చేస్తుంది.

ఈ మార్పులు, కొన్ని ఇతర చిన్న ట్వీక్‌లతో పాటు, గేమ్‌ను చక్కని ~2.5 KB/సెకనుకు తగ్గించాయి. చెడ్డది కాదు. బ్యాండ్‌విడ్త్ తర్వాత, నేను CPU గురించి ఆలోచించడం ప్రారంభించాను.

ప్రదర్శన

సెక్యూర్ స్నేక్ హోమ్ కమ్యూనిటీ కొత్త సర్వర్‌ని ప్లే చేయడానికి ఉత్సాహంగా ఉంటుందని నేను గుర్తించాను, కాబట్టి నేను కనీసం వెయ్యి మంది ఉమ్మడి ఆటగాళ్లకు మద్దతు ఇవ్వాలనుకుంటున్నాను. కానీ ప్రారంభ పనితీరు ప్రొఫైలింగ్ చెడు. నేను ప్రతి 40 మంది వినియోగదారులకు పూర్తి కోర్ వంటిదాన్ని ఉపయోగిస్తున్నాను.

పనితీరు ప్రొఫైల్ యొక్క ఫ్లేమ్‌గ్రాఫ్ వీక్షణ. 6.5 సెకన్ల CPU సమయం ఉపయోగించబడింది.

10 మంది ఆటగాళ్లతో 30 సెకన్ల ప్రొఫైల్. గొప్ప కాదు!

నేను ఒక మూగ ఉచిత విజయాన్ని కనుగొన్నాను (ఫ్రేమ్‌కు వేలసార్లు పెద్ద స్ట్రక్టులో పిలువబడే యుటిలిటీ ఫంక్షన్‌లో నేను పొరపాటున విలువ రిసీవర్‌లను ఉపయోగించాను). కానీ నేను కనుగొన్న మిగిలిన స్పీడ్‌అప్‌లు మరింత శ్రమించాయి.

తీగలు మరియు కేటాయింపులు

నా సమయం 25% లిప్‌గ్లాస్ యుటిలిటీ ఫంక్షన్‌లలో వెచ్చించబడింది (లిప్‌గ్లాస్ అనేది TUIల కోసం స్ట్రింగ్‌లను ఫార్మాటింగ్ చేయడానికి సహాయక లైబ్రరీ).

లిప్‌గ్లాస్ సులభమైంది – మీరు దానికి రెండు స్ట్రింగ్‌లను ఇచ్చి, “వీటిని నిలువుగా కలపండి, రెండూ ఎడమవైపుకి సమలేఖనం చేయబడి ఉన్నాయని నిర్ధారించుకోండి” అని చెప్పవచ్చు మరియు స్ట్రింగ్‌లు వేర్వేరు వెడల్పులను కలిగి ఉన్నప్పటికీ అది చేస్తుంది. ఇది టెర్మినల్ కోసం నిర్మించబడింది, కాబట్టి ఇది ansi ఎస్కేప్ కోడ్‌లు మరియు డబుల్ వెడల్పు అక్షరాలు మరియు వంటి వాటిని ఎలా నిర్వహించాలో తెలుసు.

కానీ ఆ విషయాన్ని నిర్వహించడం నెమ్మదిగా. స్ట్రింగ్ వెడల్పును లెక్కించడానికి అది కాల్ చేయదు len స్ట్రింగ్ మీద. బదులుగా అది ఒక రాష్ట్ర యంత్రం ద్వారా ప్రతి పాత్రను పాస్ చేయాలి.

నేను దాదాపు నా లిప్‌గ్లాస్ కాల్‌లన్నింటినీ తీసివేసాను మరియు స్ట్రింగ్‌లను కలపడం మరియు కొలవడం కోసం వాటిని చేతితో చుట్టిన ఫంక్షన్‌లతో భర్తీ చేసాను. ఈ ఫంక్షన్‌లు దాదాపుగా సాధారణమైనవి కావు, కానీ అది బాగానే ఉంది – అవి నా వినియోగ సందర్భంలో పనిచేశాయి.

ప్రతిదీ ముందుగా కేటాయించండి

ఉచిత విజయం మరియు లిప్‌గ్లాస్ మార్పుల తర్వాత, నా CPUలో ~15% సమయం గడిపినట్లు నేను గమనించాను gcBgMarkWorker – గో చెత్త సేకరించేవాడు. అంటే ఎ చాలా చెత్త సేకరణ గురించి ఆలోచిస్తూ సమయాన్ని వెచ్చిస్తారు.

ప్రాథమిక కారణం నా చేతితో చుట్టబడిన స్ట్రింగ్ యుటిలిటీ ఫంక్షన్‌లు. వారు లిప్‌గ్లాస్ కంటే వేగంగా ఉన్నప్పటికీ, వారు ఇప్పటికీ ప్రతి క్రీడాకారుడి కోసం ప్రతి ఫ్రేమ్‌లో టన్నుల కొద్దీ తీగలను ఉత్పత్తి చేస్తూనే ఉన్నారు.

దీని కోసం పని చేయడానికి, నేను ముందుగా కేటాయించడం ప్రారంభించాను…అన్నీ:

var (
	paddingCache                (200)string
	horizontalBarCache          (200)string
	topBorderCache              (200)string
	bottomBorderCache           (200)string
	topLineCache                (400)string
	shutdownBannerCache         (10)(400)string 
	paddedTopBorderCache        (200)(200)string
	paddedBottomBorderCache     (200)(200)string
	paddedInstructionsCache     (400)string
	paddedInstructionsDeadCache (400)string

	glyphPaddingCache     (200)()tea.StringWithColorPreference
	glyphPlayerCountCache (2000)()tea.StringWithColorPreference
	glyphBlinkCache       (60)()tea.StringWithColorPreference
	glyphSizeCache        (2000)()tea.StringWithColorPreference
	glyphLongestCache     (2000)()tea.StringWithColorPreference
)

ఉదాహరణకు, snakes.run మీ స్క్రీన్ మొత్తం పైభాగంలో విస్తరించి ఉన్న “బ్యానర్”ని కలిగి ఉంది. ఇది ఇలా కనిపిస్తుంది:

by eieio.games                      ssh snakes.run

గేమ్ షట్ డౌన్ చేయబోతున్నప్పుడు, దానిని చూపించడానికి బ్యానర్ అప్‌డేట్ చేయబడుతుంది:

by eieio.games  SHUTTING DOWN IN 5  ssh snakes.run

స్ట్రింగ్ కాషింగ్‌కు ముందు, కోడ్ ప్రతి ఫ్రేమ్‌లో మీ ప్రస్తుత టెర్మినల్ కొలతలు ఆధారంగా ఈ బ్యానర్‌ను డైనమిక్‌గా ఉత్పత్తి చేస్తుంది. కానీ అది వ్యర్థం! ఇప్పుడు, మేము ప్రతి బ్యానర్ పరిమాణాన్ని (ఏదైనా షట్‌డౌన్ సమయం మిగిలి ఉంటే) ముందుగానే గణిస్తాము మరియు ఆ ప్రీ-కంప్యూటెడ్ బ్యానర్‌ను బైట్ బఫర్‌లోకి స్లామ్ చేస్తాము, ఇంటర్మీడియట్ కేటాయింపును దాటవేస్తాము.

ఈ మార్పులు, బబుల్టీయా కోడ్ యొక్క కొన్ని అదనపు ట్వీకింగ్‌లతో పాటు, gcలో గడిపిన సమయాన్ని ~0.5%కి తగ్గించాయి.

SSH ట్వీకింగ్

పనితీరును కొనసాగించడం కొనసాగిస్తున్నప్పుడు, నేను ఒక విచిత్రమైన నమూనాను గమనించాను – నా ssh క్లయింట్ నేను చేసిన ప్రతి కదలికతో పాటు వందల కొద్దీ నో-ఆప్ ప్యాకెట్‌లను పంపాడు. ఈ ప్యాకెట్లను ప్రాసెస్ చేయడం వలన నా సర్వర్ చాలా మందగించింది.

దీన్ని డీబగ్ చేయడం చాలా ఆసక్తికరంగా ఉంది, దాని గురించి నేను పూర్తి ప్రత్యేక బ్లాగును వ్రాసాను, కానీ నేను ఇక్కడ సంగ్రహిస్తాను.

2023లో, సెక్యూర్ స్నేక్ హోమ్ మోడింగ్ కలెక్టివ్ ఓపెన్‌ఎస్‌ఎస్‌హెచ్ కీస్ట్రోక్ టైమింగ్ అస్పష్టతను జోడించింది. ssh క్లయింట్. ఆలోచన ఏమిటంటే సమయపాలన మీ కదలికలు కదలికలు ఏమిటో గురించి సమాచారాన్ని అందిస్తుంది.

మూవ్-స్నిఫింగ్ దాడులను నిరోధించడానికి టాటు య్లోనెన్ యొక్క ssh అభివృద్ధికి ఈ మార్పు ఆధ్యాత్మికంగా అనుగుణంగా ఉన్నప్పటికీ, మేము భారీ మల్టీప్లేయర్ ఆటపై దృష్టి సారించినందున ఇది మాకు అవసరం లేదని నేను గుర్తించాను, పోటీ ఆటపై కాదు.

దీన్ని ఎలా తొలగించాలో గుర్తించడం కొంచెం సవాలుగా ఉంది – నేను గోస్ క్రిప్టో లైబ్రరీని ఫోర్కింగ్ చేసాను – కానీ అది ఒక భారీ గెలుస్తారు. పనితీరు సుమారు రెట్టింపు!

చివరి సర్దుబాటులు

నా మిగిలిన పనితీరు విజయాలు చాలా విలక్షణమైనవి – చాలా పనితీరు జాడలను చూస్తూ CPU సైకిల్స్‌లో చిన్న తగ్గింపులు.

ఈ రోజు నుండి పనితీరు ప్రొఫైల్ ఇక్కడ ఉంది:

పనితీరు ప్రొఫైల్ యొక్క ఫ్లేమ్‌గ్రాఫ్ వీక్షణ. 6.6 సెకన్ల CPU సమయం ఉపయోగించబడింది.

మేము 25x వేగాన్ని అందిస్తాము

మేము ప్రారంభించినప్పుడు అదే మొత్తంలో CPU వినియోగం ఉంది – కానీ నేను దానితో నడుస్తున్నాను 250 వినియోగదారులు, కాదు 10. 25 రెట్లు వేగవంతమైనది చెడ్డది కాదు. ఈ సెటప్‌తో, నేను ఏదైనా నత్తిగా మాట్లాడటం ప్రారంభించే ముందు దాదాపు 2,500 మంది ఉమ్మడి వినియోగదారులకు మద్దతు ఇవ్వగలను.

అది నాకు ఈ పోస్ట్ యొక్క శీర్షిక కోసం గణితాన్ని ఇస్తుంది. ప్రతి పరీక్ష వినియోగదారుడు ~2,200 అక్షరాలతో ప్లేఫీల్డ్‌ను కలిగి ఉన్నారు మరియు ప్రతి అక్షరం 2 పిక్సెల్‌లను కలిగి ఉంటుంది. గేమ్ 10 FPS వద్ద నడుస్తుంది. 2500 * 2200 * 2 * 10 100 మిలియన్ కంటే కొంచెం ఎక్కువ! బహుశా అది సరసమైన కొలత కాకపోవచ్చు, కానీ నేను ఎంచుకున్నది ఇదే.

చుట్టేస్తోంది

ది ssh modding కమ్యూనిటీ గత కొన్ని సంవత్సరాలుగా చూడటం చాలా ఆనందంగా ఉంది. Terminal Products, Inc ssh ద్వారా కాఫీని విక్రయించగలిగింది మరియు OpenSSH వ్యక్తులు రిమోట్‌గా కంప్యూటర్‌లలోకి లాగిన్ చేయడానికి కూడా దీనిని ఉపయోగించారని నేను విన్నాను!

అయితే ఆన్‌లైన్‌లో మల్టీప్లేయర్ స్నేక్‌ను సురక్షితంగా ప్లే చేయడం ద్వారా సెక్యూర్ స్నేక్ హోమ్‌ని దాని మూలాలకు తిరిగి తీసుకురావడానికి నేను నిజంగా ఉత్సాహంగా ఉన్నాను.

మీరు ఆడటం ఆనందిస్తారని ఆశిస్తున్నాను 🙂



Source link

Postagens Similares

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *