కాండెన్స్ మరియు కంప్రెస్: మా కస్టమ్ బైనరీ ఫైల్ ఫార్మాట్

గత సంవత్సరంలో మేము ROBLOXకు తీసుకువచ్చిన పనితీరు మెరుగుదలలు మరియు రెండరింగ్ ఫీచర్ల గురించి ఆలోచించండి. వాటిలో ఫెదర్వెయిట్ పార్ట్స్, ఫాస్ట్ క్లస్టర్లు, సమర్థవంతమైన కొలిజన్ డిటెక్షన్ మరియు డైనమిక్ లైటింగ్ ఉన్నాయి. ఈ మెరుగుదలలు ఒకప్పుడు బిల్డర్లు ఎదుర్కొన్న భాగాల సంఖ్య, ఫిజిక్స్ సిమ్యులేషన్ మరియు సౌందర్యపరమైన సౌలభ్యం వంటి పరిమితులను అధిగమించి, అవకాశాల ప్రపంచానికి ద్వారాలు తెరిచాయి. బిల్డర్లు మునుపెన్నడూ లేనంతగా సరిహద్దులను అధిగమించడంతో, ఇవి కొత్త పరిమితులను కూడా బయటపెట్టాయి. ఈ వ్యాసంలో, ROBLOX ప్లేస్ల ఫైల్ సైజ్లో సుమారు 100 రెట్లు మరియు లోడ్/సేవ్ సమయంలో 5-10 రెట్ల తగ్గింపును మేము ఎలా సాధించామో వివరిస్తాము.
ఫెదర్వెయిట్ భాగాల గురించి ఆలోచించండి. ఈ ఫీచర్, ఇప్పుడు కేవలం కొన్ని ఆకారాలు మరియు మెటీరియల్స్కు మాత్రమే కాకుండా అన్ని ROBLOX భాగాలకు వర్తిస్తుంది, ఇది వేలాది ఇటుకలతో ఒక ROBLOX ప్లేస్ను సృష్టించడానికి మరియు దానిని డెస్క్టాప్ మరియు మొబైల్ పరికరాలపై అమలు చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. అయితే, వేలాది భాగాలు ఉన్న ఒక ప్లేస్ చాలా పెద్ద ఫైల్కు దారితీయవచ్చు. ఈ వ్యాసంలో మేము పదేపదే ప్రస్తావించబోయే మా పరీక్షా స్థలం, 50,000 భాగాలను కలిగి ఉంది మరియు దాని పరిమాణం ఏకంగా 230 మెగాబైట్లు. ఇది బిల్డర్లను అనేక విధాలుగా ప్రభావితం చేస్తుంది: రెండరింగ్, సేవింగ్/లోడింగ్, పబ్లిషింగ్, సర్వర్ నుండి స్థలాన్ని లోడ్ చేయడం మరియు మరిన్ని.
వినియోగదారు అనుభవాన్ని మెరుగుపరచడానికి మరియు ఇంకా ప్రకటించని ప్రాజెక్ట్ అభివృద్ధికి మద్దతు ఇవ్వడానికి, ROBLOX సృష్టిల ఫైల్ పరిమాణాన్ని పరిష్కరించడానికి ఇదే సరైన సమయం అని మేము నిర్ణయించుకున్నాము. ఆ దిశగా, మేము త్వరలో ఒక కొత్త ఫైల్ ఫార్మాట్ను పరీక్షించడం ప్రారంభించబోతున్నాము, ఇది ROBLOX డేటాను XMLకు బదులుగా బైనరీ ఫార్మాట్లో సేవ్ చేస్తుంది. ఈ మార్పు వినియోగదారులకు తెలియకుండానే జరుగుతుంది, కానీ కాలక్రమేణా నిర్మాతలు వేచి ఉండటానికి తీసుకునే సమయాన్ని తగ్గిస్తుంది. మేము ROBLOX డేటాను సేవ్ చేసే కొత్త పద్ధతిని నెమ్మదిగా అమలు చేయబోతున్నాము, ROBLOX స్టూడియోలోని "ప్లే సోలో" మరియు "స్టార్ట్ సర్వర్" సెషన్ల కోసం సృష్టించబడిన తాత్కాలిక ఫైల్లతో ప్రారంభించి, చివరికి దానిని పర్సనల్ బిల్డ్ సర్వర్ స్టోరేజ్, ప్లేస్ అప్లోడ్లు మరియు లోకల్ సేవ్లకు తీసుకువస్తాము.

