Web Worker -kuvankäsittelyn perusteet
Web Worker antaa selaimen käsitellä kuvaa erillisessä säikeessä, jotta käyttöliittymä ei jäädy. Easy Background Remover hyödyntää tällaista paikallista käsittelyä.
Sinun ei tarvitse säätää workereita itse — ne ovat osa teknistä toteutusta.
Pääsäikeessä on käyttöliittymätyö
Selainsivu käyttää tavallisesti JavaScriptiä pääsäikeessä. Tämä lanka koordinoi myös asettelua, maalausta ja syöttöä. Jos yksi pitkä laskutoimitus kestää sen, napsautukset voivat tuntua viivästyneiltä, animaatio voi pysähtyä ja selain voi varoittaa, että sivu ei vastaa.
Kuvanmuokkausohjelmalla on paljon pääsäievastuita ennen kuin päättely edes alkaa:
- vastaanottaa tiedostovalinta, liitä tai pudota;
- purkaa ja näyttää kuva;
- Päivitä edistyminen ja virhetilat;
- piirrä esikatselukangas;
- kahva Lisää ja poista harjan liike;
- valmistele lataus- tai leikepöydälle toimintoja.
Segmentointimallin numeerisen työn sijoittaminen samalle säikeelle saisi nämä tehtävät kilpailemaan suoraan. Työntekijä luo selkeämmän rajan.
Viestipohjainen raja
Toimittaja ja työntekijä eivät jaa tavallisia muuttujia. He kommunikoivat lähettämällä viestejä. Yksinkertaistettu kulku näyttää tältä:
- Editori luo työntekijän tai käyttää sitä uudelleen.
- Se pyytää työntekijää alustamaan päättelyn suoritusajan ja mallin.
- Se valmistelee kuvatiedot ja lähettää päättelypyynnön.
- Työntekijä muuntaa tiedot mallin odotetuksi syötteeksi.
- Työntekijä suorittaa mallin ja tuottaa maskiarvot.
- Se lähettää maskin tai tulostiedot takaisin.
- Editori kokoaa esikatselun ja mahdollistaa tarkentamisen tai viennin.
Viestien tulee sisältää tarpeeksi kontekstia, jotta se vastaa oikeaan pyyntöön. Tällä on merkitystä, jos käyttäjä valitsee toisen kuvan ennen edellisen työn päättymistä. Käyttöliittymän tulee välttää vanhan tuloksen näyttämistä uuden lähteen päällä.
Kuvatietojen kopioiminen ja siirtäminen
Pienen tekstiviestin lähettäminen on halpaa. Miljoonien pikseliarvojen lähettäminen voi olla kallista, jos selaimen on kopioitava koko puskuri. Verkkosovellusliittymät voivat sen sijaan siirtää tiettyjen binääripuskurien omistajuuden. Siirretty puskuri tulee vastaanottajan saataville ilman, että lähettäjäpuolella säilytetään käyttökelpoista kopiota.
Tähän optimointiin liittyy suunnittelurajoitus: siirron jälkeen lähettäjä ei voi jatkaa saman puskurin käyttöä ikään kuin se edelleen omistaisi tiedot. Editori voi säilyttää erillisen näyttöesityksen, luoda oman päättelypuskurin tai rekonstruoida tarvitsemansa myöhemmin.
Jokainen toteutus ei käytä siirtoa täsmälleen samoissa paikoissa. Yleinen opetus on, että säikeiden erottaminen ei katoa tietojen liikkumista. Kuvan mitat, puskurin koko ja tulosten määrä vaikuttavat edelleen viiveeseen ja muistiin.
Mitä Easy Background Remover laittaa työntekijään
Easy Background Remover käyttää Web Workeria selaimen päättelyn suoritusajan kanssa laitteen segmentointiin. Raskas automaattinen katkaisuvaihe tuottaa maskin. Editori näyttää sitten yhdistetyn tuloksen ja tukee suorittimen kanvassiveltimen tarkennusta.
Tämä erottelu antaa häiriöille hyödyllisemmän rajan. Jos työntekijä ei voi alustaa tai kaatuu päättelyn aikana, käyttöliittymä voi ilmoittaa työntekijään liittyvästä virheestä sen sijaan, että luottaisi pysyvästi jumiutuneeseen välilehteen ainoana signaalina.
Se pitää myös paikallisen käsittelyn vaatimuksen ymmärrettävänä. Pikselien lähettäminen laajennussivulta omalle työntekijälleen on viestintää selainympäristössä, ei latausta etäkatkaisusovellusliittymään. Ensimmäinen istunto voi erikseen ladata uudelleen käytettävän mallin resurssin; Katso Miksi ensimmäinen suoritus lataa mallin.
Työntekijä ei suorita laskemista välitöntä
Työntekijät parantavat reagointikykyä, eivät raakalaitteiden ominaisuuksia. Malli kuluttaa edelleen CPU-, GPU- tai muita ajonaikaisia resursseja sen mukaan, mitä selain voi tarjota. Suuri syöttö voi silti kestää kauemmin ja vaatia enemmän muistia kuin pieni.
Useita rajoituksia on jäljellä:
- mallin alustamisella on todelliset kustannukset;
- pikselipuskurit vievät muistin molemmilta puolilta, jos ne kopioidaan;
- koon muuttaminen ja muodon muuntaminen vievät aikaa;
- vähän muistia käyttävät laitteet voivat kamppailla suurten kuvien kanssa;
- useammat työntekijät voivat lisätä kiistaa sen vähentämisen sijaan;
- vienti- ja kanvaspäivitykset voivat silti sisältää pääsäikeen.
Viiden päättelytyöntekijän käynnistäminen viidelle kuvalle ei ole automaattisesti viisi kertaa nopeampaa. Työntekijät jakavat saman koneen. Rinnakkaiset työt voivat kilpailla muistin kaistanleveydestä ja suoritusresursseista, kun taas kullakin malliinstanssilla voi olla omat muistikustannukset.
Edistymisraportointi on yhteistoiminnallista
Työntekijä voi lähettää tilaviestejä, mutta se ei automaattisesti tiedä, mikä edistymisprosentti tuntuu oikealta. Mallin lataus, ajonaikainen alustus, syötteen valmistelu, päättely, maskin muuntaminen ja esikatselun renderöinti ovat erillisiä vaiheita eri ajoituksilla.
Joillakin vaiheilla on mitattavissa oleva tavumäärä. Yksittäisen mallin suoritus voi paljastaa vain “aloitettu” ja “valmis”. Tasaisesti etenevä tasainen prosenttiosuus voi siksi olla pikemminkin kosmeettinen kuin tarkka mittaus.
Hyödyllinen edistymiskäyttöliittymä nimeää vaiheen mahdollisuuksien mukaan: mallin, kuvan käsittelyn tai rakennustuloksen valmistelu. Se käsittelee myös epäonnistumisen ja peruutuksen sen sijaan, että jättäisi pyörän ilman selitystä.
Peruutus on enemmän kuin kehrän piilottamista
Jos käyttäjä sulkee kuvan tai aloittaa alusta, käyttöliittymä voi jättää huomioimatta mahdollisen vastauksen vanhentuneesta pyynnöstä. Taustalla olevan laskennan välitön pysäyttäminen voi vaatia lisätukea ajonaikaiselta tai työntekijän lopettamista ja uudelleenluomista.
Työntekijän irtisanominen on ratkaisevaa, mutta se hylkää sen alustetun tilan. Seuraava työ saattaa joutua lataamaan ja alustamaan mallin uudelleen. Lyhyellä toimenpiteellä tuloksen merkitseminen vanhentuneeksi voi olla halvempaa kuin kaiken purkaminen.
Oikea valinta riippuu muistin paineesta, toiminnan kestosta ja suorituskyvystä. Käyttäjän näkökulmasta tärkeä sääntö on, että vanhentunut työ ei saa korvata nykyistä muokkausta.
Virheiden on myös ylitettävä raja
Poikkeuksesta työntekijän sisällä ei tule normaalia pääsäikeen poikkeusta. Työntekijän on raportoitava käyttökelpoisista virheistä, ja editorin tulee kuunnella työntekijätason vikoja.
Hyvä virheenkäsittely erottaa ainakin:
- mallia ei ole saatavilla;
- mallin alustus epäonnistui;
- kuvan purku tai syötteen valmistelu epäonnistui;
- johtopäätös epäonnistui;
- työntekijä pysähtyi odottamatta;
- tulos ei enää kuulu nykyiseen pyyntöön.
Tämä on toimivampi kuin yleinen “jotain meni pieleen”, varsinkin kun ensiasennus ja normaali kuvankäsittely tarjoavat erilaisia ratkaisuja.
Työntekijän tulos on edelleen vain ensimmäinen maski
Säikeen arkkitehtuuri ei itsessään paranna moniselitteistä reunaa. Työntekijä voi palauttaa teknisesti pätevän maskin, josta puuttuu vielä turkki, läpinäkyvä materiaali, kapeat hihnat tai haluttu varjo. Nämä ovat segmentointi- ja tarkoituskysymyksiä.
Editorin työ jatkuu päättelyn jälkeen: skaalaa maski työkoordinaatistoon, muodosta esikatselu, anna käyttäjän tarkentaa sitä ja viedä nykyinen tila. Maskin resoluutio vs esikatselun koko selittää, miksi näitä koordinaattijärjestelmiä ei pidä sekoittaa.
Lyhyt henkinen malli
Ajattele työntekijää paikallisena asiantuntijana viestiikkunan takana:
- editori omistaa vuorovaikutuksen;
- työntekijä omistaa raskaan päättelytehtävän;
- binäärikuvadata ylittää määritellyn rajan;
- työntekijä palauttaa maskin, ei lopullista tuomiota jokaisesta reunasta;
- toimittaja on edelleen vastuussa nykyisestä tilasta, tarkistuksesta, tarkentamisesta ja viennistä.
Jos haluat mallin näkymän itse pikseleistä, jatka kohdasta Mitä laitteessa oleva leikkausmalli näkee. Saat kattavan käytännön yleiskatsauksen kohdasta Kuinka paikallinen taustan poisto toimii.