Категории
ТОП за месяц
onlinekniga.com » Компьютеры и Интернет » Программирование » Программирование мобильных устройств на платформе .NET Compact Framework - Иво Салмре

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

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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 105 106 107 108 109 110 111 112 113 ... 206
Перейти на страницу:

 //используемые объекты Pen, ImageAttribute, Font и Brush.

 //

 //Внешний код получает доступ ко всем общедоступным членам,

 //так что никакие функции доступа не нужны.

 //=========================================================

 public static Pen g_blackPen;

 public static Pen g_whitePen;

 public static System.Drawing.Imaging.ImageAttributes g_ImageAttribute;

 private static bool s_alreadyInitialized;

 public static Font g_boldFont;

 public static Font g_smallTextFont;

 public static Brush g_greenBrush;

 public static Brush g_yellowBrush;

 public static Brush g_redBrush;

 public static Brush g_blackBrush;

 //==============================================================

 //Эта функция должна быть вызвана до попыток доступа к любому из

 //вышеперечисленных глобальных объектов

 //==============================================================

 public static void InitializeGlobals() {

  if (s_alreadyInitialized == true) {

   return;

  }

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

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

  g_ImageAttribute = new  System.Drawing.Imaging.ImageAttributes();

  g_ImageAttribute.SetColorKey(Color.White, Color.White);

  g_boldFont = new Font(FontFamily.GenericSerif, 10, FontStyle.Bold);

  g_smallTextFont = new Font(FontFamily.GenericSansSerif, 8, FontStyle.Regular);

  g_blackBrush = new SolidBrush(System.Drawing.Color.Black);

  g_greenBrush = new SolidBrush(System.Drawing.Color.LightGreen);

  g_yellowBrush = new SolidBrush(System.Drawing.Color.Yellow);

  g_redBrush = new SolidBrush(System.Drawing.Color.Red);

  s_alreadyInitialized = true;

 }

 //=========================================================

 //Подход 3: Возвратить массив связанных ресурсов.

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

 // запросах не загружались (понапрасну) их дубликаты.

 //=========================================================

 private static Bitmap m_CaveMan_Bitmap1;

 private static Bitmap m_CaveMan_Bitmap2;

 private static Bitmap m_CaveMan_Bitmap3;

 private static Bitmap m_CaveMan_Bitmap4;

 private static System.Collections.ArrayList m_colCaveManBitmaps;

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

 //Создать и загрузить массив изображений для спрайта

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

 public static System.Collections.ArrayList g_CaveManPictureCollection() {

  //Изображения загружаются лишь в том случае, если мы их еще не загрузили

  if (m_CaveMan_Bitmap1 == null) {

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

   //Загрузить изображения. Эти изображения хранятся в виде

   //встроенных ресурсов в нашем двоичном приложении.

   //

   //Загрузка изображений из внешних файлов осуществляется аналогичным

   //образом, но выполнить ее проще (нам достаточно лишь указать

   //имя файла в конструкторе растровых изображений).

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

   //Получить ссылку на нашу двоичную сборку

   System.Reflection.Assembly thisAssembly = System.Reflection.Assembly.GetExecutingAssembly();

   //Получить имя сборки

   System.Reflection.AssemblyName thisAssemblyName = thisAssembly.GetName();

   string assemblyName = thisAssemblyName.Name;

   //Загрузить изображения в виде двоичных потоков из нашей сборки

   m_CaveMan_Bitmap1 = new System.Drawing.Bitmap(

    thisAssembly.GetManifestResourceStream(

    assemblyName + ".Hank RightRunl.bmp"));

   m_CaveMan_Bitmap2 = new System.Drawing.Bitmap(

    thisAssembly.GetManifestResourceStream(

    assemblyName + ".Hank_RightRun2.bmp"));

   m_CaveMan_Bitmap3 = new System.Drawing.Bitmap(

    thisAssembly.GetManifestResourceStream(

    assemblyName + ".Hank_LeftRun1.bmp"));

   m_CaveMan_Bitmap4 = new System.Drawing.Bitmap(

    thisAssembly.GetManifestResourceStream(

    assemblyName + ".Hank_LeftRun2.bmp"));

   //Добавить их в коллекцию

   m_colCaveManBitmaps = new System.Collections.ArrayList();

   m_colCaveManBitmaps.Add(m_CaveMan_Bitmap1);

   m_colCaveManBitmaps.Add(m_CaveMan_Bitmap2);

   m_colCaveManBitmaps.Add(m_CaveMan_Bitmap3);

   m_colCaveManBitmaps.Add(m_CaveMan_Bitmap4);

  }

  //Возвратить коллекцию

  return m_colCaveManBitmaps;

 }

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

