Я пытаюсь существенно изменить элементы пути Raphaël следующим образом (пожалуйста, учтите, что код включает в себя сборку для полного примера):
var n = 100,
i = 0;
var values = [n];
var panel = document.createElement("div");
var paper = null;
var path = null;
panel.id = "panel";
panel.style.top = '0px';
panel.style.left = '0px';
panel.style.width = '300px';
panel.style.height = '300px';
panel.style.background = 'black';
document.getElementsByTagName('body')[0].appendChild(panel);
paper = Raphael(panel, 0, 0);
path = paper.path('m0,0');
path.attr({ stroke: '#fff', 'stroke-width': 1 });
function test () {
i = n;
while (i--)
values[i] = Math.round(Math.random() * 3);
// perform change here!
path.attr({ path: 'm0,0l0,' + values.join('l3,') });
// just a test case!
setTimeout(test, 1);
};
test();
К сожалению, такой подход просачивается в память. Я тестировал его в FF 4 и IE 7+ с Raphaël 1.5.2 и 2.0 beta. Разница лишь в том, что Raphaël 1.5.2 протекает намного быстрее, чем 2.0 beta.
Что я делаю не так?
Обновление
Чтобы поставить этот вопрос в контекст: я хочу реализовать графическое управление в реальном времени с Raphaël. Поэтому я использую буфер массива для каждой серии и отображаю их при достижении размера буфера, поэтому мне нужно только визуализировать данную серию фиксированной длины.
Единственный способ, которым я видел это в Raphaël - это элемент пути на серию, который обновляет свой атрибут пути .attr({path: path.attr('path') + getSvgPath(buffer)})
, если необходимо, с последующим переводом по оси x в зависимости от размера буфера .animate({translation: (bufferSize*valuesDistance*-1) + ',0'}, 500, '<', callback)
- для плавной анимации обновлений - и, наконец, сдвиг атрибута пути после анимации для предотвращения расширения строк пути: .attr({path: shiftSvgPath(path.attr('path'))})
.
Функции shiftSvgPath()
и getSvgPath()
просто возвращают соответствующую строку пути svg. Таким образом, результат всегда состоит из одной команды moveTo
в начале и постоянного числа команд lineTo
, равных количеству отображаемых значений или плюс размер буфера.