const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
function draw(timestamp) {
const x = timestamp / 10 % 600;
ctx.clearRect(0, 0, 600, 50);
ctx.fillRect(x, 0, 50, 50);
window.requestAnimationFrame(draw);
}
window.requestAnimationFrame(draw);
const canvas = document.createElement('canvas')
const ctx = canvas.getContext('2d')
const imageData = ctx.createImageData(1000, 1000)
const uint8Array = imageData.data
const dataView = new DataView(uint8Array.buffer)
for(let i = 0; i < uint8Array.length; i = i + 4) {
uint8Array[i] = 128
uint8Array[i + 1] = 128
uint8Array[i + 2] = 128
uint8Array[i + 3] = 255
}
for(let i = 0; i < uint8Array.length; i = i + 4) {
dataView.setUint32(i, 2155905279)
}
// https://jsperf.com/canvas-8bit-vs-32bit/1
const maskCanvas = document.createElement('canvas')
const maskCtx = maskCanvas.getContext('2d')
const imageData = maskCtx.getImageData(0, 0, maskImage.width, maskImage.height)
for (let i = 0; i < pixelData.length; i++) {
`(대충 시각화를 해주는 코드)`
}
maskCtx.putImageData(imageData, 0, 0)
const preRenderedImage = document.createElement('img')
preRenderedImage.src = maskCanvas.toDataURL('image/png')
const targetCanvas = document.getElementById('target')
const targetCtx = targetCanvas.getContext('2d')
targetCtx.drawImage(preRenderedImage, 0, 0)
points.forEach(point => {
ctx.beginPath();
ctx.arc(point.x, point.y, pointSize, 0, 2 * Math.PI);
ctx.fill();
});
const indexedPoints = new KDBush(points);
indexedPoints.range(
bounds.x - pointSize * 2,
bounds.y - pointSize * 2,
bounds.x + bounds.width + pointSize * 2,
bounds.y + bounds.height + pointSize * 2
)
.forEach(idx => {
const point = points[idx];
ctx.beginPath();
ctx.arc(point.x, point.y, pointSize, 0, 2 * Math.PI);
ctx.fill();
});
console.time('HTMLCanvasElement')
for(let i = 0; i < 100000; i++) {
targetCtx.drawImage(preRenderedCanvas, 0, 0)
}
console.timeEnd('HTMLCanvasElement') // ~380ms
createImageBitmap(preRenderedCanvas)
.then(imageBitmap => {
console.time('ImageBitmap')
for(let i = 0; i < 100000; i++) {
targetCtx.drawImage(imageBitmap, 0, 0)
}
console.timeEnd('ImageBitmap') // ~280ms
})
// Main Thread
const targetCanvas = document.getElementById("target")
const offscreen = targetCanvas.transferControlToOffscreen()
worker.postMessage({ canvas: offscreen },[offscreen])
// Worker
self.onmessage = event => {
self.mainCanvas = event.data.canvas
}
const mainCtx = self.mainCanvas.getContext("2d")
mainCtx.drawImage(preRenderedImage, 0, 0)
Live Example: https://scope.lunit.io/