Raphael JS становится очень медленным при использовании фона на множестве прямоугольников - PullRequest
2 голосов
/ 13 октября 2011

У меня большой набор маленьких прямоугольников (4K-5K), и я хочу использовать технику спрайтов, чтобы дать им фон, поэтому у меня есть только одно изображение (в противном случае количество запросов может убить сервер).

Если я выделю им цветной фон, для построения карты потребуется всего несколько секунд.

Я попытался создать прямоугольник, применить к нему перевод, чтобы назначить другую часть фонового изображения, и это работает. Но когда я добавляю даже 10 из них, это невероятно медленно.

Я что-то не так делаю?

1 Ответ

1 голос
/ 21 октября 2011

У меня была похожая проблема: я пытался создать гексагональную карту, а затем заполнить шестиугольники спрайтами, такими как лес, вода, луга. Когда я заливаю их сплошным цветом, на рендеринг 10K элементов уходит всего две секунды.

Если я пытаюсь использовать fill: url('image.png');, то на рисование всего 180 шестиугольников уходит больше времени, и браузер вылетает на 10K.

Насколько я могу судить, проблема в том, что Raphael JS создает отдельное определение текстуры для каждого элемента, а затем применяет его в качестве заливки. Это означает, что для 10K-элементов у вас есть 10K-определения текстур, которые указывают на одно и то же изображение. Это плохо.

Обновление:

В итоге я отказался от SVG для такого использования. Это намного быстрее, просто создавать элементы HTML и устанавливать фон с помощью CSS. Вы можете комбинировать их с SVG в качестве слоя сверху, например. Однако вы работаете с большим количеством элементов.

Я решил свою проблему, динамически загружая только те элементы, которые мне нужны, потому что все 10 КБ не должны одновременно находиться в области просмотра.

В вашем случае это не совсем вариант. Хорошей альтернативой будет использование Canvas для рисования элементов. Из моих экспериментов это будет быстрее, чем SVG, при рисовании этого числа, хотя, если вы используете некоторые анимации, их будет сложнее реализовать, чем с библиотекой RaphaelJS.

...