debugging 如何解决在使用ARM处理器的设备上的Safari上渲染渐变图形的问题?

0s0u357o  于 2023-01-05  发布在  其他
关注(0)|答案(1)|浏览(126)

当尝试显示一个填充了渐变色的图形并旋转它时,出现了一个以水平条纹形式显示的问题。这可以在所附的屏幕截图中看到。此外,代码可以在下面的链接或此消息中找到。

https://codepen.io/borodin-the-sans/pen/ZEjpJaB
该问题仅在移动的设备或Apple硅处理器上的Safari浏览器中显示。

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body style="background-color: black">
<canvas id="canvas"></canvas>
<script>
    const canvas = document.getElementById("canvas");
    const ctx = canvas.getContext("2d");

    let rotation = 1.3;

    function draw() {
        ctx.save();

        ctx.translate(256, 256);
        ctx.rotate(rotation);

        const gradient = ctx.createLinearGradient(-128, -128, 256, 256);
        gradient.addColorStop(0, 'red');
        gradient.addColorStop(1, 'blue');
        ctx.fillStyle = gradient;

        ctx.beginPath();
        ctx.moveTo(128, 0);
        ctx.lineTo(0, 128);
        ctx.lineTo(-128, 0);
        ctx.lineTo(0, -128);
        ctx.closePath();
        ctx.fill();

        ctx.restore();
    }

    canvas.width = canvas.height = 512;
    draw();
</script>
</body>
</html>

如果我改变多边形的旋转度,或者使用fillRect,或者用更简单的颜色替换渐变,问题就会消失。
但是我需要在更复杂的渐变多边形中使用旋转动画。我不希望在多边形的顶部看到水平条纹。
我可以计算出这个伪影的大小和位置并清除它。但是如果我在画布上使用任何背景,它将变得无法忍受。

b5lpy0ml

b5lpy0ml1#

我找到了一个在我的情况下有效的解决方案,有必要在画布外绘制长度至少为1像素的线条,这样伪像就不会引人注意。

ctx.moveTo(0, -1);
ctx.lineTo(0, 0);

完整代码:
x一个一个一个一个x一个一个二个一个x一个一个三个一个

相关问题