评估 SVG 过滤器性能(Alphamap)
Evaluating SVG Filter Performance (Alphamap)
是否有已知的工具来评估 SVG 滤镜性能?我正在使用以下 SVG 节点生成 alphamap,但在性能方面有些挣扎。
<feColorMatrix result="alphaOut" in="SourceGraphic" type="matrix" values="0 0 0 0 1, 0 0 0 0 1, 0 0 0 0 1, 0 0 0 1 0" />
有没有办法量化 SVG 滤镜的渲染时间?或者,有人知道使用 SVG 滤镜提取 alpha 信息的更好方法吗?
衡量绩效的想法取自https://developers.google.com/web/updates/2012/07/How-to-measure-browser-graphics-performance
function draw(x) {
var g = document.createElementNS("http://www.w3.org/2000/svg", "g")
g.id = "canvas"
canvas.parentNode.replaceChild(g, canvas)
for (var i = 1; i < x; i++) {
var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect")
rect.setAttribute("width", "100")
rect.setAttribute("height", "100")
rect.setAttribute("filter", "url(#" + filter + ")")
rect.setAttribute("fill", "rgba(128,128,128,0.8)")
rect.setAttribute("x", Math.random() * 300)
rect.setAttribute("y", Math.random() * 300)
g.appendChild(rect)
}
}
var filter = "f1"
var t, previousTime;
var drawLoad = 1;
var slowCount = 0;
var maxSlow = 10;
// Note, you might need to polyfill performance.now and requestAnimationFrame
t = previousTime = performance.now();
var tick = function() {
var maximumFrameTime = 1000 / 30; // 30 FPS
t = performance.now();
var elapsed = t - previousTime;
previousTime = t;
if (elapsed < maximumFrameTime || slowCount < maxSlow) {
if (elapsed < maximumFrameTime) {
drawLoad += 10;
} else {
slowCount++;
}
draw(drawLoad);
requestAnimationFrame(tick);
} else {
// found maximum sustainable load at 30 FPS
document.getElementById('res').innerHTML = ("could draw " + (drawLoad) + " in " +
maximumFrameTime + " ms");
}
};
requestAnimationFrame(tick);
svg {
background: beige
}
<button onclick="filter='f1';drawLoad=1;slowCount=0;requestAnimationFrame(tick)">test filter 1</button>
<button onclick="filter='f2';drawLoad=1;slowCount=0;requestAnimationFrame(tick)">test filter 2</button>
<div id="res"></div>
<svg width="400" height="400">
<filter id="f1">
<feColorMatrix result="alphaOut" in="SourceGraphic" type="matrix" values="0 0 0 0 1
0 0 0 0 1
0 0 0 0 1
0 0 0 1 0" />
</filter>
<filter id="f2">
<feMerge>
<feMergeNode dx="1" dy="1" in="SourceAlpha" />
</feMerge>
</filter>
<g id="canvas">
</g>
</svg>
是否有已知的工具来评估 SVG 滤镜性能?我正在使用以下 SVG 节点生成 alphamap,但在性能方面有些挣扎。
<feColorMatrix result="alphaOut" in="SourceGraphic" type="matrix" values="0 0 0 0 1, 0 0 0 0 1, 0 0 0 0 1, 0 0 0 1 0" />
有没有办法量化 SVG 滤镜的渲染时间?或者,有人知道使用 SVG 滤镜提取 alpha 信息的更好方法吗?
衡量绩效的想法取自https://developers.google.com/web/updates/2012/07/How-to-measure-browser-graphics-performance
function draw(x) {
var g = document.createElementNS("http://www.w3.org/2000/svg", "g")
g.id = "canvas"
canvas.parentNode.replaceChild(g, canvas)
for (var i = 1; i < x; i++) {
var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect")
rect.setAttribute("width", "100")
rect.setAttribute("height", "100")
rect.setAttribute("filter", "url(#" + filter + ")")
rect.setAttribute("fill", "rgba(128,128,128,0.8)")
rect.setAttribute("x", Math.random() * 300)
rect.setAttribute("y", Math.random() * 300)
g.appendChild(rect)
}
}
var filter = "f1"
var t, previousTime;
var drawLoad = 1;
var slowCount = 0;
var maxSlow = 10;
// Note, you might need to polyfill performance.now and requestAnimationFrame
t = previousTime = performance.now();
var tick = function() {
var maximumFrameTime = 1000 / 30; // 30 FPS
t = performance.now();
var elapsed = t - previousTime;
previousTime = t;
if (elapsed < maximumFrameTime || slowCount < maxSlow) {
if (elapsed < maximumFrameTime) {
drawLoad += 10;
} else {
slowCount++;
}
draw(drawLoad);
requestAnimationFrame(tick);
} else {
// found maximum sustainable load at 30 FPS
document.getElementById('res').innerHTML = ("could draw " + (drawLoad) + " in " +
maximumFrameTime + " ms");
}
};
requestAnimationFrame(tick);
svg {
background: beige
}
<button onclick="filter='f1';drawLoad=1;slowCount=0;requestAnimationFrame(tick)">test filter 1</button>
<button onclick="filter='f2';drawLoad=1;slowCount=0;requestAnimationFrame(tick)">test filter 2</button>
<div id="res"></div>
<svg width="400" height="400">
<filter id="f1">
<feColorMatrix result="alphaOut" in="SourceGraphic" type="matrix" values="0 0 0 0 1
0 0 0 0 1
0 0 0 0 1
0 0 0 1 0" />
</filter>
<filter id="f2">
<feMerge>
<feMergeNode dx="1" dy="1" in="SourceAlpha" />
</feMerge>
</filter>
<g id="canvas">
</g>
</svg>