2014-12-02 5 views
2

Я работаю над холстом, в котором есть несколько генераторов частиц. Частицы постепенно уменьшаются после создания. Для масштабирования частиц по сравнению с их центральными точками, я использую метод context.translate():HTML5 Canvas - масштабирование относительно центра объекта без перевода контекста

context.save(); 
context.translate(particle.x, particle.y); 
context.translate(-particle.width/2, -particle.height/2); 
context.drawImage(particle.image, 0, 0, particle.width, particle.height); 
context.restore(); 

Я прочитал несколько источников, которые утверждают, сохранения(), перевод() и восстановление() методы довольно вычислительно дорогой. Есть ли альтернативный метод, который я могу использовать?

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

Заранее благодарен!

ответ

6

Да, просто использовать setTransform() в конце, вместо использования сохранения/восстановления:

//context.save(); 
context.translate(particle.x, particle.y); 
context.translate(-particle.width/2, -particle.height/2); 
context.drawImage(particle.image, 0, 0, particle.width, particle.height); 
//context.restore(); 
context.setTransform(1,0,0,1,0,0); // reset matrix 

Предполагая, что нет никакой другой накопленная преобразования используется (в этом случае вы можете реорганизовывать код, чтобы установить абсолютные преобразования, где это необходимо).

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

Это намного быстрее, чем подход сохранения/восстановления, который хранит и восстанавливает не только состояние преобразования, но и настройки стиля, настройки тени, область отсечения и то, что у вас есть.

Вы также могли бы объединить два перевода вызовов в один вызов, и использовать многократно вместо разрыва (что гораздо быстрее, на уровне процессора):

context.translate(particle.x-particle.width*0.5, particle.y-particle.height*0.5); 

или просто использовать х/координату непосредственно с частичный «шейдер» без перевода вообще.

+1

Спасибо - это небольшое изменение увеличило производительность мобильных устройств на 10-20 кадров в секунду. Очень признателен! –

+2

Upvote для значительного улучшения кода вопросов с хорошим ответом. Я мог бы добавить, что если нужны только переводы, вы можете полностью исключить context.translate и просто изменить координаты x, y. – markE

+0

Я изначально избегал этого, так как не знаю полного сценария, но включил его сейчас, поэтому опция более понятная (мне лично хотелось бы - я использую это в своем собственном движке частиц). Спасибо markE. Также добавлено более подробное описание. – K3N

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