పాతదాన్ని పక్కన పెట్టండి
ఫైల్ పరిమాణం ముఖ్యం. ఇది స్థానికంగా ఒక ఫైల్ను సేవ్ చేయడానికి మరియు లోడ్ చేయడానికి, అలాగే ROBLOX.com లోకి కంటెంట్ను ప్రచురించడానికి మరియు లోడ్ చేయడానికి పట్టే సమయాన్ని ప్రభావితం చేస్తుంది. అదనంగా, ROBLOX.com లోకి ఏమి ప్రచురించవచ్చనే దానిపై ఫైల్-పరిమాణ పరిమితి ఉంది (గేమ్ లోడ్ అయిన తర్వాత అదనపు భాగాలను రూపొందించే స్క్రిప్ట్లను వ్రాయడం ద్వారా బిల్డర్లు దీనికి పరిష్కారాలను కనుగొన్నారు).
ROBLOX చాలా కాలంగా ప్లేస్ డేటాను XML ఫార్మాట్లో సేవ్ చేస్తోంది. ఇది ఒక సులభంగా అర్థమయ్యే, హైరార్కీ-ఆధారిత ఫార్మాట్, దీనిలో ప్రతి ఆబ్జెక్ట్కు ప్రాపర్టీలు ఉంటాయి, మరియు ప్రతి ప్రాపర్టీకి ఒక విలువ ఉంటుంది, మరియు అన్నీ డేటా యొక్క ఒక చక్కని ట్రీలో ఒకదానికొకటి సరిపోతాయి. అయితే, ఇది అనంతంగా స్కేల్ అవ్వదు, ప్రధానంగా ఎందుకంటే మెమరీ-రీడబుల్ డేటాను స్ట్రింగ్గా మార్చడానికి సమయం పడుతుంది (ఉదాహరణకు, సేవ్ చేసేటప్పుడు) మరియు గణనీయమైన పునరావృతం ఉంటుంది. దాదాపు ఒకేలా ఉండే రెండు భాగాలు పూర్తిగా విడివిడిగా XML చంక్లుగా నిల్వ చేయబడతాయి. XMLగా సేవ్ చేసినప్పుడు, 50,000 భాగాలు మరియు 230 మెగాబైట్ల ఫైల్ సైజు ఉన్న మా పరీక్షా ప్రదేశాన్ని సేవ్ చేయడానికి 23 సెకన్లు మరియు లోడ్ చేయడానికి 37 సెకన్లు పడుతుంది. మానవ-చదవగలిగేలా (డీబగ్గింగ్ ప్రయోజనాలకు ఉపయోగపడుతుంది) మరియు ఫార్వర్డ్/బ్యాకవర్డ్-అనుకూలంగా (ROBLOX స్టూడియో మరియు ROBLOX ప్లేయర్ ఎల్లప్పుడూ వెర్షన్-ప్యారిటీలో ఉండని వాతావరణంలో ఉపయోగపడుతుంది) ఉండటం వంటి ప్రయోజనాలు ఉన్నప్పటికీ, మేము ఈ ఫార్మాట్ నుండి పెరిగిపోతున్నాము.
మేము మా XML పార్సర్ను మెరుగుపరచడం గురించి ఆలోచించాము, కానీ దాని ప్రయోజనాలు పరిమితంగానే ఉంటాయని మాకు తెలుసు. అందువల్ల, మేము ROBLOX డేటాను సేవ్ చేసే ఫార్మాట్ను పూర్తిగా మార్చాలని నిర్ణయించుకున్నాము.
కొత్త వాటితో ముందుకు
ROBLOX క్రియేషన్ను బైనరీ ఫార్మాట్లో సేవ్ చేయడం ద్వారా, మేము ప్రాపర్టీలకు అనవసరమైన రిఫరెన్స్లను తొలగిస్తాము. దానివల్ల మాత్రమే ఫైల్ పరిమాణంలో 10 రెట్లు తగ్గుదల కలుగుతుంది.
టెక్స్ట్-ఆధారిత XML ఫార్మాట్కు బైనరీ ఒక ప్రత్యామ్నాయం. ఈ రెండింటి మధ్య స్పష్టమైన వ్యత్యాసాలు ఉన్నాయి.
- బైనరీ మానవ-చదవగలిగేది కాదు. అయితే, బైనరీ డేటా దాని ఇన్-మెమరీ ప్రాతినిధ్యాన్ని దగ్గరగా పోలి ఉంటుంది, అంటే మెమరీలో ఉన్న ఒక ఆబ్జెక్ట్ను పొంది, దానిని బైట్ల ప్రవాహంగా వ్రాయడం (మరియు విలోమంగా) మాకు సులభం.
- ప్రతి వస్తువులో దాదాపు 30 ప్రాపర్టీలు మరియు వాటి విలువలు ఉండే ఒక హైరార్కీకి బదులుగా, పునరావృతాలను తగ్గించడానికి ROBLOX డేటాను గ్రూపులలో నిల్వ చేస్తుంది (అంటే, ప్రతి ప్రాపర్టీకి, అన్ని వస్తువుల విలువలను ఒకే చోట సేవ్ చేస్తాము). భవిష్యత్తులో మనం ఏదైనా భాగం యొక్క ప్రాపర్టీని తొలగిస్తే సంభవించే, నిలిపివేయబడిన డేటాను లోడ్ చేయడాన్ని దాటవేయడాన్ని కూడా ఇది సులభతరం చేస్తుంది. మనం ఇప్పటికీ ఫార్వర్డ్ మరియు బ్యాకవర్డ్ కంపాటబిలిటీ ప్రయోజనాన్ని పొందుతాము.
ROBLOX క్రియేషన్ను బైనరీ ఫార్మాట్లో సేవ్ చేయడం ద్వారా, మేము ప్రాపర్టీలకు అనవసరమైన రిఫరెన్స్లను (వాటిని వినియోగదారులు జోడించలేరు/తొలగించలేరు మరియు అవి తరచుగా స్థిరంగా ఉంటాయి) తొలగిస్తాము మరియు ఫైల్ పరిమాణాలను సుమారు 10 రెట్లు తగ్గిస్తాము. అయినప్పటికీ, ఇది ఏదో ఒక మాయా స్విచ్ నొక్కినంత సులభం కాదు; మేము ప్రాపర్టీ విలువలను (పూర్ణాంకాలు) వేగవంతమైన మరియు కంప్రెస్ చేయగల విధంగా సేవ్ చేయడానికి ఒక కస్టమ్ పద్ధతిని సృష్టించాము.
వేగం మరియు కంప్రెషన్ కోసం ప్రాపర్టీ విలువలను మార్చడం
ఇది ప్రాపర్టీ విలువ అయిన ఇంటీజర్లను నాలుగు బైట్లుగా విభజించడంతో మొదలవుతుంది. ప్రతి బైట్కు గరిష్ట విలువ 2^8-1 (లేదా 255). ఏడు ఇలా కనిపిస్తుంది:
0 | 0 | 0 | 7 |
మరియు 258 విలువ ఇలా కనిపిస్తుంది:
0 | 0 | 1 | 2 |
ప్రతి విలువను వరుసగా నిల్వ చేయడానికి బదులుగా, మా కోడ్ విలువలను కాలమ్ ప్రకారం నిల్వ చేస్తుంది. ROBLOXలోని చాలా ప్రాపర్టీ విలువలు చిన్నవిగా ఉండటం వలన, చాలా సున్నాలు ఒకదానిపై ఒకటి పేరుకుపోతాయి. ఈ రకమైన పునరావృతం కాంప్రెషన్కు చాలా బాగుంటుంది.
ఉదాహరణకు, మనం ఈ క్రింది పూర్ణాంకాలను ఫైల్లోకి వ్రాయాలనుకుందాం: 1, 5, 4, 258. ఒక సరళమైన విధానం వాటి బైట్లను వరుసగా ఇలా వ్రాస్తుంది:
0 | 0 | 0 | 1 | 0 | 0 | 0 | 5 | 0 | 0 | 0 | 4 | 0 | 0 | 1 | 2 |
కానీ మా కాలమ్ వారీగా పునః-క్రమంలో, అవి ఇలా వ్రాయబడతాయి:
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 5 | 4 | 2 |
చాలా సున్నాలు పునరావృతమవడం వల్ల ఇది చాలా సమర్థవంతంగా సంక్షేపణ చేయబడుతుంది.
నెగటివ్ సంఖ్యలు ఈ పద్ధతిలో గందరగోళాన్ని సృష్టిస్తాయి. అవి అంత సాధారణంగా కనిపించవు, కానీ ఉదాహరణకు, ఒక GUI ఎలిమెంట్కు ఆఫ్సెట్ ఇవ్వడానికి నెగటివ్ సంఖ్యను ఉపయోగించినప్పుడు ROBLOX డేటాలో అవి తలెత్తవచ్చు. సైన్ను తిప్పడానికి టూస్ కంప్లిమెంట్ అని పిలువబడే గణితశాస్త్ర కార్యకలాపాన్ని (2^32 + (-7)) వర్తింపజేసిన తర్వాత, నెగటివ్ ఏడు ఈ విధంగా కనిపిస్తుంది:
255 | 255 | 255 | 249 |
ఈ సున్నా-కాని సంఖ్యలన్నీ మన లక్ష్యానికి అడ్డుపడతాయి: సున్నాలతో బాగా సంక్షిప్తమయ్యే బైట్ స్ట్రీమ్. ప్రతికూల పూర్ణాంకాలను చిన్న ధనాత్మక పూర్ణాంకాలుగా మార్చడానికి మేము రెండవ ఉపాయాన్ని రూపొందించాము. ఒక విలువ 0 కంటే ఎక్కువ లేదా సమానంగా ఉన్నప్పుడల్లా, మేము దానిని ఈ సూత్రం ద్వారా పంపుతాము:
2 x nఏదైనా సంఖ్య 0 కంటే తక్కువగా ఉన్నప్పుడు, మేము దానిని ఈ విధంగా పరిగణిస్తాము:
2 x |n| - 1దీని అర్థం, 7 విలువ 14 (2 x 7)గా సూచించబడుతుంది. -7 విలువ 13 (2 x |7| - 1)గా సూచించబడుతుంది. మేము ఈ సంఖ్యలను పేర్చినప్పుడు, సున్నాలు పేరుకుపోయి, మాకు చాలా సులభంగా సంక్షిప్తీకరించగల ఫైల్ లభిస్తుంది.
0 | 0 | 0 | 14 |
0 | 0 | 0 | 13 |
ఈ మార్పిడులు మరియు లెక్కింపులన్నీ చాలా తక్కువ ఖర్చుతో జరుగుతాయి. అందువల్ల, పూర్తిగా కంప్రెషన్ అల్గారిథమ్పై ఆధారపడటం కంటే ఫ్రంట్ ఎండ్లో ఈ పనిని నిర్వహించడం చాలా సమర్థవంతమైనది.
ప్రాపర్టీ విలువ పూర్ణాంకాలను బైట్లుగా విభజించిన తర్వాత, మేము డేటాను స్వయంచాలకంగా LZ4 కంప్రెషన్ ద్వారా పంపిస్తాము, ఇది చాలా తక్కువ ఖర్చుతో బైనరీ డేటాను త్వరగా కంప్రెస్ చేసే ఒక లోస్లెస్ అల్గారిథమ్. ఇది ఫైల్ పరిమాణాన్ని మరింతగా తగ్గిస్తుంది. గతంలో, ఫైల్-స్టోరేజ్ ప్రక్రియలో ఈ దశలో ఎటువంటి కంప్రెషన్ ఉండేది కాదు – ఇది ROBLOX.com కు HTTP ద్వారా క్రియేషన్ బదిలీ అయినప్పుడు Gzip యొక్క స్వయంచాలక కంప్రెషన్ ద్వారా మాత్రమే జరిగేది.
కొత్త ఫార్మాట్ను పరీక్షించడం
బైనరీ ఫైల్ ఫార్మాట్ మరియు LZ4 కంప్రెషన్తో, 230 మెగాబైట్ ROBLOX ప్లేస్ 1 మెగాబైట్ కంటే తక్కువకు తగ్గించబడింది. Gzip కంప్రెషన్ తర్వాత, ఫైల్ సుమారు 100 కిలోబైట్లు ఉంటుంది. మేము అంతర్గతంగా నిర్వహించిన కొన్ని పరీక్షల ఫలితాలు ఇక్కడ ఉన్నాయి:
టెస్ట్ 1
మేము 50,000 భాగాలు, 150,000 మాన్యువల్ వెల్డ్ జాయింట్లు మరియు 8 మిలియన్ వోక్సెల్స్తో ఒక టెస్ట్ ప్లేస్ను నిర్మించాము.
XML | బైనరీ | |
పరిమాణం | 230 mb | 600 kb |
పరిమాణం (జిప్ తర్వాత) | 3.9 mb | 93 kb |
లోడ్ సమయం | 27 సెకన్లు | 3.7 సెకన్లు |
సమయం ఆదా చేయండి | 20 సెకన్లు | 0.5 సెకన్లు |
టెస్ట్ 2
మేము పరీక్షించాము: వెల్కమ్ టు ది నెబర్హుడ్ ఆఫ్ రోబ్లాక్సియా, ఇది 40,000 భాగాలతో నిర్మించిన ఒక అసలైన రోబ్లాక్స్ లెవల్. ఈ లెవల్లో ఎక్కువ జాయింట్లు లేవు, అందుకే టెస్ట్ ప్లేస్తో పోలిస్తే సంఖ్యలలో తేడా కనిపిస్తుంది. ఫైల్ సైజ్ను తగ్గించడానికి, చాలా మంది ధైర్యవంతులైన బిల్డర్లు స్క్రిప్ట్ ద్వారా తమ లెవల్స్ నుండి జాయింట్లను తొలగించారు, కానీ దానివల్ల ఫిజికల్ సిమ్యులేషన్ కోల్పోయారు. ఇది వారికి పనిని సులభతరం చేస్తుంది.
XML | బైనరీ | |
పరిమాణం | 112 mb | 1 mb |
పరిమాణం (జిప్ తర్వాత) | 3.5 mb | 700 kb |
లోడ్ సమయం | 15 సెకన్లు | 2 సెకన్లు |
సమయం ఆదా చేయండి | 9 సెకన్లు | 0.2 సెకన్లు |
గమనిక: లోడ్/సేవ్ సమయాలు సర్వర్ నుండి గణించబడతాయి; స్టూడియో సేవ్ సమయం కూడా అలాగే ఉంటుంది, కానీ అన్డూ/రీడూను నిర్వహించే సిస్టమ్ను ఏర్పాటు చేయడానికి కొంత అదనపు పని చేస్తుంది కాబట్టి స్టూడియో లోడ్ సమయం కొంచెం ఎక్కువగా ఉంటుంది.

రెండు పరీక్షలలో, ఫైల్ పరిమాణంలో 100 రెట్లు మరియు లోడ్/సేవ్ సమయంలో 5-10 రెట్ల తగ్గింపు వంటి మెరుగుదలలు ఉన్నాయి. ఈ వ్యాసం ప్రారంభంలో పేర్కొన్నట్లుగా, మేము బైనరీ ఫైల్ ఫార్మాట్ను నెమ్మదిగా విడుదల చేస్తాము, "ప్లే సోలో" లేదా "స్టార్ట్ సర్వర్" ఉపయోగించి మీరు ROBLOX స్టూడియో ద్వారా ప్లే సెషన్ను ప్రారంభించినప్పుడు సృష్టించబడిన తాత్కాలిక ఫైల్లతో ప్రారంభిస్తాము. ఇది మీ డేటాను క్షీణింపజేయదని నిర్ధారించుకోవడానికి మేము తగినంత జాగ్రత్త తీసుకున్నాము, కానీ మీరు ఏదైనా వింత ప్రవర్తనను గమనిస్తే (ఉదాహరణకు, మీ భాగాలు ఉండవలసిన విధంగా కనిపించకపోవడం లేదా, అంతగా సంభవం కానిది, మీరు ఒక ఫైల్ను తెరవలేకపోవడం) మేము మీ అభిప్రాయాన్ని కోరుతాము.
మేము చివరికి పర్సనల్ బిల్డ్ సర్వర్ మరియు లోకల్ సేవ్ల కోసం డేటాను బైనరీ ఫార్మాట్లో నిల్వ చేయడం ప్రారంభిస్తాము. ఆ సమయంలో, మీరు ఎక్కువ ప్రయోజనాన్ని పొందడం ప్రారంభించాలి. మీరు సున్నితమైన, కానీ ముఖ్యమైన ROBLOX అనుభవ నాణ్యత పెరుగుదలను ఆస్వాదిస్తూ, మరింత సున్నితమైన బిల్డ్, సేవ్ మరియు పబ్లిష్ ప్రక్రియలోకి సహజంగా మారతారని మా ఆశ.


