Rendering Performance

Device Refresh Rates



Device Refresh Rates



The Pixel Pipeline



The Pixel Pipeline



The Pixel Pipeline



The Pixel Pipeline



The Pixel Pipeline



The Pixel Pipeline



The Pixel Pipeline



The Pixel Pipeline



The Pixel Pipeline






csstriggers.com



Javascript Optimization
Javascript Optimization


Use requestAnimationFrame for visual changes
Javascript Optimization


Use requestAnimationFrame for visual changes
const adiv = document.getElementById('mydiv');
let leftpos = 0;
setInterval(() => {
leftpos += 5;
adiv.style.left = leftpos + 'px';
}, 50)
Javascript Optimization


const adiv = document.getElementById('mydiv');
let leftpos = 0;
let prevMoveTime = 0;
function move(time) => {
leftpos += 5;
adiv.style.left = leftpos + 'px';
requestAnimationFrame(move);
}
requestAnimationFrame(move);
Javascript Optimization


Use Web Workers

Javascript Optimization


Use Web Workers
or not

Javascript Optimization


const taskList = breakBigTaskIntoMicroTasks(largeList);
requestAnimationFrame(processTaskList);
function processTaskList(taskStartTime) {
let taskFinishTime;
do {
// Assume the next task is pushed onto a stack.
const nextTask = taskList.pop();
// Process nextTask.
processTask(nextTask);
// Go again if there’s enough time to do the next task.
taskFinishTime = window.performance.now();
} while (taskFinishTime - taskStartTime < 3);
if (taskList.length > 0) {
requestAnimationFrame(processTaskList);
}
}
Javascript Optimization



Javascript Optimization



Style Optimization



Style Optimization



Style Optimization



Style Optimization


<div class="table">
<div class="row header">
<span class="blue">
Title
</span>
</div>
<div class="row body">
<span class="blue">
Body text
</span>
</div>
</div>
.table {
font-size: 12px;
border: 1px solid black;
}
.row, .row.header {
color: red;
}
.header {
font-size: 15px;
}
.body {
text-decoration: underline;
}
.blue {
color: blue;
}
Style Optimization


Simplify CSS selectors
Style Optimization


Simplify CSS selectors
.box:nth-last-child(-n+1) .title {
/* styles */
}
Style Optimization


Simplify CSS selectors
.box:nth-last-child(-n+1) .title {
/* styles */
}
.final-box-title {
/* styles */
}
Style Optimization


Simplify CSS selectors
.box:nth-last-child(-n+1) .title {
/* styles */
}
.final-box-title {
/* styles */
}
BEM
Style Optimization


Reduce number of elements to apply styles to
Style Optimization



Layout Optimization



Layout Optimization



Layout Optimization


Avoid layout changes
Layout Optimization


Avoid layout changes
.box {
width: 20px;
height: 20px;
}
/**
* Changing width and height
* triggers layout.
*/
.box--expanded {
width: 200px;
height: 350px;
}
Layout Optimization


Avoid layout changes
.box {
width: 20px;
height: 20px;
}
/**
* Changing width and height
* triggers layout.
*/
.box--expanded {
width: 200px;
height: 350px;
}
Layout Optimization


Use flexbox
Layout Optimization


Use flexbox


Layout Optimization


Use flexbox

Layout Optimization


Lookout for layout thrashing
Paint Optimization




Paint Optimization


Avoid triggering layout
Paint Optimization


Avoid triggering layout
Paint Optimization


Avoid triggering layout

Paint Optimization


Avoid non-geometric changes
-
Background
-
Text color
-
Shadows
Paint Optimization


Promote elements that move or change
Paint Optimization


Promote elements that move or change
.moving-element {
will-change: transform;
}
Paint Optimization


Simplify paint complexity

Compositor



Compositor



TL;DR



TL;DR


-
Timeout on the setTimeout
TL;DR


-
Timeout on the setTimeout
-
Web Workers - friends not food
TL;DR


-
Timeout on the setTimeout
-
Web Workers - friends not food
-
KCSS - keep css simple stupid
TL;DR


Timeout on the setTimeout
Web Workers - friends not food
KCSS - keep css simple stupid
Show some flex with flex box
TL;DR


-
Timeout on the setTimeout
-
Web Workers - friends not food
-
KCSS - keep css simple stupid
-
Show some flex with flex box
-
Transformation and opacity
Rendering Performance
By pat310
Rendering Performance
- 1,255