在开始绘图之前添加此行
context.translate(0.5, 0.5);
如果您使用整数作为位置,线条将非常锋利。
特别是在您提供的代码中:
context.translate(0.5, 0.5);
....
context.moveTo(0, (i * b / 10)|0); /// y is rounded to integer
或代替翻译:
context.moveTo(0.5, (i * b / 10)|0);
使用画布,像素的中心不在屏幕上的绝对像素上。因此,您需要将其偏移半个像素以使其与实际像素对齐,否则像素将被亚像素化,从而导致抗锯齿线。
您也可以将 0.5 添加到每个位置而不是进行翻译,但翻译更简单。网格完成后翻译回来。
演示快照
您的代码中还有第二个问题:您正在抚摸线然后继续添加到相同的路径,这将累积之前添加的所有行并降低性能。
同样,beginPath()
如果所有线条都具有相同的特征(颜色、粗细等),也不需要为每条线条使用。您也不需要对每条线条进行描边。
只需将所有带有moveTo
and的行添加lineTo
到 Path (moveTo
将确保这些行没有连接),当循环完成时,然后执行 common stroke()
。
在线演示在这里
/// translate 0.5
ctx.translate(0.5, 0.5);
/// create grid
ctx.beginPath();
/// add all grid lines to Path
for(;pos < width; pos += step) {
ctx.moveTo(pos, 0);
ctx.lineTo(pos, height);
ctx.moveTo(0, pos);
ctx.lineTo(width, pos);
}
/// common stroke = higher performance
ctx.stroke();