4

Я сделал карту с использованием орфографической проекции, и я стараюсь улучшить производительность, потому что вращение не является гладким (около 6-7FPS).d3.js: оптимизация орфографического вращения

Это карта мира, построенная с файлом topojson (world-100m). Мне нужно взаимодействовать со страной и раскрашивать их так, что есть столько же svg: путь, как есть страны.

После загрузки у меня есть функция автоматического поворота запускается с помощью d3.timer:

autoRotate =() => 
    @start_time = Date.now()  # Store the current time (used by automatic rotation) 

    d3.timer() => 
    dt = Date.now() - @start_time 

    if @stopRotation or dt > @config.autoRotationDuration 
     true 
    else 
     @currentRotation[0] = @currentRotation[0] - @config.autoRotationSpeed 
     @projection.rotate @currentRotation 
     redrawPathsOnRotationOrScale(@currentRotation, @projection.scale()) 
     false 

redrawPathsOnRotationOrScale = (rotation, scale, duration = 1) => 
    @currentRotation = rotation 

    @projection 
    .rotate(@currentRotation) 
    .scale(scale) 

    @groupPaths.selectAll("path") 
    .attr("d", path) 

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

Chrome profiling 1/2 Chrome profiling 2/2

кажется покадровой анимации Уволен это медленная часть, но я не знаю, что это такое. И когда я его открываю, есть 2 GC Event (сборщик мусора?), Но ничего вокруг ... У вас есть идея, что происходит в течение этого 90 мс?

Любые советы по улучшению производительности более чем приветствуется :-)

Спасибо авансом!

Кстати, это выглядит следующим образом: Map overview

ответ

2

Попробуйте уменьшить сложность путей SVG, настроив флаги -simplify-ratio, -s или --quantization topojson. Браузеры по-прежнему имеют довольно плохую производительность рендеринга SVG, и с картами он действительно помогает уменьшить количество и точность точек.

+0

Добавление -simplify-ratio 0.6 при создании файла topojson улучшает производительность с 11 до 20 FPS, не теряя много деталей. –

1

D3.js использует Request Animation Frames для выполнения таймеров.

From D3 documentation:

Если ваш браузер поддерживает его, очередь таймер будет использовать requestAnimationFrame для жидкости и эффективной анимации.

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

+0

Да, я знал для * Запросить анимационные рамки *, но я бы ожидал, что он будет максимально быстрым. Мое понимание «Запросить рамки анимации» заключается в том, что он чаще избегает чередования, чтобы браузер мог перерисовывать, чтобы избежать бесполезных вычислений, но это не должно замедлять анимацию. Для 'selection_each' вы абсолютно правы, я собираюсь кэшировать этот результат. Благодаря ! –

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