addPath() обрабатывается вне вашего кода

Ответить
Nyashka
Сообщения: 40
Зарегистрирован: 19 мар 2013, 13:06

addPath() обрабатывается вне вашего кода

Сообщение Nyashka » 18 фев 2015, 12:24

Обнаружил полное непонимание того как работают те или иные механизмы отрисовки с помощью Path() объектов. Если составить некую сложную геометрическую фигуру из большого числа других (возможно пересекающихся) геометрических фигур заданных так же некоторыми Path'ами с помощю addPath(), то отрисовка такого объекта займет не больше времени чем совокупность таких Path'ов нарисованных по отдельности. При этом:
1) время затраченное на выполнение каждого addPath() не будет превышать времени на полное выполнение соответствующих операций необходимых для получение добавляемого Path. (типо lineTo() и addCircle())
2) время затраченное на отрисовку такой фигуры не больше чем отрисовка соответствующих Path'ов по отдельности (как было сказано ранее)
3) !!!время прошедшее с момента вызова postInvalidate() до момента начала отрисовки (код в onDraw()) возрастает пропорционально количеству добавляемых в текущем такте через addPath() фигур!!!
Соответственно объединение ухудшает производительность в разы. Для сравнения: выполнение addPath() это 2-4 мс, вывод результата на экран это 0-1 мс, ожидание отрисовки после postInvalidate это 80 (!!!) мс (при 10-20 мс стандартных). Если на следующем такте отрисовки использовать готовый объект а не повторять операции добавления для получения результирующего Path то время ожидания отрисовки возвращается к нормальным 15 мс.
Возможно кто то понимает что тут происходит, или где то об этом читал. Если да то не могли бы вы объяснить сложившуюся ситуацию или дать ссылку на материалы по данному моменту
UPD: анализ DDMS показывает что всю активность в ожидании прорисовки потребляет Canvas.nDrawDisplayList запускающийся сразу после postInvalidate() и работающий до начала onDraw()

Ответить