Из ветки feat/menu (1b24f28):
- главный источник лагов — полный снимок Derma раз в 6 кадров (обход дерева,
DTileLayout по тысячам иконок, команды для обрезанных панелей, сортировка
детей, InvalidateLayout на hover). Добавлены ui.mark_dirty/ui_dirty/ui_tick,
отдельный layout_dirty, кэш снимка, culling невидимых поддеревьев, отказ от
сортировки без ZPos, hover больше не перезапускает раскладку;
замер: снимок avg 6,4/4,1 мс -> 0,26-0,5 мс, max 84/47 -> 18-27 мс только на
страховочной пересборке; FPS с меню и без — в пределах разброса;
- слайдеры: dnumberscratch, NoClipping, GetCaretPos/SetCaretPos,
input.SetCursorPos, локальные координаты OnCursorMoved, MouseCapture;
проверено на настоящем DNumSlider (5 -> 9,53);
- колесо: всплытие до DScrollPanel/DTree, починен корень DTree (высота
ChildNodes до VBar), тесты прокрутки;
- выравнивание: surface.GetTextSize по bitmap-метрике, ContentAlignment как в
GMod, центрирование вкладок и подписей иконок, дерево с отступом;
- иконки: очередь по площади, до 8 за кадр (~8 мс), LRU переиспользуется.
Проверено: 28 сьютов (включая 9 UI-тестов на реальных Derma-классах) зелёные;
кадры menu_fix.png, menu_tree_wheel.png, menu_placeholders.png.