Чтение онлайн

ЖАНРЫ

Программирование мобильных устройств на платформе .NET Compact Framework

Салмре Иво

Шрифт:

 private static System.Drawing.Font s_boldFont;

 //------------------------------------------------

 //Вызывается для освобождения от любых графических

 //ресурсов, которые могли быть кэшированы

 //------------------------------------------------

 private static void g_CleanUpDrawingResources {

//Освободить память от черного пера, если таковое имеется

if (s_blackPen !=null) {

s_blackPen.Dispose;

s_blackPen = null;

}

//
Освободить память от белого пера, если таковое имеется

if (s_whitePen != null) {

s_whitePen.Dispose;

r_whitePen = null;

}

//Освободить память от атрибута ImageAttribute, если таковой имеется.

//Примечание. Метод Dispose для этого типа не предусмотрен,

//поскольку все его данные являются управляемыми

if (s_ImageAttribute != null) {

s_ImageAttribute = null;

}

//Освободить память от полужирного шрифта, если таковой имеется

if (s_boldFont != null) {

s_boldFont.Dispose;

s_boldFont = null;

}

 }

 //-----------------------------------------

 //Эта функция позволяет получить доступ

 //к черному перу, находящемуся в кэш-памяти

 //-----------------------------------------

 private static System.Drawing.Pen g_GetBlackPen {

//Если перо еще не существует, создать его

if (s_blackPen ==null) {

s_blackPen = new System.Drawing.Pen(System.Drawing.Color.Black);

}

//Возвратить черное перо return s_blackPen;

 }

 //----------------------------------------

 //Эта функция позволяет получить доступ

 //к белому перу, находящемуся в кэш-памяти

 //----------------------------------------

 private static System.Drawing.Pen g_GetWhitePen {

//Если перо еще не существует, создать его

if (s_whitePen == null) {

s_whitePen = new System.Drawing.Pen(System.Drawing.Color.White);

}

 //Возвратить белое перо return s_whitePen;

 }

 //-----------------------------------------------

 //Эта функция позволяет получить доступ

 //к полужирному шрифту, находящемуся в кэш-памяти

 //-----------------------------------------------

 private static System.Drawing.Font g_GetBoldFont {

//Если перо еще не существует, создать его

if (s_boldFont ==null) {

s_boldFont = new System.Drawing.Font(

System.Drawing.FontFamily.GenericSerif, 10, System.Drawing.FontStyle.Bold);

}

//Возвратить
полужирный шрифт

return s_boldFont;

 }

 //------------------------------------------------------

 //Эта функция позволяет осуществлять доступ

 //к находящемуся в кэш-памяти объекту imageAttributes,

 // который мы используем для изображений с прозрачностью

 //------------------------------------------------------

 private static System.Drawing.Imaging.ImageAttributes g_GetTransparencyImageAttribute {

//Если объект не существует, создать его

if (s_ImageAttribute == null) {

//Создать атрибут изображения

s_ImageAttribute = new System.Drawing.Imaging.ImageAttributes;

s_ImageAttribute.SetColorKey(System.Drawing.Color.White, System.Drawing.Color.White);

}

//Возвратить его

 return s_ImageAttribute;

 }

} //Конец класса

Управление памятью на микроскопическом "уровне алгоритма"

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

1. Вычислительная неэффективность алгоритма. Этот вид неэффективности наблюдается в тех случаях, когда спроектированный вами алгоритм предусматривает интенсивные вычисления или выполнение большего количества циклов, чем это объективно необходимо, от чего можно было бы избавиться, используя более эффективные алгоритмы. В качестве классического примера можно привести сортировку массива данных. Иногда у вас может появляться возможность выбирать между несколькими возможными вариантами алгоритмов сортировки, отдельными частными случаями которых могут, например, быть алгоритмы "порядка N" (линейная зависимость времени вычислений от количества сортируемых элементов), "порядка N*Log(N)" (зависимость времени вычислений от количества сортируемых элементов отличается от линейной, но остается все же лучшей, чем экспоненциальная) или "порядка N^2" (экспоненциальная зависимость времени вычислений от количества сортируемых элементов). Кроме вышеперечисленных "порядков" возможно множество других (например, N^3). Выбор наиболее подходящего алгоритма зависит от объема данных, с которыми вы работаете, объема доступной памяти и ряда других факторов, например, от состояния рабочих данных. Отдельные стратегии, например, предварительная обработка данных перед отправкой их на устройство или хранение данных в формате, специфическом для использования памяти в качестве хранилища, способны обеспечить значительное повышение производительности алгоритма. Существует огромное количество компьютерной литературы, посвященной проектированию эффективных алгоритмов и оценке их быстродействия, поэтому никаких попыток более подробного анализа этих вопросов в данной книге не делается. Необходимо только отметить, что чем больше объем обрабатываемых данных, тем ответственнее необходимо отнестись к принятию решения относительно выбора вычислительного алгоритма. Во всех затруднительных случаях тщательно анализируйте алгоритм и обращайтесь к существующей литературе по этому вопросу. Очень часто оказывается так, что кто-то другой уже прошел этот путь, и вам остается лишь перенять их опыт.

Поделиться с друзьями: