Avastage JavaScript'i murranguline Resizable ArrayBuffer, mis vĂ”imaldab dĂŒnaamilist mĂ€luhaldust suure jĂ”udlusega veebirakendustes, alates WebAssembly'st kuni andmetöötluseni.
JavaScript'i dĂŒnaamilise mĂ€lu areng: tutvustame Resizable ArrayBuffer'it
Veebiarenduse kiiresti areneval maastikul on JavaScript muutunud lihtsast skriptimiskeelest jĂ”ujaamaks, mis suudab kĂ€itada keerukaid rakendusi, interaktiivseid mĂ€nge ja nĂ”udlikke andmete visualiseerimisi otse brauseris. See mĂ€rkimisvÀÀrne teekond on nĂ”udnud pidevaid edusamme selle alusvĂ”imekuses, eriti mĂ€luhalduse osas. Aastaid oli JavaScript'i madala taseme mĂ€lukĂ€sitluse oluline piirang vĂ”imetus dĂŒnaamiliselt ja tĂ”husalt muuta toorete binaarandmete puhvrite suurust. See piirang pĂ”hjustas sageli jĂ”udluse kitsaskohti, suurenenud mĂ€lukulu ja keerulist rakendusloogikat muutuva suurusega andmeid hĂ”lmavate ĂŒlesannete puhul. Kuid ResizableArrayBuffer
'i kasutuselevĂ”tuga on JavaScript teinud tohutu hĂŒppe edasi, alustades uut tĂ”elise dĂŒnaamilise mĂ€luhalduse ajastut.
See pĂ”hjalik juhend sĂŒveneb ResizableArrayBuffer
'i peensustesse, uurides selle pĂ€ritolu, pĂ”hifunktsioone, praktilisi rakendusi ja sĂŒgavat mĂ”ju, mida see avaldab suure jĂ”udlusega ja mĂ€lusÀÀstlike veebirakenduste arendamisele globaalsele publikule. VĂ”rdleme seda selle eelkĂ€ijatega, toome praktilisi rakendusnĂ€iteid ja arutame parimaid tavasid selle vĂ”imsa uue funktsiooni tĂ”husaks kasutamiseks.
Alus: ArrayBuffer'i mÔistmine
Enne kui uurime ResizableArrayBuffer
'i dĂŒnaamilisi vĂ”imeid, on ĂŒlioluline mĂ”ista selle eelkĂ€ijat, standardset ArrayBuffer
'it. ECMAScript 2015 (ES6) osana kasutusele vÔetud ArrayBuffer
oli revolutsiooniline lisandus, pakkudes viisi ĂŒldise, fikseeritud pikkusega toore binaarandmete puhvri esitamiseks. Erinevalt traditsioonilistest JavaScript'i massiividest, mis salvestavad elemente JavaScript'i objektidena (numbrid, stringid, tĂ”evÀÀrtused jne), salvestab ArrayBuffer
tooreid baite otse, sarnaselt mÀlublokkidele keeltes nagu C vÔi C++.
Mis on ArrayBuffer?
ArrayBuffer
on objekt, mida kasutatakse fikseeritud pikkusega toore binaarandmete puhvri esitamiseks.- See on mÀlublokk ja selle sisu ei saa JavaScript'i koodiga otse manipuleerida.
- Selle asemel kasutate andmete lugemiseks ja kirjutamiseks
ArrayBuffer
'isse ja sealt vÀljaTypedArrays
(ntUint8Array
,Int32Array
,Float64Array
) vÔiDataView
'd kui "vaateid". Need vaated tÔlgendavad tooreid baite kindlal viisil (nt 8-bitiste mÀrgita tÀisarvudena, 32-bitiste mÀrgiga tÀisarvudena vÔi 64-bitiste ujukomaarvudena).
NĂ€iteks fikseeritud suurusega puhvri loomiseks:
const buffer = new ArrayBuffer(16); // Loob 16-baidise puhvri
const view = new Uint8Array(buffer); // Loob vaate 8-bitiste mÀrgita tÀisarvude jaoks
view[0] = 255; // Kirjutab esimesse baiti
console.log(view[0]); // VĂ€ljastab 255
Fikseeritud suuruse vÀljakutse
Kuigi ArrayBuffer
parandas oluliselt JavaScript'i vÔimekust binaarandmete manipuleerimisel, kaasnes sellega kriitiline piirang: selle suurus on loomisel fikseeritud. Kui ArrayBuffer
on instantseeritud, ei saa selle byteLength
omadust muuta. Kui teie rakendus vajas suuremat puhvrit, oli ainus lahendus:
- Luua uus, suurem
ArrayBuffer
. - Kopeerida vana puhvri sisu uude puhvrisse.
- HĂŒljata vana puhver, lootes prĂŒgikoristusele.
Kujutage ette stsenaariumi, kus töötlete ettearvamatu suurusega andmevoogu vĂ”i nĂ€iteks mĂ€ngumootorit, mis laadib dĂŒnaamiliselt varasid. Kui eraldate esialgu 1 MB suuruse ArrayBuffer
'i, kuid peate Ă€kki salvestama 2 MB andmeid, peaksite sooritama kuluka operatsiooni, eraldades uue 2 MB puhvri ja kopeerides olemasoleva 1 MB. See protsess, mida tuntakse kui ĂŒmberjaotamist ja kopeerimist, on ebaefektiivne, tarbib mĂ€rkimisvÀÀrselt protsessori tsĂŒkleid ja koormab prĂŒgikogujat, mis vĂ”ib pĂ”hjustada jĂ”udluse langust ja mĂ€lu killustumist, eriti piiratud ressurssidega keskkondades vĂ”i suuremahuliste operatsioonide puhul.
MĂ€ngumuutja tutvustus: ResizableArrayBuffer
Fikseeritud suurusega ArrayBuffer
'ite tekitatud vÀljakutsed olid eriti teravad tÀiustatud veebirakenduste puhul, eriti nende puhul, mis kasutavad WebAssembly't (Wasm) ja nÔuavad suure jÔudlusega andmetöötlust. NÀiteks WebAssembly nÔuab sageli pidevat lineaarse mÀlu plokki, mis vÔib kasvada vastavalt rakenduse mÀlunÔuete laienemisele. Standardse ArrayBuffer
'i vĂ”imetus seda dĂŒnaamilist kasvu toetada piiras loomulikult keerukate Wasm-rakenduste ulatust ja tĂ”husust brauserikeskkonnas.
Nende kriitiliste vajaduste lahendamiseks tutvustas TC39 komitee (ECMAScripti arendav tehniline komitee) ResizableArrayBuffer
'it. See uus puhvritĂŒĂŒp vĂ”imaldab kĂ€itusajal suuruse muutmist, pakkudes tĂ”eliselt dĂŒnaamilist mĂ€lulahendust, mis sarnaneb teistes programmeerimiskeeltes leiduvate dĂŒnaamiliste massiivide vĂ”i vektoritega.
Mis on ResizableArrayBuffer?
ResizableArrayBuffer
on ArrayBuffer
, mille suurust saab pÀrast selle loomist muuta. See pakub kahte uut olulist omadust/meetodit, mis eristavad seda standardsest ArrayBuffer
'ist:
maxByteLength
:ResizableArrayBuffer
'i luues saate valikuliselt mÀÀrata maksimaalse baidipikkuse. See toimib ĂŒlempiirina, takistades puhvri lĂ”putut kasvamist vĂ”i sĂŒsteemi vĂ”i rakenduse mÀÀratud piiri ĂŒletamist. KuimaxByteLength
'i ei ole antud, kasutatakse platvormist sÔltuvat maksimumvÀÀrtust, mis on tavaliselt vÀga suur vÀÀrtus (nt 2 GB vÔi 4 GB).resize(newLength)
: See meetod vÔimaldab teil muuta puhvri praegusebyteLength
'i vÀÀrtuseksnewLength
.newLength
peab olema vÀiksem vÔi vÔrdnemaxByteLength
'iga. KuinewLength
on vÀiksem kui praegunebyteLength
, kÀrbitakse puhvrit. KuinewLength
on suurem, proovib puhver kasvada.
Siin on, kuidas luua ja muuta ResizableArrayBuffer
'i suurust:
// Loob ResizableArrayBuffer'i algsuurusega 16 baiti ja maksimaalse suurusega 64 baiti
const rBuffer = new ResizableArrayBuffer(16, { maxByteLength: 64 });
console.log(`Initial byteLength: ${rBuffer.byteLength}`); // VĂ€ljastab: Initial byteLength: 16
// Loob puhvri peale Uint8Array vaate
const rView = new Uint8Array(rBuffer);
rView[0] = 10; // Kirjutab mÔned andmed
console.log(`Value at index 0: ${rView[0]}`); // VĂ€ljastab: Value at index 0: 10
// Muudab puhvri suuruseks 32 baiti
rBuffer.resize(32);
console.log(`New byteLength after resize: ${rBuffer.byteLength}`); // VĂ€ljastab: New byteLength after resize: 32
// Oluline punkt: TypedArray vaated muutuvad "lahtiĂŒhendatuks" vĂ”i "aegunuks" pĂ€rast suuruse muutmise operatsiooni.
// rView[0] poole pöördumine pÀrast suuruse muutmist vÔib endiselt toimida, kui aluseks olev mÀlu pole nihkunud, kuid see pole garanteeritud.
// Parim tava on vaated pĂ€rast suuruse muutmist uuesti luua vĂ”i ĂŒle kontrollida.
const newRView = new Uint8Array(rBuffer); // Loob vaate uuesti
console.log(`Value at index 0 via new view: ${newRView[0]}`); // Peaks endiselt olema 10, kui andmed on sÀilinud
// Katse muuta suurust ĂŒle maxByteLength'i (viskab RangeError'i)
try {
rBuffer.resize(128);
} catch (e) {
console.error(`Error resizing: ${e.message}`); // VĂ€ljastab: Error resizing: Invalid buffer length
}
// Muudab suurust vÀiksemaks (kÀrpimine)
rBuffer.resize(8);
console.log(`byteLength after truncation: ${rBuffer.byteLength}`); // VĂ€ljastab: byteLength after truncation: 8
Kuidas ResizableArrayBuffer sisemiselt töötab
Kui kutsute ResizableArrayBuffer
'il vÀlja meetodi resize()
, proovib JavaScript'i mootor muuta eraldatud mĂ€lublokki. Kui uus suurus on vĂ€iksem, kĂ€rbitakse puhvrit ja liigne mĂ€lu vĂ”idakse vabastada. Kui uus suurus on suurem, proovib mootor olemasolevat mĂ€lublokki laiendada. Paljudel juhtudel, kui vahetult praeguse puhvri jĂ€rel on saadaval pidev ruum, saab operatsioonisĂŒsteem lihtsalt eraldust laiendada ilma andmeid liigutamata. Kui aga pidevat ruumi pole saadaval, vĂ”ib mootoril olla vaja eraldada tĂ€iesti uus, suurem mĂ€lublokk ja kopeerida olemasolevad andmed vanast asukohast uude, sarnaselt sellele, mida teeksite kĂ€sitsi fikseeritud ArrayBuffer
'iga. Peamine erinevus seisneb selles, et seda ĂŒmberjaotamist ja kopeerimist haldab mootor sisemiselt, abstraheerides arendaja jaoks keerukuse ja olles sageli optimeeritud tĂ”husamalt kui manuaalsed JavaScript'i tsĂŒklid.
ResizableArrayBuffer
'iga töötamisel on oluline kaalutlus see, kuidas see mÔjutab TypedArray
vaateid. Kui ResizableArrayBuffer
'i suurust muudetakse:
- Puhvrit ĂŒmbritsevad olemasolevad
TypedArray
vaated vĂ”ivad muutuda "lahtiĂŒhendatuks" vĂ”i nende sisemised viidad vĂ”ivad muutuda kehtetuks. See tĂ€hendab, et nad ei pruugi enam korrektselt peegeldada aluseks oleva puhvri andmeid vĂ”i suurust. - Vaadete puhul, kus
byteOffset
on 0 jabyteLength
on puhvri tĂ€ispikkus, muutuvad need tavaliselt lahtiĂŒhendatuks. - Vaadete puhul, millel on spetsiifiline
byteOffset
jabyteLength
, mis on endiselt kehtivad uues, muudetud suurusega puhvris, vĂ”ivad need jÀÀda ĂŒhendatuks, kuid nende kĂ€itumine vĂ”ib olla keeruline ja sĂ”ltuda implementatsioonist.
KÔige ohutum ja soovitatavam praktika on alati pÀrast resize()
operatsiooni TypedArray
vaated uuesti luua, et tagada nende korrektne vastavus ResizableArrayBuffer
'i hetkeseisundile. See garanteerib, et teie vaated peegeldavad tÀpselt uut suurust ja andmeid, vÀltides peeneid vigu ja ootamatut kÀitumist.
Binaarandmete struktuuride perekond: vĂ”rdlev analĂŒĂŒs
Et tÀielikult hinnata ResizableArrayBuffer
'i tĂ€htsust, on kasulik paigutada see JavaScript'i binaarandmete struktuuride laiemasse konteksti, sealhulgas nendesse, mis on mĂ”eldud samaaegsuseks. Iga tĂŒĂŒbi nĂŒansside mĂ”istmine vĂ”imaldab arendajatel valida oma konkreetsete mĂ€luhaldusvajaduste jaoks kĂ”ige sobivama tööriista.
ArrayBuffer
: Fikseeritud, jagamatu alus- Suuruse muudetavus: Ei. Fikseeritud suurus loomisel.
- Jagatavus: Ei. Ei saa otse veebitööliste (Web Workers) vahel jagada; tuleb ĂŒle kanda (kopeerida) kasutades
postMessage()
. - Peamine kasutusjuht: Lokaalne, fikseeritud suurusega binaarandmete salvestamine, mida kasutatakse sageli failide parsimiseks, pildiandmete jaoks vĂ”i muudeks operatsioonideks, kus andmete suurus on teada ja pĂŒsiv.
- MĂ”ju jĂ”udlusele: NĂ”uab kĂ€sitsi ĂŒmberjaotamist ja kopeerimist dĂŒnaamiliste suurusemuutuste jaoks, mis toob kaasa jĂ”udluse lisakulu.
ResizableArrayBuffer
: DĂŒnaamiline, jagamatu puhver- Suuruse muudetavus: Jah. Suurust saab muuta selle
maxByteLength
piires. - Jagatavus: Ei. Sarnaselt
ArrayBuffer
'iga ei saa seda otse veebitööliste vahel jagada; tuleb ĂŒle kanda. - Peamine kasutusjuht: Lokaalne, dĂŒnaamilise suurusega binaarandmete salvestamine, kus andmete suurus on ettearvamatu, kuid seda ei pea samaaegselt tööliste vahel kasutama. Ideaalne kasvava WebAssembly mĂ€lu, voogedastatavate andmete vĂ”i suurte ajutiste puhvrite jaoks ĂŒhes lĂ”imes.
- MĂ”ju jĂ”udlusele: KĂ”rvaldab kĂ€sitsi ĂŒmberjaotamise ja kopeerimise, parandades dĂŒnaamilise suurusega andmete tĂ”husust. Mootor tegeleb aluseks olevate mĂ€luoperatsioonidega, mis on sageli kĂ”rgelt optimeeritud.
- Suuruse muudetavus: Jah. Suurust saab muuta selle
SharedArrayBuffer
: Fikseeritud, jagatud puhver samaaegsuseks- Suuruse muudetavus: Ei. Fikseeritud suurus loomisel.
- Jagatavus: Jah. Saab otse veebitööliste vahel jagada, vÔimaldades mitmel lÔimel samaaegselt samale mÀlupiirkonnale juurde pÀÀseda ja seda muuta.
- Peamine kasutusjuht: Samaaegsete andmestruktuuride ehitamine, mitmelĂ”imeliste algoritmide rakendamine ja suure jĂ”udlusega paralleelarvutuste vĂ”imaldamine veebitöölistes. NĂ”uab hoolikat sĂŒnkroniseerimist (nt kasutades
Atomics
). - MĂ”ju jĂ”udlusele: VĂ”imaldab tĂ”elist jagatud mĂ€luga samaaegsust, vĂ€hendades andmeedastuse kulu tööliste vahel. Siiski toob see kaasa keerukust, mis on seotud vĂ”idujooksu tingimuste ja sĂŒnkroniseerimisega. Turvaaukude (Spectre/Meltdown) tĂ”ttu nĂ”uab selle kasutamine
cross-origin isolated
keskkonda.
SharedResizableArrayBuffer
: DĂŒnaamiline, jagatud puhver samaaegseks kasvuks- Suuruse muudetavus: Jah. Suurust saab muuta selle
maxByteLength
piires. - Jagatavus: Jah. Saab otse veebitööliste vahel jagada ja samaaegselt suurust muuta.
- Peamine kasutusjuht: KĂ”ige vĂ”imsam ja paindlikum variant, mis ĂŒhendab dĂŒnaamilise suuruse muutmise mitmelĂ”imelise juurdepÀÀsuga. Ideaalne WebAssembly mĂ€lu jaoks, mis peab kasvama, olles samal ajal mitme lĂ”ime poolt kasutatav, vĂ”i dĂŒnaamiliste jagatud andmestruktuuride jaoks samaaegsetes rakendustes.
- MĂ”ju jĂ”udlusele: Pakub nii dĂŒnaamilise suuruse muutmise kui ka jagatud mĂ€lu eeliseid. Kuid samaaegne suuruse muutmine (
resize()
kutsumine mitmest lÔimest) nÔuab hoolikat koordineerimist ja aatomioperatsioone, et vÀltida vÔidujooksu tingimusi vÔi ebajÀrjekindlaid olekuid. NaguSharedArrayBuffer
, nÔuab see turvakaalutlustelcross-origin isolated
keskkonda.
- Suuruse muudetavus: Jah. Suurust saab muuta selle
SharedResizableArrayBuffer
'i kasutuselevĂ”tt esindab eriti JavaScript'i madala taseme mĂ€luvĂ”imekuse tippu, pakkudes enneolematut paindlikkust vĂ€ga nĂ”udlikele, mitmelĂ”imelistele veebirakendustele. Selle vĂ”imsusega kaasneb aga suurem vastutus korrektse sĂŒnkroniseerimise ja rangema turvamudeli eest.
Praktilised rakendused ja muutvad kasutusjuhud
ResizableArrayBuffer
'i (ja selle jagatud vaste) kÀttesaadavus avab veebiarendajatele uue vÔimaluste maailma, vÔimaldades rakendusi, mis olid varem brauseris ebapraktilised vÔi vÀga ebaefektiivsed. Siin on mÔned kÔige mÔjukamad kasutusjuhud:
WebAssembly (Wasm) mÀlu
Ăks olulisemaid ResizableArrayBuffer
'i kasusaajaid on WebAssembly. Wasm-moodulid töötavad sageli lineaarses mÀluruumis, mis on tavaliselt ArrayBuffer
. Paljud Wasm-rakendused, eriti need, mis on kompileeritud keeltest nagu C++ vĂ”i Rust, eraldavad mĂ€lu dĂŒnaamiliselt tĂ€itmise ajal. Enne ResizableArrayBuffer
'it pidi Wasm-mooduli mĂ€lu olema fikseeritud selle maksimaalse eeldatava suurusega, mis tĂ”i kaasa raisatud mĂ€lu vĂ€iksemate kasutusjuhtude puhul vĂ”i nĂ”udis keerulist kĂ€sitsi mĂ€luhaldust, kui rakendus tĂ”esti vajas kasvada ĂŒle oma esialgse eralduse.
- DĂŒnaamiline lineaarne mĂ€lu:
ResizableArrayBuffer
vastab ideaalselt Wasm'imemory.grow()
juhisele. Kui Wasm-moodul vajab rohkem mÀlu, saab see kutsuda vÀljamemory.grow()
, mis sisemiselt kutsub vÀljaresize()
meetodi oma aluseks olevalResizableArrayBuffer
'il, laiendades sujuvalt oma saadaolevat mÀlu. - NÀited:
- Brauserisisesed CAD/3D-modelleerimise tarkvarad: Kui kasutajad laadivad keerukaid mudeleid vÔi sooritavad ulatuslikke operatsioone, vÔib tippude andmete, tekstuuride ja stseenigraafikute jaoks vajalik mÀlu kasvada ettearvamatult.
ResizableArrayBuffer
vĂ”imaldab Wasm-mootoril mĂ€lu dĂŒnaamiliselt kohandada. - Teaduslikud simulatsioonid ja andmeanalĂŒĂŒs: Suuremahuliste simulatsioonide kĂ€itamine vĂ”i tohutute andmekogumite töötlemine, mis on kompileeritud Wasmi, saab nĂŒĂŒd dĂŒnaamiliselt eraldada mĂ€lu vahetulemuste vĂ”i kasvavate andmestruktuuride jaoks ilma liiga suurt puhvrit eelnevalt eraldamata.
- Wasm-pĂ”hised mĂ€ngumootorid: MĂ€ngud laadivad sageli varasid, haldavad dĂŒnaamilisi osakestesĂŒsteeme vĂ”i salvestavad mĂ€ngu olekut, mille suurus kĂ”igub. DĂŒnaamiline Wasm-mĂ€lu vĂ”imaldab ressursside tĂ”husamat kasutamist.
- Brauserisisesed CAD/3D-modelleerimise tarkvarad: Kui kasutajad laadivad keerukaid mudeleid vÔi sooritavad ulatuslikke operatsioone, vÔib tippude andmete, tekstuuride ja stseenigraafikute jaoks vajalik mÀlu kasvada ettearvamatult.
Suurte andmete töötlemine ja voogedastus
Paljud kaasaegsed veebirakendused tegelevad mĂ€rkimisvÀÀrse hulga andmetega, mida voogedastatakse vĂ”rgu kaudu vĂ”i genereeritakse kliendi poolel. MĂ”elge reaalajas analĂŒĂŒtikale, suurte failide ĂŒleslaadimisele vĂ”i keerukatele teaduslikele visualiseerimistele.
- TÔhus puhverdamine:
ResizableArrayBuffer
vĂ”ib toimida tĂ”husa puhvrina sissetulevate andmevoogude jaoks. Selle asemel, et korduvalt luua uusi, suuremaid puhvreid ja kopeerida andmeid, kui tĂŒkid saabuvad, saab puhvri suurust lihtsalt muuta, et mahutada uusi andmeid, vĂ€hendades protsessori tsĂŒkleid, mis kuluvad mĂ€luhaldusele ja kopeerimisele. - NĂ€ited:
- Reaalajas vĂ”rgupakettide parserid: Sissetulevate vĂ”rguprotokollide dekodeerimine, kus sĂ”numite suurused vĂ”ivad varieeruda, nĂ”uab puhvrit, mis suudab dĂŒnaamiliselt kohaneda praeguse paketi suurusega.
- Suurte failide redaktorid (nt brauserisisesed koodiredaktorid suurte failide jaoks): Kui kasutaja laadib vĂ”i muudab vĂ€ga suurt faili, vĂ”ib faili sisu toetav mĂ€lu kasvada vĂ”i kahaneda, nĂ”udes puhvri suuruse dĂŒnaamilisi kohandusi.
- Voogedastatava heli/video dekoodrid: Dekodeeritud heli- vÔi videokaadrite haldamine, kus puhvri suurus vÔib vajada muutmist vastavalt resolutsioonile, kaadrisagedusele vÔi kodeerimisvariatsioonidele, saab suuruse muudetavatest puhvritest palju kasu.
Pildi- ja videotöötlus
Rikkaliku meediaga töötamine hÔlmab sageli toorete pikseliandmete vÔi helinÀidiste manipuleerimist, mis vÔib olla mÀlu- ja suuruse poolest muutlik.
- DĂŒnaamilised kaadripuhvrid: Videotöötluse vĂ”i reaalajas pildimanipulatsiooni rakendustes vĂ”ivad kaadripuhvrid vajada dĂŒnaamilist suuruse muutmist vastavalt valitud vĂ€ljundresolutsioonile, erinevate filtrite rakendamisele vĂ”i erinevate videovoogude samaaegsele kĂ€sitlemisele.
- TÔhusad Canvas-operatsioonid: Kuigi canvas-elemendid haldavad oma pikslipuhvreid, saavad kohandatud pildifiltrid vÔi transformatsioonid, mis on rakendatud WebAssembly vÔi veebitööliste abil, kasutada
ResizableArrayBuffer
'it oma vahepealsete pikseliandmete jaoks, kohandudes pildi mÔÔtmetega ilma ĂŒmberjaotamiseta. - NĂ€ited:
- Brauserisisesed videoredaktorid: Videokaadrite puhverdamine töötlemiseks, kus kaadri suurus vĂ”ib muutuda resolutsiooni muutuste vĂ”i dĂŒnaamilise sisu tĂ”ttu.
- Reaalajas pildifiltrid: Kohandatud filtrite arendamine, mis kohandavad dĂŒnaamiliselt oma sisemist mĂ€lujalajĂ€lge vastavalt sisendpildi suurusele vĂ”i keerukatele filtriparameetritele.
MĂ€nguarendus
Kaasaegsed veebipĂ”hised mĂ€ngud, eriti 3D-mĂ€ngud, nĂ”uavad keerukat mĂ€luhaldust varade, stseenigraafikute, fĂŒĂŒsikasimulatsioonide ja osakestesĂŒsteemide jaoks.
- DĂŒnaamiline varade laadimine ja tasemete voogedastus: MĂ€ngud saavad dĂŒnaamiliselt laadida ja eemaldada varasid (tekstuurid, mudelid, heli), kui mĂ€ngija liigub tasemetel.
ResizableArrayBuffer
'it saab kasutada nende varade keskse mĂ€lubasseinina, mis laieneb ja kahaneb vastavalt vajadusele, vĂ€ltides sagedasi ja kulukaid mĂ€lu ĂŒmberjaotamisi. - OsakestesĂŒsteemid ja fĂŒĂŒsikamootorid: Osakeste vĂ”i fĂŒĂŒsikaobjektide arv stseenis vĂ”ib dramaatiliselt kĂ”ikuda. Nende andmete (asukoht, kiirus, jĂ”ud) jaoks suuruse muudetavate puhvrite kasutamine vĂ”imaldab mootoril mĂ€lu tĂ”husalt hallata ilma tippkasutuse jaoks eelnevalt eraldamata.
- NĂ€ited:
- Avatud maailmaga mĂ€ngud: MĂ€ngumaailmade ja nendega seotud andmete tĂŒkkide tĂ”hus laadimine ja eemaldamine mĂ€ngija liikumisel.
- SimulatsioonimĂ€ngud: Tuhandete agentide vĂ”i objektide dĂŒnaamilise oleku haldamine, mille andmete suurus vĂ”ib aja jooksul varieeruda.
VÔrgusuhtlus ja protsessidevaheline suhtlus (IPC)
WebSocketid, WebRTC ja suhtlus veebitööliste vahel hÔlmavad sageli erineva pikkusega binaarandmete sÔnumite saatmist ja vastuvÔtmist.
- Kohanduvad sÔnumipuhvrid: Rakendused saavad kasutada
ResizableArrayBuffer
'it sissetulevate vÔi vÀljaminevate sÔnumite puhvrite tÔhusaks haldamiseks. Puhver vÔib kasvada, et mahutada suuri sÔnumeid, ja kahaneda, kui töödeldakse vÀiksemaid, optimeerides mÀlukasutust. - NÀited:
- Reaalajas koostöörakendused: Dokumendi muudatuste vĂ”i joonistusmuudatuste sĂŒnkroniseerimine mitme kasutaja vahel, kus andmekoormused vĂ”ivad suuruse poolest oluliselt erineda.
- Peer-to-peer andmeedastus: WebRTC rakendustes suurte andmekanalite lÀbirÀÀkimine ja edastamine partnerite vahel.
Resizable ArrayBuffer'i rakendamine: koodinÀited ja parimad tavad
ResizableArrayBuffer
'i vĂ”imsuse tĂ”husaks rakendamiseks on oluline mĂ”ista selle praktilisi rakendamise ĂŒksikasju ja jĂ€rgida parimaid tavasid, eriti seoses `TypedArray` vaadete ja veakĂ€sitlusega.
PÔhiline instantseerimine ja suuruse muutmine
Nagu varem nÀha, on ResizableArrayBuffer
'i loomine lihtne:
// Loob ResizableArrayBuffer'i algsuurusega 0 baiti, kuid maksimumiga 1MB (1024 * 1024 baiti)
const dynamicBuffer = new ResizableArrayBuffer(0, { maxByteLength: 1024 * 1024 });
console.log(`Initial size: ${dynamicBuffer.byteLength} bytes`); // VĂ€ljund: Initial size: 0 bytes
// Eraldab ruumi 100 tĂ€isarvu jaoks (igaĂŒks 4 baiti)
dynamicBuffer.resize(100 * 4);
console.log(`Size after first resize: ${dynamicBuffer.byteLength} bytes`); // VĂ€ljund: Size after first resize: 400 bytes
// Loob vaate. TĂHTIS: Looge vaated alati *pĂ€rast* suuruse muutmist vĂ”i looge need uuesti.
let intView = new Int32Array(dynamicBuffer);
intView[0] = 42;
intView[99] = -123;
console.log(`Value at index 0: ${intView[0]}`);
// Muudab suurust suuremaks mahutavuseks 200 tÀisarvu jaoks
dynamicBuffer.resize(200 * 4); // Muudab suuruseks 800 baiti
console.log(`Size after second resize: ${dynamicBuffer.byteLength} bytes`); // VĂ€ljund: Size after second resize: 800 bytes
// Vana 'intView' on nĂŒĂŒd lahtiĂŒhendatud/kehtetu. Peame looma uue vaate.
intView = new Int32Array(dynamicBuffer);
console.log(`Value at index 0 via new view: ${intView[0]}`); // Peaks endiselt olema 42 (andmed sÀilinud)
console.log(`Value at index 99 via new view: ${intView[99]}`); // Peaks endiselt olema -123
console.log(`Value at index 100 via new view (newly allocated space): ${intView[100]}`); // Peaks olema 0 (vaikimisi uue ruumi jaoks)
Selle nÀite oluline jÀreldus on TypedArray
vaadete kÀsitlemine. Iga kord, kui ResizableArrayBuffer
'i suurust muudetakse, muutuvad kÔik olemasolevad sellele viitavad TypedArray
vaated kehtetuks. See on sellepÀrast, et aluseks olev mÀlublokk vÔib olla liikunud vÔi selle suuruse piir on muutunud. SeetÔttu on parim tava luua oma TypedArray
vaated uuesti pÀrast iga resize()
operatsiooni, et tagada nende tÀpne peegeldus puhvri hetkeseisundist.
VeakÀsitlus ja mahtuvuse haldamine
Katse muuta ResizableArrayBuffer
'i suurust ĂŒle selle maxByteLength
'i tulemuseks on RangeError
. Korrektne veakÀsitlus on robustsete rakenduste jaoks hÀdavajalik.
const limitedBuffer = new ResizableArrayBuffer(10, { maxByteLength: 20 });
try {
limitedBuffer.resize(25); // See ĂŒletab maxByteLength'i
console.log("Successfully resized to 25 bytes.");
} catch (error) {
if (error instanceof RangeError) {
console.error(`Error: Could not resize. New size (${25} bytes) exceeds maxByteLength (${limitedBuffer.maxByteLength} bytes).`);
} else {
console.error(`An unexpected error occurred: ${error.message}`);
}
}
console.log(`Current size: ${limitedBuffer.byteLength} bytes`); // Endiselt 10 baiti
Rakenduste puhul, kus lisate sageli andmeid ja peate puhvrit kasvatama, on soovitatav rakendada mahtuvuse kasvu strateegiat, mis sarnaneb dĂŒnaamilistele massiividele teistes keeltes. Levinud strateegia on eksponentsiaalne kasv (nt mahtuvuse kahekordistamine, kui ruum otsa saab), et minimeerida ĂŒmberjaotamiste arvu.
class DynamicByteBuffer {
constructor(initialCapacity = 64, maxCapacity = 1024 * 1024) {
this.buffer = new ResizableArrayBuffer(initialCapacity, { maxByteLength: maxCapacity });
this.offset = 0; // Praegune kirjutamiskoht
this.maxCapacity = maxCapacity;
}
// Tagab, et 'bytesToWrite' jaoks on piisavalt ruumi
ensureCapacity(bytesToWrite) {
const requiredCapacity = this.offset + bytesToWrite;
if (requiredCapacity > this.buffer.byteLength) {
let newCapacity = this.buffer.byteLength * 2; // Eksponentsiaalne kasv
if (newCapacity < requiredCapacity) {
newCapacity = requiredCapacity; // Tagab vÀhemalt piisavalt praeguse kirjutamise jaoks
}
if (newCapacity > this.maxCapacity) {
newCapacity = this.maxCapacity; // Piirab maxCapacity'ga
}
if (newCapacity < requiredCapacity) {
throw new Error("Cannot allocate enough memory: Exceeded maximum capacity.");
}
console.log(`Resizing buffer from ${this.buffer.byteLength} to ${newCapacity} bytes.`);
this.buffer.resize(newCapacity);
}
}
// Lisab andmeid (nÀide Uint8Array jaoks)
append(dataUint8Array) {
this.ensureCapacity(dataUint8Array.byteLength);
const currentView = new Uint8Array(this.buffer); // Loob vaate uuesti
currentView.set(dataUint8Array, this.offset);
this.offset += dataUint8Array.byteLength;
}
// Saab praegused andmed vaatena (kuni kirjutatud nihkeni)
getData() {
return new Uint8Array(this.buffer, 0, this.offset);
}
}
const byteBuffer = new DynamicByteBuffer();
// Lisab mÔned andmed
byteBuffer.append(new Uint8Array([1, 2, 3, 4]));
console.log(`Current data length: ${byteBuffer.getData().byteLength}`); // 4
// Lisab veel andmeid, kÀivitades suuruse muutmise
byteBuffer.append(new Uint8Array(Array(70).fill(5))); // 70 baiti
console.log(`Current data length: ${byteBuffer.getData().byteLength}`); // 74
// Hangib ja kontrollib
const finalData = byteBuffer.getData();
console.log(finalData.slice(0, 10)); // [1, 2, 3, 4, 5, 5, 5, 5, 5, 5] (esimesed 10 baiti)
Samaaegsus SharedResizableArrayBuffer'i ja veebitöölistega
MitmelÔimeliste stsenaariumide puhul, kasutades veebitöölisi, muutub SharedResizableArrayBuffer
hindamatuks. See vĂ”imaldab mitmel töölisel (ja pealĂ”imel) samaaegselt juurde pÀÀseda ja potentsiaalselt muuta sama aluseks oleva mĂ€lubloki suurust. Selle vĂ”imsusega kaasneb aga kriitiline vajadus sĂŒnkroniseerimise jĂ€rele, et vĂ€ltida vĂ”idujooksu tingimusi.
NÀide (kontseptuaalne - nÔuab `cross-origin-isolated` keskkonda):
main.js:
// NÔuab cross-origin isolated keskkonda (nt spetsiifilised HTTP pÀised nagu Cross-Origin-Opener-Policy: same-origin, Cross-Origin-Embedder-Policy: require-corp)
const initialSize = 16;
const maxSize = 256;
const sharedRBuffer = new SharedResizableArrayBuffer(initialSize, { maxByteLength: maxSize });
console.log(`PealÔim - jagatud puhvri algsuurus: ${sharedRBuffer.byteLength}`);
// Loob jagatud Int32Array vaate (saab kasutada töölistes)
const sharedIntView = new Int32Array(sharedRBuffer);
// Initsialiseerib mÔned andmed
Atomics.store(sharedIntView, 0, 100); // Kirjutab ohutult vÀÀrtuse 100 indeksile 0
// Loob töölise ja edastab SharedResizableArrayBuffer'i
const worker = new Worker('worker.js');
worker.postMessage({ buffer: sharedRBuffer });
worker.onmessage = (event) => {
if (event.data === 'resized') {
console.log(`PealÔim - tööline muutis puhvri suurust. Uus suurus: ${sharedRBuffer.byteLength}`);
// PÀrast samaaegset suuruse muutmist vÔib olla vaja vaated uuesti luua
const newSharedIntView = new Int32Array(sharedRBuffer);
console.log(`PealÔim - vÀÀrtus indeksil 0 pÀrast töölise suuruse muutmist: ${Atomics.load(newSharedIntView, 0)}`);
}
};
// PealÔim saab ka suurust muuta
setTimeout(() => {
try {
console.log(`PealĂ”im ĂŒritab suurust muuta 32 baidile.`);
sharedRBuffer.resize(32);
console.log(`PealÔim muutis suurust. Praegune suurus: ${sharedRBuffer.byteLength}`);
} catch (e) {
console.error(`PealÔime suuruse muutmise viga: ${e.message}`);
}
}, 500);
worker.js:
self.onmessage = (event) => {
const sharedRBuffer = event.data.buffer; // Saab jagatud puhvri
console.log(`Tööline - sai jagatud puhvri. Praegune suurus: ${sharedRBuffer.byteLength}`);
// Loob vaate jagatud puhvrile
let workerIntView = new Int32Array(sharedRBuffer);
// Loeb ja muudab andmeid ohutult, kasutades Atomics'it
const value = Atomics.load(workerIntView, 0);
console.log(`Tööline - vÀÀrtus indeksil 0: ${value}`); // Peaks olema 100
Atomics.add(workerIntView, 0, 50); // Suurendab 50 vĂ”rra (nĂŒĂŒd 150)
// Tööline proovib puhvri suurust muuta
try {
const newSize = 64; // NĂ€itlik uus suurus
console.log(`Tööline ĂŒritab suurust muuta ${newSize} baidile.`);
sharedRBuffer.resize(newSize);
console.log(`Tööline muutis suurust. Praegune suurus: ${sharedRBuffer.byteLength}`);
self.postMessage('resized');
} catch (e) {
console.error(`Töölise suuruse muutmise viga: ${e.message}`);
}
// Loob vaate uuesti pÀrast suuruse muutmist (oluline ka jagatud puhvrite puhul)
workerIntView = new Int32Array(sharedRBuffer);
console.log(`Tööline - vÀÀrtus indeksil 0 pÀrast oma suuruse muutmist: ${Atomics.load(workerIntView, 0)}`); // Peaks olema 150
};
SharedResizableArrayBuffer
'i kasutamisel vÔivad samaaegsed suuruse muutmise operatsioonid erinevatest lÔimedest olla keerulised. Kuigi `resize()` meetod ise on oma operatsiooni lÔpuleviimise osas aatomiline, vajab puhvri ja sellest tuletatud TypedArray vaadete olek hoolikat haldamist. Jagatud mÀlu lugemis-/kirjutamisoperatsioonide jaoks kasutage alati Atomics
'it lÔimeohutuks juurdepÀÀsuks, et vÀltida andmete rikkumist vÔidujooksu tingimuste tÔttu. Lisaks on oluline tagada, et teie rakenduskeskkond oleks korralikult cross-origin isolated
, mis on eelduseks mis tahes SharedArrayBuffer
'i variandi kasutamiseks turvakaalutlustel (Spectre ja Meltdown rĂŒnnakute leevendamiseks).
JÔudluse ja mÀlu optimeerimise kaalutlused
ResizableArrayBuffer
'i peamine motivatsioon on parandada dĂŒnaamiliste binaarandmete jĂ”udlust ja mĂ€lutĂ”husust. Kuid selle mĂ”jude mĂ”istmine on nende eeliste maksimeerimiseks vĂ”tmetĂ€htsusega.
Eelised: vÀhem mÀlukopeerimisi ja GC koormust
- KĂ”rvaldab kulukad ĂŒmberjaotamised: KĂ”ige olulisem eelis on vĂ€ltida vajadust kĂ€sitsi luua uusi, suuremaid puhvreid ja kopeerida olemasolevaid andmeid iga kord, kui suurus muutub. JavaScript'i mootor saab sageli laiendada olemasolevat mĂ€lublokki kohapeal vĂ”i sooritada kopeerimise tĂ”husamalt madalamal tasemel.
- VĂ€hendatud prĂŒgikoguja koormus: Luuakse ja hĂŒljatakse vĂ€hem ajutisi
ArrayBuffer
'i instantse, mis tĂ€hendab, et prĂŒgikogujal on vĂ€hem tööd. See toob kaasa sujuvama jĂ”udluse, vĂ€hem pause ja prognoositavama rakenduse kĂ€itumise, eriti pikaajaliste protsesside vĂ”i kĂ”rgsageduslike andmeoperatsioonide puhul. - Parem vahemĂ€lu lokaalsus: SĂ€ilitades ĂŒhte, pidevat mĂ€lublokki, mis kasvab, on andmed tĂ”enĂ€olisemalt protsessori vahemĂ€lus, mis toob kaasa kiiremad juurdepÀÀsuajad operatsioonidele, mis itereerivad ĂŒle puhvri.
Potentsiaalsed lisakulud ja kompromissid
- Esialgne eraldamine
maxByteLength
jaoks (potentsiaalselt): Kuigi spetsifikatsioon seda rangelt ei nÔua, vÔivad mÔned implementatsioonid eelnevalt eraldada vÔi reserveerida mÀlu kunimaxByteLength
'ini. Isegi kui seda fĂŒĂŒsiliselt ette ei eraldata, reserveerivad operatsioonisĂŒsteemid sageli virtuaalse mĂ€lu vahemikke. See tĂ€hendab, et tarbetult suuremaxByteLength
'i seadmine vĂ”ib tarbida rohkem virtuaalset aadressiruumi vĂ”i siduda rohkem fĂŒĂŒsilist mĂ€lu kui antud hetkel rangelt vajalik, mis vĂ”ib halvasti hallatuna mĂ”jutada sĂŒsteemi ressursse. resize()
operatsiooni maksumus: Kuigi tÔhusam kui kÀsitsi kopeerimine, ei oleresize()
tasuta. Kui ĂŒmberjaotamine ja kopeerimine on vajalik (kuna pidevat ruumi pole saadaval), kaasneb sellega siiski jĂ”udluskulu, mis on proportsionaalne praeguse andmemahuga. Sagedased, vĂ€ikesed suurusemuutused vĂ”ivad koguda lisakulu.- Vaadete haldamise keerukus: Vajadus luua
TypedArray
vaated uuesti pÀrast igaresize()
operatsiooni lisab rakenduse loogikale keerukuse kihi. Arendajad peavad olema hoolikad, tagades, et nende vaated on alati ajakohased.
Millal valida ResizableArrayBuffer
ResizableArrayBuffer
ei ole imerohi kÔigi binaarandmete vajaduste jaoks. Kaaluge selle kasutamist, kui:
- Andmete suurus on tĂ”eliselt ettearvamatu vĂ”i vĂ€ga muutlik: Kui teie andmed dĂŒnaamiliselt kasvavad ja kahanevad ning nende maksimaalse suuruse ennustamine on keeruline vĂ”i toob kaasa liigse ĂŒle-eraldamise fikseeritud puhvritega.
- JÔudluskriitilised operatsioonid saavad kasu kohapealsest kasvust: Kui mÀlukopeerimiste vÀltimine ja GC koormuse vÀhendamine on peamine mure suure lÀbilaskevÔimega vÔi madala latentsusega operatsioonide puhul.
- Töötamine WebAssembly lineaarse mĂ€luga: See on kanooniline kasutusjuht, kus Wasm-moodulid peavad oma mĂ€lu dĂŒnaamiliselt laiendama.
- Kohandatud dĂŒnaamiliste andmestruktuuride ehitamine: Kui rakendate oma dĂŒnaamilisi massiive, jĂ€rjekordi vĂ”i muid andmestruktuure otse toore mĂ€lu peal JavaScriptis.
VĂ€ikeste, fikseeritud suurusega andmete jaoks vĂ”i kui andmed edastatakse ĂŒks kord ja eeldatavasti ei muutu, vĂ”ib standardne ArrayBuffer
olla endiselt lihtsam ja piisav. Samaaegsete, kuid fikseeritud suurusega andmete jaoks jÀÀb valikuks SharedArrayBuffer
. ResizableArrayBuffer
'i perekond tĂ€idab olulise lĂŒnga dĂŒnaamilise ja tĂ”husa binaarmĂ€lu haldamisel.
TÀpsemad kontseptsioonid ja tulevikuvÀljavaated
SĂŒgavam integratsioon WebAssembly'ga
ResizableArrayBuffer
'i ja WebAssembly vaheline sĂŒnergia on sĂŒgav. Wasmi mĂ€lumudel on oma olemuselt lineaarne aadressiruum ja ResizableArrayBuffer
pakub selleks ideaalset aluseks olevat andmestruktuuri. Wasm-instantseeritud mÀlu on eksponeeritud kui ArrayBuffer
(vÔi ResizableArrayBuffer
). Wasmi memory.grow()
kÀsk vastab otse ArrayBuffer.prototype.resize()
meetodile, kui Wasmi mÀlu toetab ResizableArrayBuffer
. See tihe integratsioon tĂ€hendab, et Wasm-rakendused saavad oma mĂ€lujalajĂ€lge tĂ”husalt hallata, kasvades ainult vajadusel, mis on ĂŒlioluline veebi porditud keeruka tarkvara jaoks.
Wasm-moodulite jaoks, mis on loodud töötama mitmelÔimelises keskkonnas (kasutades Wasm-lÔimi), oleks toetavaks mÀluks SharedResizableArrayBuffer
, mis vÔimaldab samaaegset kasvu ja juurdepÀÀsu. See vÔimekus on keskse tÀhtsusega suure jÔudlusega, mitmelÔimeliste C++/Rust rakenduste toomisel veebiplatvormile minimaalse mÀlukuluga.
MĂ€lubasseinid ja kohandatud allokaatorid
ResizableArrayBuffer
vĂ”ib olla fundamentaalne ehitusplokk keerukamate mĂ€luhaldusstrateegiate rakendamiseks otse JavaScriptis. Arendajad saavad luua kohandatud mĂ€lubasseine vĂ”i lihtsaid allokaatoreid ĂŒhe suure ResizableArrayBuffer
'i peale. Selle asemel, et paljude vĂ€ikeste eralduste jaoks toetuda ainult JavaScript'i prĂŒgikogujale, saab rakendus hallata oma mĂ€lupiirkondi selle puhvri sees. See lĂ€henemine vĂ”ib olla eriti kasulik:
- Objektibasseinid: JavaScript'i objektide vÔi andmestruktuuride taaskasutamine, hallates nende mÀlu kÀsitsi puhvri sees, selle asemel et pidevalt eraldada ja vabastada.
- Areeniallikaatorid: MĂ€lu eraldamine sarnase elueaga objektide rĂŒhmale ja seejĂ€rel kogu rĂŒhma korraga vabastamine, lihtsalt lĂ€htestades nihke puhvri sees.
Sellised kohandatud allokaatorid, kuigi lisavad keerukust, vĂ”ivad pakkuda prognoositavamat jĂ”udlust ja peeneteralisemat kontrolli mĂ€lukasutuse ĂŒle vĂ€ga nĂ”udlike rakenduste jaoks, eriti kui neid kombineerida WebAssembly'ga raskete ĂŒlesannete jaoks.
Laiem veebiplatvormi maastik
ResizableArrayBuffer
'i kasutuselevĂ”tt ei ole eraldiseisev funktsioon; see on osa laiemast suundumusest veebiplatvormi vĂ”imestamisel madalama taseme ja suure jĂ”udlusega vĂ”imalustega. API-d nagu WebGPU, Web Neural Network API ja Web Audio API tegelevad kĂ”ik ulatuslikult suurte binaarandmete mahtudega. VĂ”ime neid andmeid dĂŒnaamiliselt ja tĂ”husalt hallata on nende jĂ”udluse ja kasutatavuse jaoks kriitilise tĂ€htsusega. Kuna need API-d arenevad ja keerukamad rakendused migreeruvad veebi, mĂ€ngivad ResizableArrayBuffer
'i pakutavad alusparandused ĂŒha olulisemat rolli brauseris vĂ”imaliku piiride nihutamisel, globaalselt.
KokkuvÔte: jÀrgmise pÔlvkonna veebirakenduste vÔimestamine
JavaScript'i mÀluhaldusvÔimekuse teekond, alates lihtsatest objektidest kuni fikseeritud ArrayBuffer
'iteni ja nĂŒĂŒd dĂŒnaamilise ResizableArrayBuffer
'ini, peegeldab veebiplatvormi kasvavat ambitsiooni ja vÔimsust. ResizableArrayBuffer
lahendab pikaajalise piirangu, pakkudes arendajatele robustset ja tĂ”husat mehhanismi muutuva suurusega binaarandmete kĂ€sitlemiseks, ilma et kaasneksid sagedaste ĂŒmberjaotamiste ja andmete kopeerimise karistused. Selle sĂŒgav mĂ”ju WebAssembly'le, suurte andmete töötlemisele, reaalajas meedia manipuleerimisele ja mĂ€nguarendusele positsioneerib selle nurgakivina jĂ€rgmise pĂ”lvkonna suure jĂ”udlusega, mĂ€lusÀÀstlike veebirakenduste ehitamisel, mis on kĂ€ttesaadavad kasutajatele kogu maailmas.
Kuna veebirakendused jÀtkavad keerukuse ja jÔudluse piiride nihutamist, on selliste funktsioonide nagu ResizableArrayBuffer
mÔistmine ja tÔhus kasutamine esmatÀhtis. Neid edusamme omaks vÔttes saavad arendajad luua reageerivamaid, vÔimsamaid ja ressursisÔbralikumaid kogemusi, vabastades tÔeliselt veebi kui globaalse rakendusplatvormi tÀieliku potentsiaali.
Uurige ametlikke MDN Web Docs'e ResizableArrayBuffer
'i ja SharedResizableArrayBuffer
'i kohta, et sĂŒveneda nende spetsifikatsioonidesse ja brauserite ĂŒhilduvusse. Katsetage neid vĂ”imsaid tööriistu oma jĂ€rgmises projektis ja tunnistage dĂŒnaamilise mĂ€luhalduse muutvat mĂ”ju JavaScriptis.