Тази седмица вниманието на потребителите на GitHub бе привлечено от забавен проблем, който получи номер #22900.
Първа на този проект обърна внимание програмистката Джо Лис (Jo Liss), известна със създаването на библиотеката Broccoli и други свободни библиотеки. Тя забеляза, че Visual Studio Code използва 13% процесорен ресурс, ако е на фокус в операционната система. Това е едно безсмислено изразходване на енергията на лаптопа. Веднага започна разследването на този странен феномен.
За изолирането и многократното възпроизвеждане на този ефект бяха предприети следните стъпки:
- Затваряне на всички програмни прозорци на Visual Studio Code
- Отваряне на нов прозорец чрез File → New Window
- Отваряне на нов раздел с празен файл (File → New Tab). Курсорът мига
- В монитора на ресурсите се вижда консумация на 13% CPU на слабичък лаптоп с OS X и около 5-7% процесорен ресурс на мощен с GNOME Shell с Wayland (Ivy Bridge Graphics)
- При прехвърляне на фокуса (Cmd+Tab) към друго приложение курсорът не се вижда и консумацията на CPU веднага спада до нулата.
Ако разгледаме по-подробно един фрейм, ще забележим, че въпреки, че курсорът мига с честота 2 fps, основният поток върши някаква работа при 60 fps, тоест, нещо се рендира на всеки 16 милисекунди.
Ако приближим изображението още повече, ще забележим каква огромна работа се извършва за рендирането на 60 кадъра в секунда. Това са непрекъснати цикли Update Layer Tree – Paint – Composite Layers, тоест, имаме непрекъснато обновяване на слоевете.
Програмистката специално обърна внимание, че в другите приложения, като например Chrome и TextEdit, курсорът си мига без да консумира някакъв забележим ресурс.
Във Visual Studio Code може да се изключва мигането на курсора и в този случай консумацията на процесорен ресурс пада до нулата.
Оказа се, че причината е анимацията на ключов CSS кадър, понеже енджинът на Visual Studio Code принудително преобразува тази анимация към 60 fps.
Създателите на Visual Studio Code казаха, че първоначално тази функция е била реализирана на JavaScript, но преди година е била прехвърлена към CSS. Те допълниха, че очевидно има смисъл от завръщане от CSS, обратно към JS.
Имаше предложения за курсор да се използва gif файл, но при него биха възникнали проблеми с мащабирането, понеже това е растерна графика.
В крайна сметка Microsoft реши да се завърне към познатия и изпитан JavaScript метод и консумацията на процесорен ресурс веднага дасе понижи няколко пъти.