2016-12-14 2 views
1

У меня вопрос. Как новобранец, я нашел хороший сценарий и переписал его к моему удовлетворению. Но я задаюсь вопросом, могу ли я сделать следующее более эффективное использование памяти/производительности.JS - Холст - нарисовать на двух холстах одновременно - подавать два вара?

Прежде всего немного фона.

  • Я сделал холст, на котором я рисую линию с помощью мыши. Довольно простой.
  • С помощью "canvas2svg" я смог скопировать копию холста на выход/загрузку svg.

Вопрос:

Теперь это все работает. Но мне было интересно, могу ли я сделать следующий фрагмент кода более эффективным для работы с памятью/эффективностью.

«ctx» var рисует на холсте «rttSvg» var рисует файл svg.

points.push({ x: e.clientX, y: e.clientY }); 

    ctx.beginPath(); 
    ctx.moveTo(points[points.length - 2].x, points[points.length - 2].y); 
    ctx.lineTo(points[points.length - 1].x, points[points.length - 1].y); 
    ctx.stroke(); 

    rttSvg.beginPath(); 
    rttSvg.moveTo(points[points.length - 2].x, points[points.length - 2].y); 
    rttSvg.lineTo(points[points.length - 1].x, points[points.length - 1].y); 
    rttSvg.stroke(); 

Можно ли это объединить? Что-то вроде этого? (Новобранец Варинг вперед :)

(ctx.rttSvg).beginPath(); 

Мысли Для небольшого кусочка, как это я могу, конечно, создать функцию, передать оба ВАР и выполнить. Но чем мне придется делать много и много функций, так как мне придется делать это для всего кода, который взаимодействует с холстом и svg. И я хотел бы сделать это inline.

Как вы можете видеть, мне все равно придется обернуть голову вокруг процесса мышления JS. :)

+0

нет, это не практично, чтобы упростить, что без упаковки каждого рисунка операции так, чтобы она как – Alnitak

+0

я не согласен. Если две операции рисования полностью идентичны, вы можете просто иметь функцию, которая принимает контекст как параметр и затем использует этот контекст. Вызовите функцию дважды ... 'function drawStuff (контекст) {}' и ... 'drawStuff (ctx);' 'drawStuff (rttSvg);' – Archer

+0

@Archer, Ах да. это работает :) points.push ({x: e.clientX, y: e.clientY}); \t drawStuff (ctx, points); drawStuff (rttSvg, точки); И Функция drawStuff (контекст, точки) {} – Tim

ответ

1

Без больше контекста трудно быть 100% уверены, что это правильный подход, но вы можете обернуть чертеж в функции и просто вызвать эту функцию, принимая контекст рисования в качестве параметра ...

function drawStuff(context) { 
    context.beginPath(); 
    context.moveTo(points[points.length - 2].x, points[points.length - 2].y); 
    context.lineTo(points[points.length - 1].x, points[points.length - 1].y); 
    context.stroke(); 
} 

затем в случае необходимости ...

points.push({ x: e.clientX, y: e.clientY }); 

drawStuff(ctx); 
drawStuff(rttSvg); 
+1

Ах да, он отлично работает, не передавая «очки». Большое спасибо! (Я бы хотел, чтобы его повысили, но поскольку у меня есть своя учетная запись, мне придется ждать :)) – Tim

+0

Я рад помочь. Удачи :) – Archer

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