Оптимизация рисования линий на станке для мобильных устройств

Я пытаюсь создать простое приложение, в котором пользователь может рисовать линии, перетаскивая мышь или используя жесты на экране своего сенсорного устройства.

На моем настольном компьютере это прекрасно, но на моем телефоне это очень медленно и рывками. Дело не в том, что производительность со временем ухудшается, это сразу заметно.

Я использую станки, и я расширил форму. При движениях мыши он записывает точки, а по тикам рисует их. Для параметра autoClear сцены установлено значение false, и графический объект очищается перед отрисовкой, поэтому он не перерисовывает ничего из предыдущего тика.

(function (window) {
    function LineDrawer() {
        this.initialize();
    }
    //Inheritance from Container
    LineDrawer.prototype = new createjs.Shape();
    LineDrawer.prototype.Shape_initialize = LineDrawer.prototype.initialize;
    LineDrawer.prototype.Shape_tick = LineDrawer.prototype._tick;

    LineDrawer.prototype.initialize = function () {
        //call to initialize() method from parent class 
        this.Shape_initialize();

        this.points = [];
        this.mouseMoveEventListener = $.proxy(this.onMouseMove, this);
    }
    LineDrawer.prototype._tick = function (e) {
        //call to _tick method from parent class 
        this.Shape_tick();

        var points = this.points;
        if (points.length > 0) {
            var graphics = this.graphics.clear()
                                .setStrokeStyle(3, 'round', 'round')
                                .beginStroke("#000000")
                                .moveTo(points[0].x, points[0].y)

            var pt;                
            for (var i = 1; i < points.length; i = i + 1) {
                pt = points[i];
                graphics.lineTo(pt.x, pt.y);
            }

            points.length = 0;
            if (typeof pt !== 'undefined') {
                points.push(new createjs.Point(pt.x, pt.y));
            }
        }
    }

    LineDrawer.prototype.onMouseDown = function (e) {
        this.points.push(new createjs.Point(e.stageX, e.stageY));
        this.parent.addEventListener("stagemousemove", this.mouseMoveEventListener);
    }

    LineDrawer.prototype.onMouseMove = function (e) {
        this.points.push(new createjs.Point(e.stageX, e.stageY));
    }

    LineDrawer.prototype.onMouseUp = function (e) {
        this.points.push(new createjs.Point(e.stageX, e.stageY));
        this.parent.removeEventListener("stagemousemove", this.mouseMoveEventListener);
    }

    window.LineDrawer = LineDrawer;
}(window));

Вот код для настройки сцены:

var stage,
    lineDrawer;

$(document).ready(function () {
    lineDrawer = new LineDrawer();

    var $canvas = $('#canvasMain');

    stage = new createjs.Stage($canvas[0]);
    createjs.Touch.enable(stage);
    stage.addChild(lineDrawer);
    stage.autoClear = false;

    stage.addEventListener("stagemousedown", $.proxy(lineDrawer.onMouseDown, lineDrawer));
    stage.addEventListener("stagemouseup", $.proxy(lineDrawer.onMouseUp, lineDrawer));

    createjs.Ticker.timingMode = createjs.Ticker.RAF;
    createjs.Ticker.addEventListener("tick", stage);
})

Вот скрипка для всего. Дополнительная информация: я использую jquery-1.8.3 и полифил RAF, это мои характеристики телефона< /а>. Я также попросил кого-то попробовать с гораздо лучшим телефоном Samsung с теми же результатами.

Хотя, по общему признанию, мой телефон находится в нижней части спектра, это не телефон-динозавр. Это Android 4.0+, и то, что я делаю, на самом деле не так уж сложно, насколько я могу судить. Я делаю что-то не так и/или могу ли я что-то исправить? Интересно, может быть, это проблема с событиями касания, а не со скоростью рисования.

РЕДАКТИРОВАТЬ: другим телефоном с запаздывающим рисунком был Samsung S3.


person Dat Ngo    schedule 07.03.2014    source источник


Ответы (1)


Отвечая на мой собственный вопрос.

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

Вторая часть вызывала наибольшее отставание. Интересно, что ошибки не было, поскольку индекс массива никогда не выходит за пределы из-за условия цикла for, поэтому я предполагаю, что просто невозможное условие for было очень медленным в браузерах Chrome для Android без сбоев.

person Dat Ngo    schedule 08.03.2014