HTML5 Canvas object rendering: Rendering av olika objekt i olika

Sammanfattning
På grund av att Javascript har utökats inom webben de senaste åren är även Canvas på
uppgång. Javascript möjliggör dynamiskt genererad grafik vilket gör Canvas möjligt att
skapa grafik via Javascript. Canvas objekt består av ett stort antal kurvor/linjer där varje
kurva/linje har ett x antal olika attribut, vid ändring av dessa attribut kan man påverka
renderingstiden på webben. Problemet med dagens webbläsare är att renderingsmotorerna
inte presterar lika bra som det gör för att ladda en bild på webben. Canvas blir därmed en
långsam teknik och andra format så som jpg och png ligger steget före. Detta projekt
implementeras med en kombination av tre programmeringsspråk, HTML, CSS och
Javascript. Med hjälp av funktioner och variabler kan man ta reda på renderingstiders för
olika objekt som skapas och målas ut. Vad projektet ger i slutändan är en analys av hur
renderingen av olika objekt i olika webbläsare presterar. Det finns både kortsiktiga och
långsiktiga utvecklingar av detta projekt.
Nyckelord: Renderingstid, Canvas, Attribut och iterationer.
Innehållsförteckning
1 Introduktion ............................................................................................................................. 1 2 Bakgrund .................................................................................................................................... 2 2.1 javascript ........................................................................................................................................... 2 2.1.1 Mätning av svarstider i javascript ......................................................................................................... 2 2.2 Canvas ................................................................................................................................................ 3 2.2.1 Bildattribut i Canvas .................................................................................................................................... 4 2.3 Tidigare arbeten ............................................................................................................................. 4 3 Problem ...................................................................................................................................... 6 3.1 Hypotes .............................................................................................................................................. 6 3.2 Metodbeskrivning .......................................................................................................................... 6 3.2.1 Metoddiskussion ........................................................................................................................................... 7 3.2.2 Alternativa metoder .................................................................................................................................... 8 3.2.3 Forskningsetik ................................................................................................................................. 8 4 Genomförande/Implementation ....................................................................................... 9 4.1 Förstudie ........................................................................................................................................... 9 4.2 Beskrivning av prototyp .............................................................................................................. 9 4.3 Pilotstudie ..................................................................................................................................... 12 5 Utvärdering ............................................................................................................................. 13 5.1 Presentation av undersökning ............................................................................................... 13 5.2 Analys .............................................................................................................................................. 14 5.3 Slutsats ............................................................................................................................................ 23 6 Avslutande diskussion ......................................................................................................... 25 6.1 Sammanfattning .......................................................................................................................... 25 6.2 Diskussion ..................................................................................................................................... 25 6.3 Framtida arbete ........................................................................................................................... 26 1
Introduktion
Javascript blir mer och mer populärt trots dess långsamma respons samt att Javascript har
blivit en standard som finns på 95% av webben menar Mehrara (2011). Javascript har dock
en del problem, bland annat dess långsamma respons som har att göra med att det aldrig
riktigt har stöd av flerkärniga system. Javascript behandlas inte som ett flertrådat språk
vilket begränsar möjligheter tyder Mehrara (2011).
HTML5 Canvas möjliggör dynamisk skript rendering. Genom en fullständig uppsättning
ritfunktioner kan man komma åt områden med Javascript vilket möjliggör dynamisk
genererade grafik. Canvas har också ett stort stöd, alla sorts webbläsare samt mobilversioner
kan hantera rendering av canvas objekt. Varje Canvas objekt består av ett antal linjer som i
sin tur har unika egenskaper. Dessa egenskaper även kallade attribut kan vara färger, former
och storlek. Attributen avgör hur slutresultatet skall bli tillsammans med en algoritm.
Wei och Xu (2011) säger i sin artikel att Amazon har tagit fram resultat av förlorad
försäljning på 1% på grund av 100 ms fördröjning. Med detta resultat kan man dra slutsatsen
av att användarna strävar bland annat efter snabba svarstider, om detta ej uppfylls kan
användarna enkelt ta sig vidare till nästa sida. Genom att hålla snabba svarstider kan en
verksamhet enklare hitta problem samt en lösning för detta problem vilket kan leda till att
verksamheten sparar både pengar och tid. Rajamony och Elnozahy (2001) menar att man
kan med hjälp av Javascript mäta svarstiden utan att använda sig av ändringar inom
webbläsaren.
Problemet är att dagens canvas objekt målas ut alldeles för långsamt. Johnson och JankunKelly (2008) menar att canvas har problem med sin rendering, att andra format som SVG
ligger steget före canvas. Ahmadi, Jazayeri och Repenning (2012) tyder på att dagens
webbläsare varierar i prestanda. Frågeställningen som skall besvaras är hur stor skillnad det
är mellan olika canvas objekt som utgår från samma bild men använder sig av olika antal
linjer och egenskaper på parametrar. Alla linjer har olika attribut som måste anges innan de
kan målas ut vilket innebär att hårdvaran och mjukvaran behöver använda en mängd
resurser för att få fram ett resultat. Totalt kan en bild ta lång tid att rendera vilket kan leda
till längre responstid. En experimentmetod kommer att användas för att utföra tester på
målningar med olika antal linjer och parametrar för att kunna mäta tiden och sedan se
skillnaden på resultatet. Experimentet fungerar som så att man målar ut en bild med
parametrar och linjer med olika egenskapar, målet är att använda sig av en bild med
egenskaper som skapar en bild med låg kvalitet, en med hög kvalitet, samt en som ligger mitt
emellan.
1
2
Bakgrund
Detta kapitel kommer först att handla om grunder inom de program och språk som kommer
att användas för att utföra detta experiment för att senare gå in mer djupgående.
2.1
javascript
Javascript är ett programmeringsspråk som används mycket inom webbtillämpning och är
tillgängligt för alla webbläsare. Javascript är något som inte syns på utsidan på en hemsida,
det ligger i grunden av uppbyggnaden. En stor del av vad det kan användas till är att skapa
effekter, exempelvis animationer. Javascript är något som kommer vara till användning i
detta arbete för att hålla ordning på renderingstider samt kopplingar kring funktioner och
dess variabler. Javascript är det bästa sättet att komma fram till hur lång tid det tar för ett
objekt att målas ut eftersom man kan koppla ihop knappar och variabler i funktioner för att
få ut ett gemensamt resultat.
Javascript kommer mer och mer till användning trots dess långsamma respons. Mehrara
(2011) säger att Javascript har blivit en standard på 95% av webben. Mehrara (2011) menar
också att Javascript är långsamt på grund av att det aldrig riktigt har behandlats som ett
flertrådat språk, vilket begränsar möjligheten att utnyttja ett flerkärnigt system. Responsiva
program uppbyggda med hjälp av Javascript är dynamiskt skrivet och traditionellt
exekverande med hjälp av bytekod tolkning. Tolkningen gör Javascript mycket långsammare
i jämförelse med ursprunglig kod genererad för statiskt språk såsom C eller C++.
Mehrar (2011) säger också i sin artikel att det primära problemet är att document of object
(DOM), används av Javascript för att interagera med webbsidor och webbläsare, att DOM
inte har en modell för delat tillträde. Detta betyder att två trådar kan involvera flera
händelsehanterare som ändrar samma DOM-objekt och skapar antingen raceförhållanden
eller korrekthetbuggar.
2.1.1 Mätning av svarstider i javascript
Ur en användares perspektiv är svarstiden den tid som förflutit från det att en begäran inleds
vid en klient till den tidpunkt då svar är visat av klienten. Snabba svarstider inom webben är
något användaren strävar efter. Rajamony och Elnozahy (2001) menar att man kan med
hjälp av Javascript mäta svarstiden utan att använda sig av ändringar inom webbläsaren, att
man använder sig av skript som körs på användarens dator och kontrollerar tiderna därifrån.
Därmed kan skriptet få dem rätta tiderna från användarens nuvarande situation.
“Therefore, obtaining quantitative measures of the response times in a timely and
costeffective manner is fundamental to manage e-commerce services across a diverse and
rapidly changing client population” - Jianbin (2011)
Genom att hålla goda svarstider kan ett företag enkelt identifiera sina problem, lösa dem och
komma tillbaka till normalt igen och därmed minska sina kostnader.
När det kommer till hemsidor så har användaren många val att välja mellan, speciellt inom
e-handel är har detta stor betydelse. Det är mycket enklare att gå vidare till nästa hemsida än
att gå till en annan butik ute på stan. Det är där med av stor betydelse att uppfylla
kvalitetskraven en användare ställer, svarstiden kan vara en av dem. Man vill både behålla
2
sina användare samt få tag på nya. Svarstiden på en hemsida inkluderar hela innehållet,
även bilder.
Rajamony och Elnozahy (2001) menar att det är två faktorer är viktiga när det gäller
svarstiden, internetfördröjning och fördröjning av serversidan. Rajamony och Elnozahy
(2001) menar också att det finns några etablerade tekniker för att minska svarstiden över
webben, användningen av kraftfulla servrar, omvända proxyservrar, webb cachar och smart
lastbalansering bland geografiskt utspridda servrar.
2.2
Canvas
Canvas är en del av HTML5 och möjliggör dynamisk skript rendering. Canvas består av en
utdragbar region som definieras i HTML5 med höjd- och breddegenskaper. Genom en
fullständig uppsättning ritfunktioner kan man komma åt områden med Javascript vilket
möjliggör dynamiskt genererad grafik. Canvas kan bland annat användas inom spel,
animationer och bildkomposition. Mowery och Shacham (2012) tar upp canvas breda
stöd, att det finns tillgängligt i Chrome, Firefox, Internet Explorer, Opera och Safari samt
mobil Safari och Android browser.
Shiraishi och Yamaguchi (2000) beskriver att processen av att måla ut ett objekt består av
två steg, förberedelse och sammanställning. Förberedelsen innebär att fördela linjer och dess
attribut och till sist vilken ordning de kommer att målas ut i. Under sammanställning utförs
målningen av linjerna en efter en.
Varje linje är “fixed” och behöver gå igenom fyra olika steg (Stroke attributes) för att bli
fullständig. Figure 1 visar ett exempel på hur det kan se ut när man går igenom de olika
stegen. Steg ett är färgprovtagning, en färg utsätts till linjen. Steg två är bildbeskärning, man
fokuserar på en mindre del av bilden. Steg tre är färgskillnad, den beskärda bilden görs
svartvit för att de olika linjerna sedan ska få den korrekta färgen. De sista steget är rektangel
beskärning, en liten del av bildbeskärningen tas ut för att sedan beskäras ner till mindre
rektanglar som i sin tur tilldelas färger för att skapa ett slutresultat.
Figure 1: Olika steg för stroke attribut (Orginalfoto Adam Meek 2014)
3
När man väl använder sig av canvas för att måla av en befintlig bild vill man få den att likna
de ursprungliga objektet så bra som möjligt. De målet kan oftast vara ett problem, canvas
objekt kan bestå allt ifrån 2000 strokes till 10 000 strokes. Om man då använder sig av 10
000 strokes istället för 2000 srokes så måste man gå igenom de fyra fasta stegen 8000
gånger extra, vilket tar tid och resurser men man får ett bättre resultat.
2.2.1 Bildattribut i Canvas
I Canvas använder man sig av ett stort antal linjer, det kan variera från hundratals till
tusentals. Varje linje har unika attribut för att kunna forma och färglägga en bild. Figure 1
visar hur uttagningen av attributen går till.
Bildattributen kan variera beroende på vilken algoritm man använder för att ta ut linjernas
attribut. En algoritm bestämmer hur man vill utforma områdena inom bilden, hur man vill
att det skall gå till vid mörka områden samt vid ljusa. Attribut så som färg, position och
storlek är viktiga att ta reda på för varje penseldrag.
Buck, Humphreys och Hanrahan (2000) säger att grafikaccelatorer är optimerade för att
flytta data en riktning, från host till skärmen. Därför är varje åtgärd som krävs mycket dyr.
Grafikkortet håller reda på de flesta, om inte alla tillstånd och dess attribut. Attribut så som
aktuella färger, transformationsmatrisen, och så vidare. Genom att kontrollera värdena kan
man förhindra onödiga tillståndkommandon från att genereras när det finns flera kontexter
med samma värden. Det kan vara så att det blir en stor skillnad enbart av att ändra så att
man målar ut alla linjer som använder färgen röd först och sedan går vidare till nästa färg
istället för att gå fram och tillbaka mellan röd.
Buck, Humphreys och Hanrahan (2000) tror att genom att spåra tillståndet tillsammans
med en hierarkisk representation av tillståndsförändringar är en effektiv teknik för att
förbättra hastigheten och robusthet av renderingssystem.
2.3 Tidigare arbeten
Pinto, Amador och Gomes (2010) har presenterat en rapport om 3D-grafik bibliotek helt
skrivet i Javascript som möjliggör utveckling av 3D-innehåll direkt i webbläsarn. Dem
använder sig av Canvas tillsammans med 3D-algoritmer kodade i Javascript. Vanligtvis så
används Canvas för att utforma 2D-grafik men dessa personer tar nytta av dessa 2Dritfunktioner för att skapa, manipulera och rita 3D-objekt direkt i webbläsaren.
Vad man kan få fram av detta arbetet är att det behöver inte vara frågan om rendering av 3Dgrafik utan att förändra attribut för linjerna, hur dem är lagda och formade samt färger för
att optimera utritningshastigheten.
Shiraishi och Yamaguchi (2000) presenterade ett arbete om en metod för automatisk
rendering av en målning. De använde sig en ursprunglig bild, exempelvis ett foto för att
sedan måla av detta objekt med hjälp av en algoritm. De använder sig av olika attribut på
bilderna, exempelvis att de minskar antalet linjer från en bild till en annan för att se
skillnaden i bildkvaliten. Metoden de använder sig av kontrollerar tätheten av linjerna samt
ordningen de målas i baserade på storleken. De börjar med de större linjer först och avslutar
med de mindre.
4
Detta arbete tyder på att det blir en skillnad på hur bildkvaliten varierar beroende på
linjeattributen. Man kan tycka att detta arbete liknar tanken med detta. Där det finns
likheter är hur bildkvaliten kan variera, men att detta arbetet är mer fokuserat på
responstiden mellan de olika bilderna och hur stor skillnaden egentligen är.
5
3
Problem
Problemet är att dagens Canvas objekt målas ut alldeles för långsamt. Johnson och JankunKelly (2008) menar att canvas har problem med sin rendering, att andra format som SVG
ligger steget före canvas. Ahmadi, Jazayeri och Repenning (2012) tyder i sin artikel på att
dagens webbläsare varierar i prestanda och att vi kan i farmtiden vänta oss snabbare
renderingsmotorer.
Alla linjer har olika attribut som måste anges innan de kan målas ut vilket innebär att
hårdvaran och mjukvaran behöver använda en mängd resurser för att få fram ett resultat.
Totalt kan en bild ta lång tid att rendera vilket kan leda till längre responstid. Ett objekt
består av ett stort antal linjer där varje linje har egna egenskaper vilket gör att en målning
med fler linjer tar längre tid att måla ut eftersom att fler egenskaper måste anges.
Frågeställningen som skall besvaras är hur stor skillnad det är mellan olika canvas objekt
som utgår från samma bild men använder sig av olika antal linjer och egenskaper på
parametrar.
Vilka parametrar kan man påverka utan för dåligt resultat och hur stor skillnad är det på
responstiden, från början till slut om man ändrar objektens egenskaper? Exempelvis om
man ritar ut ett objekt med andra linjeparametrar, hur påverkas svarstiden?
3.1
Hypotes
Hypotesen är att linjeattribut eller minskat antal parametrar påverkar renderingstiden
positivt men att man kommer se en skillnad i bildkvaliten. Färre antal linjer i ett objekt
behöver inte gå snabbare, färre antal linjer innebär tjockare linjer vilket är mer krävande vid
utritning och vid ett större antal linjer används mer men mindre linjer. Detta kan påverka
renderingstiden på olika sätt, antingen så tar det längre eller kortare tid att måla ut ett objekt
med mindre antal linjer.
Uppkopplingen kan också vara en faktor som påverkar renderingstiden, det kan vara en
skillnad på hur en webbläsare samt en dator reagerar på en uppkoppling med 80 Mbit och
en med 10 Mbit.
Att avgöra om det är värt att försämra bildkvaliten för att påverka renderingstiden positivt är
upp till användaren eller skaparen, det kan bero på vad för sort ämne det handlar om. Man
kan tycka att det kanske inte är värt att lägga tid och resurser på att måla ut en bild under en
längre tid när man egentligen vill visa upp en sida där bilden inte är i fokus utan att texten
ligger i fokus.
3.2
Metodbeskrivning
Den metod som passar bäst för att kunna testa hypotesen är experimentmetoden. Den gör så
att man kan testa målningar med olika antal linjer och parametrar för att kunna mäta tiden
och sedan se skillnaden på resultatet. Man sedan kan använda sig av de olika tiderna man
har fått från testerna för att skapa grafer som gör det enkelt att urskilja resultatet.
Om man går igenom liknade arbeten så kan man se att de använder sig av samma sorts
metod. Bland annat så kan man se att Shiraishi och Yamaguchi (2000) använder en
experimentmetod för att kunna se resultat mellan olika Canvas objekt som använder sig av
6
olika antal linjer. Heok och Daman (2004) använder sig också av en experimentmetod för
att kunna urskilja detaljnivån av 3D-objekt. Chi och Liu (2014) utför också ett experiment
när de testar algoritmer för att rendera icke-fotorealistiska bilder av typen Pointillism, vilket
är en typ av bild som består av prickar av färg i ett mönster.
Experimentet kommer fungera som så att man målar ut en bild med parametrar och linjer
med olika egenskapar, målet är att använda sig av en bild med egenskaper som skapar en
bild med högre kvalitet än de andra och sedan använda sig av en med betydligt sämre
kvalitet och till sist använda en bild som ligger mitt emellan. Det man mäter då är tiden från
man startar målningen tills den är 100% klar. Det kan också vara intressant att veta hur det
kan påverka ett Canvas objekt igenom att använda en färgordning, de vill säga att man målar
ut röd, röd och sen blå istället för röd, blå och röd igen vilket gör att man får ändra
färgegenskapen ytterligare en gång. Om detta sker ofta kan det bygga på en tid som i
slutändan kan ses som en skillnad.
Rajamony och Elnozahy (2001) menar att man kan med hjälp av Javascript mäta svarstiden
utan att använda sig av ändringar inom webbläsaren. Rajamony och Elnozahy (2001) säger
att man kan mäta svarstiden genom att starta en klocka när användaren exempelvis klickar
på en länk och sedan stoppa tiden via en onload funktion på sidan. Dock fungerar de inte lika
bra att starta klockan om en användare går in på sidan via en URL-adress.
Rajamony och Elnozahy (2001) menar också att man inte ska gå efter klockan när man
mäter svarstiden, att man istället använder sig av ett client-script. Detta skriptet körs på
användarens dator och kan antingen utföras när en speciell händelse inträffar eller när
dokumentet laddas. Skriptet tar reda på tiden genom att ta reda på nuvarande tid och
starttid som skriptet kommer ihåg från tidigare steg och sedan räkna ut hur lång tid det tog.
3.2.1 Metoddiskussion
Att använda olika enheter för att utföra tester är en möjlighet för att få annorlunda data.
Exempelvis att utföra testerna på en bärbar och en stationär dator är ett sätt. Det negativa
med detta är att det blir svårt att jämföra resultatet eftersom en stationär dator oftast mer
kraftfull än vad en bärbardator är. Utifrån arbetets förutsättningar kommer inte denna idé
att fungera. Detta beroende på att datorerna som är tillgängliga är baserade på olika
operativsystem och om man skulle behöva använda sig av en virtual machine för att köra ett
annat operativsystem på ett redan befintligt, så använder datorn mycket mer resurser för att
köra två operativsystem och det blir då obalans i mätningen som i sin tur ger dåligt resultat.
Det blir också svårt att jämföra de olika webbläsarna eftersom de bland annat är på olika
operativsystem och att de stödjer olika webbläsare. På exempelvis OS X fungerar Safari på
men inte på Windows som i sin tur stödjer Internet Explorer. Detta är ett problem om man
vill utföra tester på så många webbläsare som möjligt, då det blir svårt att testa både Internet
Explorer och Safari på samma dator. Lösningen för detta är att använda sig av en virtual
machine men då återkommer man till samma probleme att datorn får köra flera
operativsystem och mer resurser på datorn används och det kan försämra tiderna i
mätningen.
Genom att använda tillägg för webbläsaren (Exempelvis Greasemonkey) blir det ett problem
att utföra dessa tester på en mobilenhet. Det går inte att implementera ett skript som ska
köras på webbläsaren när man besöker en viss sida, man kan mäta med Javascript-variabler
men inte med tillägg som inte fungerar i alla webbläsare. Detta gör så att man inte kan testa
7
skillnaden på en mobil och dator. Alla är medvetna om att en mobil idag fungerar som en
dator och att man nästan kan göra allt på den som man kan göra på en dator. Mikkonen och
Taivalssari (2009) säger i sin artikel att det finns ett antal allvarliga problem med en
webbapplikation på en mobilenhet, bland annat har webbläsaren en dåliga prestanda och
inte är designad för en applikationsplattform.
3.2.2 Alternativa metoder
En annan metod som skulle kunna användas inom detta ämne är fallstudie. Det som skiljer
fallstudien från experiment är att man går djupare inom ämnet för att undersöka fenomen
medan experimentmetoden kan fokusera mer på att göra mätningar av variabler. Genom att
använda fallstudie kan man forska sig vidare för att få fram ett vetenskapligt resultat som
stödjer en hypotes medans man med experiment får testa sig fram för att få ett resultat som
kan följa en hypotes. I detta fall verkar fallstudie inte relevant, och man får inte direkt fram
något av det.
3.2.3 Forskningsetik
Inga testpersoner kommer att användas för detta experiment på grund av att det inte är
relevant för att testa hypotesen. För utgöra mätningar av responstider behövs ingen direkt
person, vad som behövs är data och ingen känslig sådan. Det kan hända att personer agerar
på objekten som målas ut, exempelvis djur eller bild på en person. För att detta inte ska
inträffa kan man använda sig av ett objekt så som en boll, ett bord eller en bil. Någonting
som inte kan kopplas till en unik person.
Eftersom detta kommer att publiceras och innehålla den kod och information som används
kommer det att finnas en garanti av återupprepbarhet samt en öppenhet med resultatet.
Resultatet kommer att vara oberoende av åsikter från forskare och endast bestå av
sammansatt data från testerna.
Experimenten kommer utföras i ett flertal webbläsare för att garantera möjligheten att
återupprepa. Det kan hända att en del personer föredrar en speciell webbläsare och inte
känner sig bekväma med de andra som finns tillgängliga. Det är också för att utöka
resultaten och inte endast för att öka garantin av återupprepning. Thummalapenta, Devaki,
Sinha och Chandra (2013) tar upp att det kan vara bra att testa flera webbläsare på grund av
att renderingen kan variera samt att DOM-strukturen också kan variera mellan olika
webbläsare, webbläsarversioner och därmed ha en inverkan på skripten som körs.
8
4
Genomförande/Implementation
Detta kapitel kommer att beskriva en förslagen lösning av mätning av Canvas objekt och
vägen till ett resultat. Kapitlet kommer att avslutas med en pilotstudie för att visa att
de
mätningar som samlats in kan användas för att analysera resultatet.
4.1
Förstudie
Inspirationen av detta projekt uppstod på grund av en kombination av ett intresse av webben
och HTML5 Canvas, att få chansen att arbeta djupare inom ämnet Canvas som kan vara på
ingång och kan bli en bättre teknik på webben. Java direkt med Swing är en kurslitteratur
skriven av Jan Skansholm och är en bok som handlar om programspråket Java. Boken tar
bland annat upp olika attribut inom Canvas som ger lösningen till problemet och hypotesen
inom detta projekt. Utöver Java direkt har inspiration av implementationer kommit från
forum via webben, http://stackoverflow.com/.
4.2
Beskrivning av prototyp
De olika tekniker som används i projektet är en koppling mellan och Javascript. Alla tekniker
behöver varandra för att fungera på ett effektivt sätt, mer djupgående beskrivs nedantill.
4.2.1
HTML
Vad som görs i HTML är att man deklarerar en div-box till en Canvas vilket görs med ett id,
canvas id=”myCanvas”. Detta id används sedan i Javascriptet för att skapa ett Canvas objekt
till just de unika id. Med HTML gör man också kopplingen mellan olika webbsidor samt
koppling till CSS-mallen och Javascripet. Man kan använda sig av koden för Javascriptet
direkt i HTML-filen men det är ingen snygg lösning, blir enklare att läsa och arbeta med
koden om man använder sig av en separat fil som sedan HTML-filen läser av. En skapad
teknik med HTML som finns i detta projekt är en dropdown meny som görs med en option,
vilket är bra för att man skall kunna göra val av
vilket sorts objekt man vill måla ut. Detta alternativ
kan vara bra om man använder sig av flera antal
olika objekt eller om man inte väljer att hårdkoda
in objekten. Se appendix B för hela koden.
Figure 3: Dropdownmeny
4.2.2
Javascript
Javascriptet är själva nyckeln i detta projekt, här görs koden för Canvasen samt kontrollen
för svarstiderna vilket är syftet med projektet. Scriptet fungerar så att först görs en kontroll
av vilket val som har gjorts i HTML-filen, alltså vilken option som har valts. Beroende på
valet så går man vidare till en funktion som skapar ett nytt Canvas objekt. Nästa steg är att
gå vidare till den tilldelade funktionen som har koordinaterna för de olika linjerna/kurvorna
för ett objekt. Alla koordinater skickas via en path där man pushar ett segment till en
funktion som sedan ritar ut och färglägger objekten, färgläggningen sker samtidigt vilket
innebär att alla objekten målas ut samtidigt. Alla koordinater sparas i minnet och målas ut
när alla koordinater för alla objekt har tilldelats. Varje segment består av en kind med
9
antigen x1,y1 eller x2,y3 eller x3,y3 därmed behöver en kurva en kombination av x1,y1,x2,y2
och x3,y3 för att skapa ”bågen” av linjen. Se appendix C för hela koden.
Efter koordinaterna har skickats in via en path så vill man gå direkt vidare till att måla ut
objektet med en draw(). Men på grund av att använda sig av requestAnimationFrame så
behöver man anropa draw vilket gör att man får skapa en helt ny funktion som gör anropet
på draw(). Samtidigt i den skapade funktionen används en translate vilket avgör hur många
objekt som skall målas ut, se mer utförlig förklaring nedan.
De olika objekten är implementerade via tilldelade koordinater. Objekten är vektorbaserade
bilder skapade i Adobe Illustrator (svg-filer), för att få reda på koordinaterna för de skapade
bilder så kan man överföra svg-filen till Canvas objekt görs via en konverter, SVG-Converter
(2014). Detta är ett php-script som överför bildens linjer, kurvor, färger och så vidare till
koordinater samt hexadecimala värden av färger.
Valet av hur många objekt som skall målas ut görs via en for-loop där man sätter ett värde
beroende på antal objekt, vad som
görs i loopen är att man använder
en translate på det valda objektet.
Vad som menas med en translate
är att man översätter objektet och
målar ut de igen fast jämsides med
det tidigare objektet.
Figure 4: Translate
4.2.3
Svarstider
Lösningen av svarstiderna går att lösa på två olika sätt eller genom att använda teknikerna
tillsammans. En av lösningarna är att använda performance.now(), det fungerar så att man
skapar ett stoppur vilket är en grundteknik inom Java som tar den nuvarande tiden vilket
medför att man kan deklarera en starttid och sedan deklarerar man en sluttid. När man har
samlat in starttiden och sluttiden kan man räkna ut den beräknade svarstiden, sluttid–
starttid = sumtid. Vad som skiljer preformance.now() mot Date() är att man får decimaltal.
Detta är bra för att mätningar som dessa inte skiljer mycket i ms vilket gör det ännu viktigare
att få reda på decimala värden.
En annan lösning är att använda sig av requestAnimationFrame vilket fungerar så att man
talar om för webbläsaren att man vill utföra en animation och begär att webbläsaren kallar
på en viss funktion för att uppdatera animeringen innan nästa utmålning. Med denna
lösning kan man helt enkelt kontrollera frames per second på ett objekt. Se appendix D för
fokus på lösningen med tiderna.
4.2.4 Iteration av objekt
Det finns ett flertal olika sätt att utföra iterationer på en webbsida, om man inte har tillgång
till koden kan man använda sig av tillägg i sin webbläsare där man skapar ett script som körs
på just en sida och man kan kolla upp olika variabler som används för att göra dessa
iterationer. Den enklaste lösningen samt den bästa lösningen är självfallet att hårdkoda in
iterationen i sin egen kod, vilket görs i detta projekt. Det fungerar så enkelt att man skapar
en for-loop runt anropen på utritningen, detta gör att loopen kommer att gå runt om och om
igen ett x antal gånger. Se appendix E för fokus på iterationen.
10
4.2.5 Analys av svarstider
För att kunna utföra en analys av svarstiderna via exempelvis en graf behöver man få tillgång
till tiderna och inte bara via webbläsarn. Koden i appendix F visar en lösning för att kunna
spara ned tiderna i en string som läggs i en array enligt följande, ”Iteration 1 tog 30Ms”.
Denna arrays skall sedan gå att ladda hem till sin dator via sin webbläsare i excel-format,
vilket är ett utmärkt program för att göra grafiska analyser av mätningarna. Denna array
töms sedan inför varje gång man väljer att måla nya objekt.
4.2.6 Progression
Eftersom att koordinaterna för varje objekt sparas i minnet och målas ut samtidigt och inte
var för sig så blir det ett problem med att ta reda på hur lång tid det tar för ett objekt att
målas ut från början till slut.
En annan implementation som inte fungerade var att använda sig av funktioner för varje
Canvas objekt, att man tilldelade en div-box ett speciellt Canvas objekt. Det fungerade att
måla ut objekten genom att tillkalla funktionen men problemet var att man inte kunde ändra
attribut för objekten mellan olika boxar, exempelvis färg eller border. Den lösning man
kunde göra via denna implementationen var att skapa en ny funktion för ett likadant objekt
när man ville byta färg. Det är absolut ingen snygg eller bra lösning, den fungerade men det
blir för många funktioner som gör samma saker.
En lösning som fick kastas var att använda sig av arrays, en för varje attribut man vill ändra.
Man kan sedan skicka med ett värde från en array beroende på vilket id Canvasen har i forloopen.
colors=["","red","blue","green","lightblue","yellow","#F5F5F5];
Denna array fungerar så att Canvasen som får ett i-värde, om i=1 skickar man med color[i]
vilket innebär att color=röd. Så istället för att skapa ett flertal funktioner för liknande objekt
fast med olika egenskaper så kan man skapa arrays som innehåller olika värden som sedan
skickas med beroende på vilket id Canvasen har tilldelats, exempelvis i Figure 4 kan man se
att objektet har färg röd vilket menar att det är första objektet som skapats. Man behöver då
endast en funktion för varje objekt men en ytterligare funktion som skapar de olika Canvasobjekten samt tilldelar egenskaper
4.2.6.1
Lösningar
För att lösa problemet med den första tekniken ovan behöver man använda sig av en
translate på det valda objektet. Med hjälp av translate kan man enkelt välja hur många
objekt som skall målas ut och enkelt att mäta svarstider på. Eftersom att man inte är
intresserad av att ta reda på hur lång tid det tar från att skicka in koordinaterna samt att
måla ut koordinaterna är translate den bästa lösningen. Man kan använda sig av samma
funktion av objekt och upprepa de ett antal gånger beroende på hur många objekt man vill
måla ut.
Lösningen för det andra problemet som beskrev ovan blev det enklast att hårdkoda om
objektet med dess nya attribut.
11
4.3
Pilotstudie
Syftet med mätningen är enkel, det handlar enbart att ta reda
på information om hur renderingstiden är mellan olika objekt
med olika attribut eller utritnings ordning. Det kan vara en
lösning som färgordning för att minska antalet anrop på
draw() eller skillnaden mellan att måla ut ett, tre och sex
objekt. Figure 5 visar ett resultat av en mätning av sex objekt
50 gånger, man kan se att första målningen tar betydligt
mycket längre tid än resterande. Vad man kan sammanställa
av denna mätning är att objekten är små och kräver inte
mycket cpu-kraft. Appendix H visar en linjegraf av en liknande
mätning av sec objekt. Vad som skiljer de åt är att Figure 5
körs på safari och appendix H via Google Chrome.
Figure 6 påvisar ett näst intill unikt exempel av en mätning,
vad som skiljer de åt från Figure 5 är att man mäter
renderingstiden på ett enskilt objekt. En utmåling av ett objekt
50 gånger istället för sex objekt 50 gånger. Vad man kan
sammanfatta från det är att ett objekt går fortare än vad sex
objekt gör vilket är uppenbart eftersom att de är samma objekt
fast mindre antal. Dock så kan man inte riktigt dra någon
slutsats från dessa mätningen på grund av att störta andelen
av iterationerna tar 0 ms vilket inte går att göra en mätning på.
Figure 5: Mätning 6 objekt.
Appendix H del 2 så får kan man se en linjegraf av en mätning
av renderingstiden av ett objekt 50 gånger i Google Chrome, en
motsvarande mätning av tidigare test. Vid just dessa
mätningar kan man ej fatta några direkta slutsatser på grund
av att objekten som testas är små och består av ytterst få lager,
linjer och endast två färger.
Vad man kan få ut av denna pilotstudie är att prototypen går
att använda för att utföra mätningar av olika objekt. Vad som
behövs ändra innan testerna är de hårdkodade
Canvasattributen samt antal iterationer som skall utföras.
Figure 6: Mätning 1 objekt.
12
5
Utvärdering
Detta kapitel börjar med att beskriva den genomförda studie, som följs av en analys av den
insamlade data från experimentet. Kapitlet avslutas med en sammanfattning av de slutsatser
som gjorts i analysen.
5.1
Presentation av undersökning
Undersökningen är uppdelad i tre delar, varje del består av ett eget objekt. De olika objekten
som undersöks är ett stort objekt med ca 400 kurvor/linjer och 23 lager, ett litet objekt med
ca 100 kurvor/linjer och består endast av ett lager samt ett objekt som ligger på ca 150
kurvor/linjer och 19 lager vilket gör de ett objekt som ligger emellan de stora och de lilla. Vad
som gör de lilla och medelstora objektet så olika även fast de bara skiljer ca 50 kurvor/linjer
är att de skiljer 18 lager. Varje gång ett objekt byter färg eller börjar på en helt ny punk så
behöver man skapa ett nytt lager, ett nytt lager innebär en ny path som skickas in. Genom att
testa de lilla och det medelstora objektet så kan man urskilja hur mycket tid de kostar att
skapa en ny path. Skillnaden mellan de stora och det medelstora objektet är antal
kurvor/linjer, antal paths är nästan den samma. Med de två objekten kan men urskilja hur
mycket de påverkar om man har många kurvor/linjer vid rendering.
Den uppdelning som beskrivs ovan går att kombinera på olika sätt. Vad som görs är att man
måla ut dessa objekt 1000 gånger vid varje test, varje test av ett objekt utförs 15 gånger.
Detta 15 tester delas upp i tre delar, fem tester för varje del. En del för att måla ut en bild av
objektet med 1000 iterationer, en del för att måla ut fem bilder av objektet med 1000
iterationer och den sista delen för att måla ut tio bilder av objektet med 1000 iterationer.
Alla dessa tester görs i tre olika webbläsare, Google Chrome, Mozilla Firefox samt Safari.
Med dessa tester kan man urskilja de olika webbläsarnas renderingsmotorer och se vilken
som presterar bäst.
Inför varje analys tas den absoluta första iterationen bort i summeringen av iterationerna.
Detta görs på grund av att just den första iterationen målar inte bara ut objekten utan
skickar också in alla koordinater, färger och så vidare vilket gör de till en ojämn mätning om
man väljer att ta med den informationen. Det man vill mäta på är utritningen och inget
annat onödigt som kan göra informationen annorlunda.
5.1.1 Utrustning
MacBook Air, OS X version 10.10.3.
1,3 GHz Intel Core i5, 8GB RAM.
Grafikkort Intel HD Graphics 5000 1536 MB.
Hårddisk på 126GB SSD.
Testerna utförs på ett 100/100 trådlöst nätverk med en ASUS router, RT-N12 Wireless-N.
Testerna utförs på Högskolan i Skövdes webbserver för studenter - wwwlab.iit.his.se
13
5.2
Analys
Analysen av varje mätning utförs i Excel, genom att samla ihop tiderna från varje test och ta
reda på medelvärdet för varje iteration för att sedan kunna skapa grafer utifrån den
informationen.
5.2.1 Objekt Krokodil
Objekt Krokodil anses som det lilla objektet som består av ca 100 kurvor/linjer och endast
ett lager. Experimentet har utförts i tre olika webbläsare med 1000 iterationer
Figure 7.1: Objekt Krokodil summan av 1,10,100 och 1000 iterationer.
Figure 7.2: Bättre syn av figure 7.1 iteration 1 och 10.
14
Figure 7.1 visar resultatet av objekt Krokodil, resultatet är ifrån testerna som utfördes av
utmålningen av 10 krokodiler per iteration. Grafen består av ms i y-axeln och summan av
antal iterationer i x-axeln. De olika färgerna står för vilken webbläsare tiderna kommer ifrån.
Man kan tydligt se att Mozilla Firefox sticker ut över de två andra webbläsarna, medan att
Google Chrome och Safari har näst intill samma värde. Vad som skiljer dem åt är att Safari
har en bättre standardavvikelse vilket betyder att nästa gång man utför testerna så är det ca
98% chans att resultatet hamnar innanför standardavvikelsen enligt 68–95–99.7 rule,
Wikipedia. Den standardavvikelse som används är multiplicerat med tre (Stddev*3). För att
få en bättre bild av iteration 1 och 10 se figure 7.2.
Figure 8.1: Objekt Krokodil summan av 1,10,100 och 1000 iterationer.
Figure 8.2: Bättre syn av figure 8.1 iteration 1 och 10.
15
Figure 8.1 visar en liknande graf som i figure 7.1. Vad som skiljer dessa två från varandra är
att resultatet i figure 8.1 visar summan av 1,10,100 och 1000 iterationer av 5 objekt per
iteration. Medelvärdet a varje iteration används för att skapa en summa av antal iterationer.
Vad som kan sammanfattas från grafen i figure 8.1 är samma som tidigare sammanfattning
av figure 7.1. Alltså att Mozilla Firefox tar längre tid på sig att rendera alla objekten 1000
gånger medans Google Chrome och Safari är jämsides vid 100 och 1000 iteratoner. Om man
ser närmare på figure 8.2 så får man en bättre bild av iteration 1 och 10 och få resultatet på
att Google Chrome startar långsamt men går fortare och fortare medan Mozilla Firefox
tappar sin renderingstid men att Safari fortfarande presterar bättre. Standardavvikelsen
visar att Safari håller den mest stabila mätningen. Standardavvikelsen som används är
multiplicerat med tre (Stddev*3).
Analysen av liknande test fast med summan av 1,10,100 och 1000 iterationer av 1 objekt per
iteration ger en graf som ser ut som grafen för summan av 1,10,100 och 1000 iterationer av 5
objekt per iteration i figure 8.1. Alla analyser fungerar på samma sätt fast använder sig av
olika tider eftersom att tiderna tas ifrån de olika testerna som görs. Alla analyser använder
sig av en standardavvikelse multiplicerat med 3 (Stddev*3) och utförs i olika webbläsare.
5.2.2 Objekt Tält
Objekt Tält ses som det medelstora objektet som består av ca 150 kurvor/linjer samt 19 lager.
Experimentet utförs i tre olika webbläsare och testerna görs med 1000iterationer.
Figure 9.1: Objekt Tält summan av 1,10,100 och 1000 iterationer.
16
Figure 9.2: Bättre syn av figure 9.1 iteration 1 och 10.
Figure 9.1 visar en graf med resultatet av summan av 1,10,100 och 1000 iterationer av 10
objekt per iteration. Grafen fungerar som alla tidigare, ms i y-axeln och summan av antal
iterationer i y-axeln. Grafen består också av standardavvikelsen multiplicerat med tre
(Stddev*3). Här kan man tydligt se att Mozilla Firefox presterar mycket sämre än Google
Chrome och Safari, detta gäller vid summan av alla iterationer. Om man kollar på figure 9.1
och 9.2 så ser man tydligt att Google Chrome presterar bäst men består av en stor
standardavvikelse vilket menar att Safari inte behöver prestera sämre på grund av just denna
analys. Eftersom att standardavvikelsen multiplicerat med tre ger en 98% säkerhet enligt
68–95–99.7 rule, Wikipedia av att nästa mätning kommer hämna innan för
standardavvikelsen.
Om man jämför resultatet i figure 9.1 mot figure 7.1 vilket båda gör en mätning av 1,10,100
och 1000 iterationer av 10 objekt per iteration fast med två olika objekt men endast ca 50
kurvor/linjer. Det som skiljer dem åt är att objekt tält består av 19 lager medan objekt
krokodil endast har ett lager. Vad man kan se om man tittar noggrant på dessa två figurer är
att summan av iterationerna är betydligt mycket mer i ms och att webbläsarna är hyfsat när
varandra i figure 7.1. Däremot i figure 9.1 så är skillnaden på webbläsarna betydligt mycket
större vilket ger ett resultat av att renderingsmotorn påverkas beroende på hur många lager
objektet består av, men också att antal kurvor/linjer inte behöver påverka renderingstiden
vilket är hypotesen i detta experiment.
17
Figure 10.1: Objekt Tält summan av 1,10,100 och 1000 iterationer.
Figure 10.2: Bättre syn av figure 10.1 iteration 1 och 10.
Figure 10.1 visar resultatet av mätningen av objekt tält med summan av 1,10,100 och 1000
iterationer av 10 objekt per iteration. Grafen fungerar som alla tidigare, likadana x- och yaxlar samt standardavvikelsen multiplicerat med tre. Efter en analys av denna mätning kan
man resultera i att Safari fungerar bättre när mindre antal objekt målas ut vid varje iteration.
En annan slutsats man kan fatta är att Mozilla Firefox fortfarande är den webbläsare som
har den högsta renderingstiden men också att Google Chome och Safari fortfarande är
18
jämsides och att standardavvikelsen för Safari fortfarande är betydligt mycket mindre än de
andras.
Figure 11: Objekt Tält summan av 1,10,100 och 1000 iterationer.
Analysen av mätningen i figure 11 med summan av 1,10,100 och 1000 iterationer av 1 objekt
per iteration ger en helt annan information än tidigare analys av objekt tält. Vad man kan
sammanställa från denna analys är att de olika webbläsarna ger ungefär samma summa av
renderingstider.
5.2.3 Objekt Lejon
Objekt Lejon är det stora objektet i detta experiment. Det består av ca 400 kurvor/linjer
samt 23 lager vilket gör de 250 kurvor/linjer större än objektet som ses som medelstort.
Detta test ger ett resultat av hur mycket renderingsmotorns resurser som går åt för antalet
kurvor/linjer.
Testerna utförs som alla tidigare, i tre olika webbläsare och analyseras i Excel genom att
skapa grafer baserat på medelvärdet för varje iteration. Om man tar summan av ett antal
iterationer av medelvärdet (1,10,100 och 1000) från varje test av de olika webbläsarna så kan
man tydligt se skillnaden av hur renderingsmotorn i webbläsaren reagerar på objekten som
målas ut.
19
Figure 12.1: Objekt Lejon summan av 1,10,100 och 1000 iterationer.
Figure 12.2: Bättre syn av figure 12.1 iteration 1 och 10.
20
Figure 12.1 visar tydligt att väl när man kommer upp i ett större antal kurvor/linjer i ett
objekt så blir det en betydligt större skillnad bland de olika webbläsarna. Om man fokuserar
mer på iteration 100 och 1000 i y-axeln kan man se att Google Chrome har en betydligt
mycket bättre renderingstid av summan av antalet iterationer. Vad som mäts i figure 12.1 är
summan av 1,10,100 och 1000 iterationer av 10 objekt per iteration, alltså vid varje iteration
så målar man ut 10 stycken lejon. Dessa 10 lejon målas ut intill varandra.
Figure 12.2 är samma värden som i figure 12.1 men fokuserar på summan av iteration 1 och
10 på grund av att dessa staplar i grafen blir så pass små att det blir svårt att tyda, men med
grafen i figure 12.2 får man en bättre graf vilket innebär summan av första iterationen samt
de 10 första. Man kan tydligt se att Google Chrome startar snabbast och Mozilla Firefox
startar långsamt medan Safari ligger mitt emellan. Standardavvikelsen för varje webbläsare
går inte i varandra vilket innebär en 98% chans att nästa mätning hamnar inom
standardavvikelsen enligt 68–95–99.7 rule, Wikipedia.
5.2.4 Alla tre objekt tillsammans i samma webbläsare
Den analys som görs under denna punk är att jämför renderingstiden av summan av 1, 10
100 och 1000 iterationer av 10 objekt per iteration av de tre olika objekten (krokodil, tält och
lejon) för att se hur mycket längre tid de tar. Analysen sker för enskilda webbläsare, alltså tre
objekt målas ut 10 gånger med 1000 iterationer i Google Chrome, Mozilla Firefox och Safari.
Figure 13.1: Summan av 1,10,100 och 1000 iterationer av tre olika objekt i Chrome.
Det man kan resultera ut analysen i figure 13.1 är att renderingstiderna för de tre olika
objekten ökar, den blå stapeln står för det lilla objektet, den röda för det medelstora objektet
och den gröna för det stora objektet. Analysen görs i Google Chrome med standardavvikelsen
21
multiplicerat med tre. Antalet kurvor/linjer skiljer inte mycket mellan den blå och röda
stapeln, vad man kan sammanfatta från det är att renderingsmotorn i webbläsaren reagerar
olika beroende på hur många lager ett objekt består av. Om man jämför den röda och den
gröna stapeln som inte skiljer så mycket i antal lager men däremot i antalet kurvor/linjer kan
man tydligt se att summerade renderingstiden skiljer mycket. Med detta sagt kan resultera
att renderingsmotorn reagerar annorlunda för objekt med ett större antal kurvor/linjer och
inte bara antal lager i ett objekt.
Figure 13.2: Summan av 1,10,100 och 1000 iterationer av tre olika objekt i Firefox.
Vad man kan se i figure 13.2 är en likadan analys som i 13.1, den ända skillnaden är att
analysen sker i Mozilla Firefox. Vad man kan resultera i när man kollar på denna graf är att
det skiljer mycket mer mellan stapel blå och röd, alltså att Mozilla Firefoxs renderingsmotor
reagerar sämre på renderingstiden av ett objekt som består av mer antal lager och inte lika
mycket på antalet kurvor/linjer som Google Chrome gör.
22
Figure 13.3: Summan av 1,10,100 och 1000 iterationer av tre olika objekt i Safari.
Figure 13.3 gäller det de samma som i figure 13.1 och 13.2. Det som är annorlunda är att
denna figure visar mätningsvärden från webbläsaren Safari. Man kan se i denna graf att det
stora objektet (lejon, vilket är den gröna stapeln) verkligen sticker ut, alltså kan man med
säkerhet säga att Safaris renderingsmotor reagerar sämre på objekt med ett större antal
kurvor/linjer. Skillnaden mellan den blåa och röda stapeln är skillnaden mellan de lilla och
det medelstora objektet vilket skiljer i stor del av antal lager i bilden, detta leder till att Safari
också reagerar på antalet lager i en bild men också antalet kurvor/linjer.
5.3
Slutsats
Efter att ha gjort analyser på olika mätningarna som gjort i detta experiment kan man dra ett
antal slutsatser.
För att tydliggöra vad som har testats i detta projekt så är de inte mätningar av objekt med
olika egenskaper på attributen. Alltså inga mätningar på samma objekt fast med olika
egenskaper, exempelvis ändring av färger, tjockleken på bordern och så vidare. Det som har
testats är hur webbläsarens renderingsmotor reagerar på objekt som är uppbyggda på olika
sätt. Vad som menas med uppbyggda är hur strukturen ser ut, består objektet av ett stort
antal linjer eller är de mer avancerat. Ett mer avancerat objekt är uppbyggt av många lager,
ett nytt lager behövs när man ändrar färg eller börjar på en ny utritningspunkt. Vad som då
mäts är hur lång tid det tar att måla ut ett objekt med många lager till skillnad från ett objekt
med ett större antal linjer och få lager.
En utav dessa slutsatser som kan dras är att standardavvikelsen ser olika ut beroende vilken
webbläsare testerna utförs i. Standardavvikelsen i Mozilla Firefox har den största positiva
och negativa piken vilket innebär att renderingstiderna för varje iteration i Mozilla varierar
mest, vilket innebär att nästa mätning kommer att hamna inom just den standardavvikelsen.
23
Standardavvikelsen i Google Chrome är mindre än Mozillas men har också en stor skillnad
mellan den positiva och negativa piken. Webbläsaren med den minsta standardavvikelsen är
Safari, om man kollar de grafer som har tagits upp under analysdelen kan man se att i alla
grafer är de Safari som har en minsta standardavvikelse vilket innebär att nästa mätning
kommer till 98% chans att hamna inom den piken.
En annan slutsats som man kan dra i etta experiment är att Mozilla Firefoxs
renderingsmotor reagerar sämre på objekt med flera antal lager i sig tillskillnad mot objekt
som består av ett större antal kurvor/linjer, det är något man kan se tydligt i figure 13.2.
Däremot kan man också dra slutsatsen att Google Chromes renderingsmotor reagerar sämre
på objekt med ett större antal kurvor/linjer tillskillnad mot objekt som består av fler antal
lager i sig. Detta är rena motsatsen mot Mozilla Firefox.
Det sista slutsatsen man kan dra med detta experiment är att Google Chrome hanterade de
mätningarna bäst i längden, alltså att när man kommer upp i ett större antal iterationer så
blir den summerade renderingstiden för Google Chrome den lägsta jämfört med Mozilla
Firefox och Safari. Man kan också se att Mozilla var den webbläsaren som presterade sämst
under dessa mätningar vilket gör att Safari hamnar mitt emellan Chrome och Mozilla.
Däremot så presterade Safari bättre i uppstarten, alltså att Safari hanterade de första
iterationerna snabbast men tappade i längden och detta har att göra med att Google
Chromes iterationer var så pass varierande, att de kunde gå från 30 ms till 7 ms. Google
Chrome presterade därför bättre vid 1000 iterationer istället för 1-5 iterationer men att
Safari alltid höll sig på samma tid under alla 1000 iterationer vilket gör de till den stabila
webbläsaren.
Om man sammanfattar denna slutsats med hypotesen från tidigare kapitel kan man bekräfta
att hypotesen stämmer överens med resultatet. Ett objekts renderingstid behöver inte vara
beroende av antal kurvor/linjer utan mer av objektets uppbyggnad, alltså hur många lager
bilden består av. Figure 13.1, 13.2 och 13.3 visar alla tre att det är skillnad på renderingstiden
av objekt som består av näst intill samma antal kurvor/linjer men har olika attribut i sig.
24
6
Avslutande diskussion
6.1
Sammanfattning
Om man kollar på frågeställningen tidigare i dokumentet under problem-kapitlet,
exempelvis om man ritar ut ett objekt med andra linjeparametrar, hur påverkas svarstiden?
Svarstiden eller med andra ord renderingstiden påverkar på olika sätt beroende på vilken
webbläsare man väljer att rendera i. I detta experiment testades Google Chrome, Mozilla
Firefox och Safari och man kan sammanfatta det kort. Google Chromes renderingstider
påverkar av hur många kurvor/linjer och objekt innehåller men är också den snabbaste
webbläsaren i längden. Mozilla Firefoxs renderingstider påverkar av hur många lager en bild
består av och är den webbläsare som har den längsta renderingstiden. Safari ligger emellan
Mozilla och Chrome men håller jämnast renderingstider.
Ett objekts renderingstid påverkas inte av vilken färg, opacity eller border objektet har utav
av antalet kurvor/linjer eller antalet lager en bild har. Ett lager uppstår när en bild ändrar
färg eller får en ny startpunkt, exempelvis en boll har endast en startpunkt eftersom att det
är en cirkel.
6.2
Diskussion
Vad som gör detta projekt unikt från de liknande projekten som tagits upp i bakgrunden är
att det är olika objekt som testas vilket gör att man kan få en bättre förståelse av vad de olika
webbläsarna är bra på men också att man utför projektet i ett fler tal webbläsare, också hur
ett Canvas objekt presterar samt att se varför Canvas ligger steget efter andra format på
webben. Efter att ha gjort ett sort antal mätningar förstår man varför man väljer andra
filformat före Canvas. Man får en bättre förståelse av varför Canvas är så pass långsamt och
vad webbläsarens renderingsmotor är bra på. Det unika med projektet är inte bara
mätningarna i olika webbläsare för att sammanfatta ett resultat för varje webbläsare, men
även att andra projekt som linkar detta använder sig av olika algoritmer för att ändra
uppbyggnaden av Canvas objekten. Vad dessa algoritmer exakt gör är att de ersätter ett antal
linjer/kurvor i en bild för att korta ner på resurser som krävs. Detta kan leda till kortare
renderingstider men ger ofta ett sämre resultat när de gäller bildkvalitet. Detta är inget som
görs i detta projekt, här är fokuseringen mer på tre olika objekt som är uppbyggda på olika
sätt, alltså att inget är likt de andra men också att inga algoritmer används för att ändra i
objekten.
Vad som får mig att tro att dessa mätningsvärden och analyser är trovärdiga är på grund av
att jag har används mig av ett stort antal iterationer för varje test (1000) vilket minskar
chansen för att spikes ska påverka resultatet. En annan sak som gör analysen trovärdig är
användningen av standardavvikelsen, den gör så att sannolikheten av nästa mätning
kommer till 98% chans hamna inom just den tillagda standardavvikelsen enligt 68–95–99.7
rule, Wikipedia. Varje graf i detta projekt använder sig av en standardavvikelse multiplicerat
med tre vilket ökar chansen till 98% som nämndes ovan.
Vad jag anser om detta projekt och vad det har för nytta inom olika arbeten finner jag
intressant, arbetsbranschen som har nytta av informationen som tas upp i detta projekt är
25
inte jättestor, men för personer som skapar hemsidor kan det vara intressant att veta hur
Canvas fungerar och i vilken webbläsare just de objekt man har tänkt använda sig av passar
in bäst. Informationen om slutsatserna som tas fram i projektet är något en person som
arbetar inom webbutveckling kan dra nytta av.
Olika etiker som används inom detta projekt och inom experimentet är att inte använda sig
av något som kan kopplas till en unik person. Ingen känslig information tas upp samt inga
testpersoner, dels för att jag inte direkt ansåg dra nytta av testpersoner på grund av att
testerna utför på en hårdvara men endast en person som styr vilket blir mig själv. Det enda
som undersökningen kräver är kunskap inom webbutveckling samt en utrustning för att
klara av att göra tester. Jag stävade också efter att uppnå upprepningsbarhet, alltså att vilken
annan person kan utföra exakt samma tester. Kod, resultat samt utrustning anges i
dokumentet.
6.3
Framtida arbete
Nästa steg som man kan ta detta projekt till är via att utöka hypotesen, man kan tilläga att
vid ändring av lager inom en bild kan man minska renderingstiden av ett Canvas objekt. Vad
jag menar med det är att via illustrator/photoshop sätta ihop olika lager i en bild som
använder sig av samma färger för att kunna minska antalet paths vilket kan leda till
minskade renderingstider inom webbläsaren. Om man kan minska antalet lager i ett objekt
minskas också antalet paths. Detta skulle kunna vara nästa del i just detta projekt, alltså en
kortsiktig lösning för att förbättra renderingstiderna.
Vad som skulle göra Canvas till ett bättre sätt att förmedla bilder via är ifall dagens
webbläsare förbättrar sina renderingsmotorer, för tillfället presterar Canvas inte lika bra. Att
kunna ändra bilder direkt på webben är något som skulle kunna användas effektivt men att
använda sig av färdiga bilder så som jpg och png är det bara att ladda bilden när man
kommer in på sin webbsida vilket har bättre laddningstider än vad Canvas har
renderingstider. Detta är något som jag ser som en långsiktig lösning för Canvas i framtiden,
att förbättra renderingsmotorerna inom webbläsarna.
26
Referenser
Ahmadi, N., Jazayeri, M. & Repenning, A. (2012) Performance Evaluation of User-created
Open-web Games. Proceedings of the 27th Annual ACM Symposium on Applied Computing.
SAC ’12. New York, NY, USA, ACM. s. 730–732.
Anon (n.d.) HGustavs/SVG-Converter-2014. GitHub. Tillgänglig på Internet:
https://github.com/HGustavs/SVG-Converter-2014.
Anon (2015) 68–95–99.7 rule. Wikipedia, the free encyclopedia. Tillgänglig på Internet:
http://en.wikipedia.org/w/index.php?title=68%E2%80%9395%E2%80%9399.7_rule&oldid
=659779336.
Buck, I., Humphreys, G. & Hanrahan, P. (2000) Tracking graphics state for networked
rendering. Proceedings of the ACM SIGGRAPH/EUROGRAPHICS workshop on Graphics
hardware. ACM. s. 87–95.
Chi, D. & Liu, H. (2014) A details enhancement rendering method for pointillism. Image and
Signal Processing (CISP), 2014 7th International Congress on. IEEE. s. 442–446.
Heok, T.K. & Daman, D. (2004) A review on level of detail. Computer Graphics, Imaging
and Visualization, 2004. CGIV 2004. Proceedings. International Conference on. IEEE. s.
70–75.
Jan Skansholm, Java direkt med Swing. (2013) (6.uppl.).
Johnson, D.W. & Jankun-Kelly, T.J. (2008) A Scalability Study of Web-native Information
Visualization. Proceedings of Graphics Interface 2008. GI ’08. Toronto, Ont., Canada,
Canada, Canadian Information Processing Society. s. 163–168.
McAnlis, C., Lubbers, P., Jones, B., Mazur, A., et al. (2014) HTML5 Game Development
Insights. Apress.
Meek,
A.
(2014)
The
Pink
Golf
Ball.
Tillgänglig
på
Internet:
https://www.flickr.com/photos/adammeek/14657862889/ [Hämtad February 17, 2015].
Mehrara, M., Hsu, P.-C., Samadi, M. & Mahlke, S. (2011) Dynamic parallelization of
JavaScript applications using an ultra-lightweight speculation mechanism. 2011 IEEE 17th
International Symposium on High Performance Computer Architecture (HPCA). February
s. 87–98.
Mikkonen, T. & Taivalsaari, A. (2009) Creating a Mobile Web Application Platform: The
Lively Kernel Experiences. Proceedings of the 2009 ACM Symposium on Applied
Computing. SAC ’09. New York, NY, USA, ACM. s. 177–184.
27
Mowery, K. & Shacham, H. (2012) Pixel perfect: Fingerprinting canvas in HTML5.
Proceedings of W2SP.
Pinto, E., Amador, G. & Gomes, A. (2010) A graphics library for delivering 3D contents on
Web browsers. 2010 6th International Conference on Digital Content, Multimedia
Technology and its Applications (IDC). August s. 109–114.
Rajamony, R. & Elnozahy, E. (Mootaz) (2001) Measuring Client-Perceived Response Time
on the WWW. USITS. s.
Shiraishi, M. & Yamaguchi, Y. (2000) An algorithm for automatic painterly rendering based
on local source image approximation. Proceedings of the 1st international symposium on
Non-photorealistic animation and rendering. ACM. s. 53–58.
Thummalapenta, S., Devaki, P., Sinha, S., Chandra, S., et al. (2013) Efficient and Changeresilient Test Automation: An Industrial Case Study. Proceedings of the 2013 International
Conference on Software Engineering. ICSE ’13. Piscataway, NJ, USA, IEEE Press. s. 1002–
1011.
Wei, J. & Xu, C.-Z. (2011) Measuring Client-Perceived Pageview Response Time of Internet
Services. IEEE Transactions on Parallel and Distributed Systems. 22 (5), s. 773–785.
28
Appendix A -
CSS
@charset "utf-­‐8"; /* CSS Document */ body{ background-­‐color: #607D8B; margin:0 auto; } .wrapper{ width: 1230px; height: 250px; margin: 20px 25px 20px 25px; margin-­‐left: auto; margin-­‐right: auto; } .titel{ height: auto; width: 600px; margin-­‐left: auto; margin-­‐right: auto; background-­‐color: #455A64; } .knapp{ text-­‐align: center; margin-­‐bottom: 20px; } .nextsite{ height: auto; width: 200px; background-­‐color: #455A64; margin-­‐left: auto; margin-­‐right: auto; 29
text-­‐align: center; } .paintbutton{ height: 45px; width: 75px; font-­‐size: 25px; background-­‐color: #B6B6B6 } h2{ color: #CFD8DC; font-­‐family: Georgia, Times, Palatino, serif; font-­‐size: 35px; } h3{ color: #CFD8DC; font-­‐family: Georgia, Times, Palatino, serif; font-­‐size: 30px; } h3:hover{ color: #795548; } 30
Appendix B -
HTML
<!DOCTYPE html> <html> <head> <meta charset="UTF-­‐8"> <link rel="stylesheet" type="text/css" href="sidomall.css"> <script type="text/javascript" src="canvas.js"></script> <title>Filips Examensarbete</title> </head> <body> <div class="titel"> <h2>Filips Examensarbete våren 2015</h2> </div> <div class="wrapper"> <canvas id="myCanvas" width="1000" height="500"> </canvas> </div> <div class="knapp"> <select id="menu"> <option value="1">Symboler</option> <option value="2">Orm</option> <option value="3">test</option> </select> <input onclick="option()" type="submit"value="Paint"></input> <input onclick="clearcanvas()" type="reset"value="Clear"></input> <input onclick="downloadfile()" type="submit"value="Download"</input> </div> </body> </html> 31
Appendix C -
Javascript
function option(){ var x = document.getElementById("menu").selectedIndex; // alert(document.getElementsByTagName("option")[x].text); if(document.getElementsByTagName("option")[x].value==1){ initcanvas(); } else if (document.getElementsByTagName("option")[x].value==2){ drawsnake(); } else { } } var ctx; function segment(kind,x1,y1,x2,y2,x3,y3) { this.kind = kind; this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; this.x3 = x3; this.y3 = y3; } function path(fgcolor, stcolor,lineW, gAlpha) { this.fgcolor = fgcolor; this.stcolor = stcolor; this.lineW = lineW; this.gAlpha = gAlpha; this.segments = new Array(); this.draw = function() { 32
ctx.beginPath(); ctx.fillStyle=this.fgcolor; ctx.strokeStyle=this.stcolor; ctx.lineWidth=this.lineW; ctx.globalAlpha=this.gAlpha; for(i=0;i<this.segments.length;i++){ var seg=this.segments[i]; if(seg.kind==1){ ctx.moveTo(seg.x1,seg.y1); }else if(seg.kind==2){ ctx.lineTo(seg.x1,seg.y1); }else if(seg.kind==3){ ctx.bezierCurveTo(seg.x1,seg.y1,seg.x2,seg.y2,seg.x3,seg.y3); } } ctx.fill(); ctx.stroke(); } } function initcanvas(){ var x = document.getElementById("menu").selectedIndex; timeArray = []; startTime = performance.now(); var canvas=document.getElementById("myCanvas"); canvas.width= window.innerWidth; canvas.height=window.innerHeight; var c = canvas.getContext('2d'); if (canvas.getContext) { ctx = canvas.getContext("2d"); if(document.getElementsByTagName("option")[x].value==1){ setupcrocodile(); }else if (document.getElementsByTagName("option")[x].value==2){ setuptent(); }else { 33
setuplion(); } } endTime = performance.now(); } Appendix D -
Svarstider
var oldtime=0; var iterations=0; var sumTime=0; var a,b,c,d,e,f,g,h,j,k,l,m,n,o,p,q,r,s,t,u,v,w,y,z; function drawCroc() { var benchmarktid=performance.now()-­‐oldtime; oldtime=performance.now(); sumTime += benchmarktid; timeArray.push("6 objekt -­‐ Iteration " + iterations + " tog " + sumTime+ " Ms Totalt och "+ benchmarktid + " Ms per iternation" + "\n"); ctx.save(); for(var i=0;i<5;i++){ ctx.translate(115,0); p.draw(); } console.log(iterations); ctx.restore(); iterations++; if(iterations<100) { window.requestAnimationFrame(drawCroc); } 34
} Appendix E -
Iterationer
if(iterations<1000) { window.requestAnimationFrame(drawCroc); } Appendix F function downloadfile(){ var string = ""; for(var c=0;c<timeArray.length;c++){ string += timeArray[c]; } var a = window.document.createElement('a'); a.href = window.URL.createObjectURL(new Blob([string], {type: 'text/csv'})); a.download = 'Examensarbete-­‐tider-­‐' + date + '.csv'; document.body.appendChild(a); a.click(); document.removeChild(a); } 35
Appendix G -
Lösning av kastad teknik
Lösning vid sex objekt/boxar.
<div class="wrapper"> <div class="bild1"> <canvas id="myCanvas1" width="400" height="250"> </canvas> </div> <div class="bild2"> <canvas id="myCanvas2" width="400" height="250"> </canvas> </div> <div class="bild3"> <canvas id="myCanvas3" width="400" height="250"> </canvas> </div> </div> <div class="wrapper"> <div class="bild1"> <canvas id="myCanvas4" width="400" height="250"> </canvas> </div> <div class="bild2"> <canvas id="myCanvas5" width="400" height="250"> </canvas> 36
</div> <div class="bild3"> <canvas id="myCanvas6" width="400" height="250"> </canvas> </div> </div> Lösning vid tre objekt/boxar.
<div class="wrapper"> <div class="bild1"> <canvas id="myCanvas1" width="400" height="250"> </canvas> </div> <div class="bild2"> <canvas id="myCanvas2" width="400" height="250"> </canvas> </div> <div class="bild3"> <canvas id="myCanvas3" width="400" height="250"> </canvas> </div> </div> Lösning vid ett objekt.
<div class="wrapper"> <div class="solobild"> <canvas id="myCanvas" width="400" height="250"> </canvas> </div> </div> 37
Appendix H -
Pilotstudie Graf 1
Del 1 – Mätning Chrome 6 objekt 50 gånger i MS
38
Del 2 - Mätning Chrome 1 objekt 50 gånger i MS
39