HTML5, canvas: 一些线宽太窄然后消失
HTML5, canvas: some linewidth too narrow and then disappear
愚蠢简单的canvas用法:
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.scale(100000, 100000);
ctx.lineWidth = 0.00001;
ctx.moveTo(0, 0);
ctx.lineTo(200, 100);
ctx.stroke();
<canvas id="myCanvas" width="300" height="200" style="border:1px solid #d3d3d3;"></canvas>
不显示当前线段。
如果我改成这个:
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.scale(10000, 10000);
ctx.lineWidth = 0.0001;
ctx.moveTo(0, 0);
ctx.lineTo(200, 100);
ctx.stroke();
<canvas id="myCanvas" width="300" height="200" style="border:1px solid #d3d3d3;"></canvas>
线段会显示吗?
为什么会这样。这很烦人。感谢您的帮助!
这是由 Chrome 使用的 GPU 渲染器中的错误引起的。
我们可以通过使用 willReadFrequently
标志初始化您的上下文来确认它只是 GPU 管道中的一个错误,但这不是一个合适的解决方案(因为您需要 GPU 加速可用时)。
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d", { willReadFrequently: true });
ctx.scale(100000, 100000);
ctx.lineWidth = 0.00001;
ctx.moveTo(0, 0);
ctx.lineTo(200, 100);
ctx.stroke();
<canvas id="myCanvas" width="300" height="200" style="border:1px solid #d3d3d3;"></canvas>
所以,open an issue against Chromium, you can point to them that apparently this CL 引入这个问题会很棒,因此它是一个倒退。
当你在那里的时候,你也可以打开一个 against WebKit,它甚至没有通过 x10,000 规模测试。
不过老实说,你是在自找麻烦。
这种“舍入”错误经常在各种引擎中出现和消失,不仅如此明显,有时仅在执行特定曲线等时才会出现。
所以最好是坚持“标准”尺度,如果你真的需要那么远,然后从 JS 自己做尺度:
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
const scale = 100_000;
ctx.moveTo(0, 0);
ctx.lineTo(200 * scale, 100 * scale);
ctx.stroke();
<canvas id="myCanvas" width="300" height="200" style="border:1px solid #d3d3d3;"></canvas>
愚蠢简单的canvas用法:
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.scale(100000, 100000);
ctx.lineWidth = 0.00001;
ctx.moveTo(0, 0);
ctx.lineTo(200, 100);
ctx.stroke();
<canvas id="myCanvas" width="300" height="200" style="border:1px solid #d3d3d3;"></canvas>
不显示当前线段。 如果我改成这个:
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.scale(10000, 10000);
ctx.lineWidth = 0.0001;
ctx.moveTo(0, 0);
ctx.lineTo(200, 100);
ctx.stroke();
<canvas id="myCanvas" width="300" height="200" style="border:1px solid #d3d3d3;"></canvas>
线段会显示吗? 为什么会这样。这很烦人。感谢您的帮助!
这是由 Chrome 使用的 GPU 渲染器中的错误引起的。
我们可以通过使用 willReadFrequently
标志初始化您的上下文来确认它只是 GPU 管道中的一个错误,但这不是一个合适的解决方案(因为您需要 GPU 加速可用时)。
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d", { willReadFrequently: true });
ctx.scale(100000, 100000);
ctx.lineWidth = 0.00001;
ctx.moveTo(0, 0);
ctx.lineTo(200, 100);
ctx.stroke();
<canvas id="myCanvas" width="300" height="200" style="border:1px solid #d3d3d3;"></canvas>
所以,open an issue against Chromium, you can point to them that apparently this CL 引入这个问题会很棒,因此它是一个倒退。
当你在那里的时候,你也可以打开一个 against WebKit,它甚至没有通过 x10,000 规模测试。
不过老实说,你是在自找麻烦。
这种“舍入”错误经常在各种引擎中出现和消失,不仅如此明显,有时仅在执行特定曲线等时才会出现。
所以最好是坚持“标准”尺度,如果你真的需要那么远,然后从 JS 自己做尺度:
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
const scale = 100_000;
ctx.moveTo(0, 0);
ctx.lineTo(200 * scale, 100 * scale);
ctx.stroke();
<canvas id="myCanvas" width="300" height="200" style="border:1px solid #d3d3d3;"></canvas>