Литмир - Электронная Библиотека
Содержание  
A
A

Как и в случае управления памятью и других аспектов производительности, технические принципы эффективного проектирования мобильного программного обеспечения не являются уникальными для мобильных устройств. Опыт, приобретенный вами при проектировании и написании эффективно функционирующих программных кодов пользовательских интерфейсов мобильных приложений, позволит вам создавать и более эффективные приложения для настольных компьютеров. Рабочие среды современных настольных компьютеров предоставляют настолько широкие возможности, что многие разработчики вообще не задумываются о производительности, когда проектируют пользовательские интерфейсы. В результате иногда оказывается, что интерфейс работает чересчур медленно, хотя этого можно было бы избежать. Разница между обоими подходами станет очевидной, если вы сравните между собой два пользовательских интерфейса, один из которых проектировался с выделением в качестве первостепенной задачи достижения высокой производительности, а при проектировании второго эта задача отодвигалась на второй или даже на третий план. Первое приложение продемонстрирует действительно высокую скорость выполнения, которое не будет прерываться неожиданными паузами или сопровождаться миганием экрана при его обновлении; такое приложение воспринимается как безукоризненно работающий часовой механизм. Второе же приложение будет казаться "тяжеловатым"; вполне вероятно, что при работе с ним будет наблюдаться мигание экрана при обновлении таких элементов управления, как окна списков, а временами оно будет приостанавливаться. Такое приложение будет напоминать автомобиль, все системы которого требуют регулировки. Даже при абсолютном совпадении базовой функциональности обоих приложений способность пользовательского интерфейса к отклику и видимые проявления не прерываемого никакими паузами процесса выполнения окажут огромное влияние на восприятие качества функционирования приложения. Это справедливо для настольных компьютеров, но вдвойне справедливо для мобильных устройств. Сравните два мобильных телефона, один из которых отличается безукоризненной работой, а второй работает слегка замедленно, и вы сразу же почувствуете разницу. Независимо от возможностей и качества базового программного обеспечения каждого из этих телефонов, более надежным и более эффективным с функциональной точки зрения будет восприниматься тот, который "живее" откликается на ваши действия.

Можно выделить следующие аспекты вашей работы, от которых зависит эффективное функционирование создаваемых вами пользовательских интерфейсов: 

■ При написании кода пользовательского интерфейса применяйте стратегии, ориентированные на достижение высокой производительности. В большинстве современных сред программирования предлагаются высокоуровневые абстракции, облегчающие создание пользовательских интерфейсов. Организацию работы с окнами и диалогами вместе с относящимися к ним элементами управления берет на себя каркас приложения. Разработчик пишет код, выполняющийся в ответ на события, которые генерируются в результате взаимодействия пользователя с элементами управления пользовательского интерфейса. По причине применения высокоуровневых абстракций легко забыть о том, что с любой программной операцией, затребованной пользовательским интерфейсом, могут быть связаны ощутимые накладные расходы. В этих условиях часто имеется несколько возможных путей решения, различающихся своей эффективностью, и от разработчика зависит, какой вариант решения он выберет — удачный или неудачный. Оптимизация такого высокоуровневого кода имеет огромное значение для повышения быстродействия результирующего пользовательского интерфейса. 

■ При написании кода для обработки графики применяйте стратегии, ориентированные на достижение высокой производительности. В то время как код пользовательского интерфейса имеет дело с высокоуровневыми абстракциями, такими как элементы управления и окна, графический код работает с битовыми образами и низкоуровневыми абстракциями вывода изображений на экран. Графический код — это код, ответственный за низкоуровневые операции рисования и манипулирование битовыми образами. Графический код часто выполняет множество мелких операций внутри циклов или вызывается кодом обработки событий для рисования или перерисовки изображений, используемых высокоуровневым кодом пользовательского интерфейса. Выполняете ли вы анимацию путем переключения страниц для использования в компьютерной игре, вычерчиваете ли гистограммы для бизнес-приложений или пишете код для визуализации пользовательского элемента управления — всегда существуют пути, обеспечивающие максимальную производительность обработки графики.

Выбирайте наиболее оптимальным форматы и размеры изображений. Как высокоуровневый код пользовательского интерфейса, так и низкоуровневый код, обеспечивающий обработку графики, часто работают с изображениями. Для данных этого типа существует множество форматов и способов их использования, каждый из которых является оптимальным для определенных целей. Выбор наиболее подходящей стратегии, соответствующей вашим потребностям, позволит достигнуть разумного компромисса между размером используемых изображений и требованиями производительности.

Стратегии проектирования высокопроизводительных пользовательских интерфейсов

Сложность написания кода пользовательского интерфейса объясняется тем, что он представляет собой пограничную область, в которой ваш код взаимодействует как с операционной системой, так и с конечным пользователем. Пользовательский интерфейс находится в буквальном смысле слова между ними и играет роль посредника при обмене запросами, связывающими между собой пользователя и операционную систему. Как проектировщик приложения, вы должны ответить на тысячи вопросов:

■ Какие стандартные или пользовательские элементы управления следует применять для отображения данных и организации взаимодействия с пользователем?

■ Имеет ли смысл создать собственные нестандартные элементы управления, или же лучше расширить свойства уже существующих элементов управления с тем, чтобы они соответствовали вашим конкретным нуждам?

■ Какие стратегии следует использовать при заполнении элементов интерфейса, которые должны содержать многочисленные данные? В этом отношении особого внимания заслуживают элементы управления, содержащие списки деревьев данных.

■ На какие управляющие события необходимо реагировать? В каких случаях реакция на эти события должна подавляться?

■ Можно ли уменьшить количество событий, запускаемых при выполнении обычных или часто повторяющихся задач?

■ Существует ли необходимость в форсировании немедленного обновления или перерисовки элементов управления ради поддержания в пользователе уверенности в том, что его команды воспринимаются и исполняются, если при этом страдает общая производительность приложения?

С учетом того, что перечень этих вопросов довольно большой, число возможных вариантов реализации кода, обеспечивающего удовлетворение тех или потребностей пользовательского интерфейса, оказывается практически неограниченным. Наряду с предоставлением вам широкой свободы действий, эта ситуация порождает риск принятия случайных или неэффективных решений. Представьте, что вы пришли в мебельный магазин покупать диван, а вам выдали несколько упаковок с деталями, количество которых явно превышает необходимое, и предложили самому заняться сборкой дивана, не удосужившись снабдить вас никакими дополнительными инструкциями. Возможно, собранная вами конструкция окажется прочной, и будет выглядеть вполне прилично, но не исключено, что результат вашего труда окажется менее привлекательным в отношении дизайна и будет походить скорее на настил, сооруженный первобытным человеком, чем на современный диван. Не имея инструкций, стратегии и хорошего технического руководства, вы закончите, вероятнее всего, вторым вариантом. При наличии же понятной схемы сборки исход окажется благополучным. Как и в случае с нашим вымышленным диваном, после того как вы соберете воедино все части приложения, вам будет очень трудно вновь отделить их одну от другой для внесения возможных изменений, связанных с пересмотром проекта. Если вы не хотите, чтобы конечный результат оказался посредственным, и не желаете начинать все заново с самого начала, вы должны продумать стратегии своих действий, которыми вы будете руководствоваться и которые будут гарантировать, что процесс разработки пользовательского интерфейса приложения все время развивается в правильном русле

102
{"b":"947732","o":1}