Старайтесь избегать распределения памяти для объектов при выполнении повторяющихся или непрерывно продолжающихся операций рисования

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

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

■ Объекты Bitmap. Часто возникают ситуации, в которых в качестве временного хранилища для изображения или части изображения, создаваемых вашим приложением, удобно использовать объект Bitmap. Если вашему приложению требуется пространство для рисования, то в этом нет ничего необычного; единственное, чего следует избегать — так это создания и уничтожения многих битовых изображений в циклах рисования. Обычно гораздо лучше иметь одно рабочее пространство, многократно используемое в качестве общего ресурса, чем нести дополнительные затраты, связанные с непрерывным созданием и уничтожением временных изображений. Размер такой временной памяти должен быть равен размеру наибольшего временного изображения, которое может понадобиться вашим процедурам (но не более того). Если временную память необходимо очищать, прежде чем использовать ее для рисования, то это можно сделать легко и быстро при помощи вызова Graphics.Clear(). Кроме того, как продемонстрировано в приведенном выше примере кода, часто используемые растровые изображения имеет смысл загружать и кэшировать в памяти. Следите за тем, чтобы в каждый момент времени загружался только один экземпляр растрового изображения. Загрузка нескольких экземпляров идентичных изображений приведет к напрасному расходованию больших объемов памяти. 

■ Объекты Graphics. Если требуется постоянно перерисовывать растровое изображение, как это, например, приходится делать при перерисовке кадров игрового поля, то, вероятно, наряду с целевым экранным изображением целесообразно кэшировать также объекты Graphics внеэкранных изображений. Поступая таким образом, вы избавитесь от необходимости непрерывного размещения этих объектов в памяти и их удаления. Не распределяйте в циклах рисования память для объектов Graphics растровых изображений или форм более одного раза; в идеальном случае следует вообще избегать размещения и удаления таких объектов внутри циклов. To же самое касается и любых других битовых карт, в которых вы должны выполнять рисование; кэшируйте их объекты Graphics, а не создавайте их каждый раз заново. Учтите, что объекты Graphics нужны только для тех битовых карт, которые вы используете для создания изображений; если битовая карта используется лишь в качестве источника информации об изображении, то объект Graphics для нее вам вообще не нужен. 

■ Объекты Font, Brush, Pen, ImageAttribute. Распространенной ошибкой разработчиков, причины которой вполне объяснимы, является их чрезмерное увлечение управлением временем жизни ресурсов на микроуровне, не сопровождающееся глубоким анализом их использования на макроуровне. В процессе создания графического изображения вам может потребоваться пройти, скажем, через 30 отдельных этапов, в ходе которых рисуются линии, закрашиваются эллипсы, создается текст и копируются битовые образы. Выполнение каждой из этих операций требует использования некоторой комбинации перьев, кистей, шрифтов, то есть объектов Pen, Brush, Font, а если в дело включаются еще и маски прозрачности, то и объектов ImageAttribute. В случае мобильных устройств ситуация усугубляется тем, что в .NET Compact Framework, в отличие от .NET Framework, статические версии базовых кистей и перьев не предусмотрены. Так, в версии NET Framework, ориентированной на настольные компьютеры, существуют, например, объекты System.Drawing.Pens.Blue и System.Drawing.Brushes.DarkOrange, но в NET Compact Framework эти объекты приходится распределять. Решение этой проблемы заключается в создании собственного глобального набора объектов Pen и Brush, который вы будете использовать для нужд рисования во всем приложении. Вы должны тщательно просмотреть все циклы рисования в приложении, обращая особое внимание на случаи повторного создания идентичных ресурсов и избавляясь от подобной избыточности в коде. Если в вашем приложении непрерывно выполняются операции рисования, то такие объекты, как шрифты, перья, кисти и маски прозрачности, должны либо однажды распределяться в цикле рисования, либо глобально кэшироваться. 

1 ... 105 106 107 108 109 110 111 112 113 ... 206
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу Программирование мобильных устройств на платформе .NET Compact Framework - Иво Салмре.
Комментарии