HTML5 Canvas замедляется с каждым ударом и очищается - PullRequest
9 голосов
/ 05 марта 2012

Я поиграл с HTML5 Canvas и заметил кое-что, что я не смог найти в Интернете для разрешения. Вот простой код, с которым я играю

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
</head>
<body>
    <canvas id="canvas" style="border: 1px solid;" width="200" height="200"></canvas>
    <br />
    <button id="draw">draw</button>
    <button id="clear">clear</button>
</body>
</html>

<script type="text/javascript">
    (function () {
        var canvas = document.getElementById("canvas");
        var context = canvas.getContext("2d");
        $("#draw").bind("click", function () {
            for (var i = 0; i < 200; i++) {
                context.moveTo(0, i);
                context.lineTo(100, 100);
                context.stroke();
            }
        });
        $("#clear").bind("click", function () {
            context.clearRect(0, 0, 200, 200);
        });
    } ());
</script>

Каждый раз, когда я нажимаю на рисование, скорость, с которой он завершается, кажется, экспоненциально замедляется. Кто-нибудь может знать, почему это происходит?

Больше всего тормозит через IE. Похоже, что Chrome завершает его быстрее с каждым щелчком, но вы все равно можете заметить снижение скорости.

1 Ответ

16 голосов
/ 05 марта 2012

Элемент <canvas> отслеживает текущий путь (т.е. набор точек, линий и кривых). canvas.moveTo, canvas.lineTo и canvas.stroke все работают по текущему пути. Каждый раз, когда вы звоните canvas.moveTo или canvas.lineTo, вы добавляете к текущему пути. Поскольку путь становится все более и более сложным, рисование становится все медленнее и медленнее.

Вы можете очистить путь, вызвав canvas.beginPath(). Выполнение этого в начале функции рисования должно избавить от замедления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...