2013-08-06 4 views
1

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

Что я могу сделать, чтобы оптимизировать скорость на этом немного больше, не теряя гладкости рисунка?

var stage; 
var input; 
var marker; 
var points = []; 

function initialize() { 
    stage = new Kinetic.Stage({ 
    container: 'container', 
     width: $(window).width(), 
     height: $(window).height() 
    }); 

    input = new Kinetic.Layer(); 
    stage.add(input); 
    marker = new Kinetic.Line({ 
     stroke: 'red', 
     strokeWidth: 16, 
     lineCap: 'round', 
     lineJoin: 'round' 
    }); 
    input.add(marker); 

    stage.on('mousedown touchstart', handleMouseDown); 
    stage.on('mouseup touchend', handleMouseUp); 
} 

function handleMouseDown() { 
    points = []; 
    stage.on('mousemove touchmove', handleMouseMove); 
} 

function handleMouseMove() { 
    points.push(stage.getPointerPosition()); 
    marker.setAttr('points', points); 
    input.draw(); 
} 

function handleMouseUp() { 
    stage.off('mousemove touchmove'); 
} 

ответ

1

Вы можете улучшить производительность за счет де связей жеребьёвка-х из mousemoves.

Поскольку mousemove выполняется часто и многократно, просто соберите точки в handleMouseMove.

function handleMouseMove() { 
    points.push(stage.getPointerPosition()); 
} 

Затем настройте таймер, чтобы сделать чертеж в виде партии.

Предпочтительно использовать requestAnimationFrame, но для некоторых мобильных вам, возможно, придется использовать SetTimeout

Это позволит значительно сократить количество дорогостоящих input.draw требуется.

// thank you Paul Irish for this RAF/setTimeout shim 

    window.requestAnimFrame = (function(callback) { 
     return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || 
     function(callback) { 
     window.setTimeout(callback, 1000/60); 
     }; 
    })(); 

// draw the points in a batch when RAF fires 

function batchDraw() { 
    marker.setAttr('points', points); 
    input.draw(); 
    requestAnimFrame(batchDraw); 
} 
+0

Это хорошая альтернатива, но разве это не устраняет непосредственную и «гладкость рисования»? – projeqht

+1

Я слышу вас, друг мой, но ... Я читал OP, говоря «Ускорение ...», «очень вяло», «оптимизируйте скорость». Эта схема кодирования поможет с потребностью в скорости, выбирая несколько дорогих ничьих в 1 эффективную ничью. Этот код не выполняет сглаживания строк, но он дает мобильному процессору больше времени для прослушивания mousemoves. Мобильный процессор может собирать больше точек данных и, следовательно, производить более плавный результат. У меня есть код, который сглаживает пути, разбивая точки, но мой опыт показывает, что эти вычисления сплайнов представляют свои собственные проблемы с производительностью на мобильных устройствах. – markE

+0

Я согласен, что это определенно сохранит некоторую вычислительную мощность, так как вызов handleMouseMove скорее всего облагается налогом. Одна из проблем, которую я вижу, - это то, что я нацелен на мобильные устройства, и у Android есть некоторые известные проблемы, когда setTimeout не работает стандартным образом на всех устройствах. – Josh

Смежные вопросы