Книга: Программирование мобильных устройств на платформе .NET Compact Framework
Листинг 8.1. Применение отложенной загрузки, кэширования и освобождения графических ресурсов
Листинг 8.1. Применение отложенной загрузки, кэширования и освобождения графических ресурсов
Option Strict On
Public Class GraphicsGlobals
Private Shared s_Player_Bitmap1 As System.Drawing.Bitmap
Private Shared s_Player_Bitmap2 As System.Drawing.Bitmap
Private Shared s_Player_Bitmap3 As System.Drawing.Bitmap
Private Shared s_Player_Bitmap4 As System.Drawing.Bitmap
Private Shared s_colPlayerBitmaps As _
System.Collections.ArrayList
'----------------------
'Освободить все ресурсы
'----------------------
Public Shared Sub g_PlayerBitmapsCollection_CleanUp()
'Если не загружено ни одно изображение, то и память освобождать не от чего
If (s_colPlayerBitmapsIs Nothing) Then Return
'Дать указание каждому из этих объектов освободить
'любые удерживаемые ими неуправляемые ресурсы
s_Player_Bitmap1.Dispose()
s_Player_Bitmap2.Dispose()
s_Player_Bitmap3.Dispose()
s_Player_Bitmap4.Dispose()
'Обнулить каждую из этих переменных, чтобы им не соответствовали
'никакие объекты в памяти
s_Player_Bitmap1 = Nothing
s_Player_Bitmap2 = Nothing
s_Player_Bitmap3 = Nothing
s_Player_Bitmap4 = Nothing
'Избавиться от массива
s_colPlayerBitmaps = Nothing
End Sub
'-----------------------------------------
'Функция: возвращает коллекцию изображений
'-----------------------------------------
Public Shared Function g_PlayerBitmapsCollection() _
As System.Collections.ArrayList
'---------------------------------------------------------------
'Если изображения уже загружены, их достаточно только возвратить
'---------------------------------------------------------------
If Not (s_colPlayerBitmaps Is Nothing) Then
Return scolPlayerBitmaps
End If
'Загрузить изображения как ресурсы из исполняемого двоичного файла
Dim thisAssemblyAs System.Reflection.Assembly = _
System.Reflection.Assembly.GetExecutingAssembly()
Dim thisAssemblyNameAs System.Reflection.AssemblyName = _
thisAssembly.GetName()
Dim assemblyNameAs String = thisAssemblyName.Name
'Загрузить изображения
s_Player_Bitmap1 =New System.Drawing.Bitmap( _
thisAssembly.GetManifestResourceStream(assemblyName _
+ ".Hank_RightRun1.bmp"))
s_Player_Bitmap2 = New System.Drawing.Bitmap( _
thisAssembly.GetManifestResourceStream(assemblyName _
+ ".Hank_RightRun2.bmp"))
s_Player_Bitmap3 = New System.Drawing.Bitmap( _
thisAssembly.GetManifestResourceStream(assemblyName _
+ ".Hank_LeftRun1.bmp"))
s_Player_Bitmap4 = New System.Drawing.Bitmap( _
thisAssembly.GetManifestResourceStream(assemblyName _
+ ".Hank_LeftRun2.bmp"))
'Добавить изображения в коллекцию
s_colPlayerBitmaps = New System.Collections.ArrayList
s_colPlayerBitmaps.Add(s_Player_Bitmap1)
s_colPlayerBitmaps.Add(s_Player_Bitmap2)
s_colPlayerBitmaps.Add(s_Player_Bitmap3)
s_colPlayerBitmaps.Add(s_Player_Bitmap4)
'Возвратить коллекцию
Return s_colPlayerBitmaps
End Function
Private Shared s_blackPen As System.Drawing.Pen
Private Shared s_whitePen As System.Drawing.Pen
Private Shared s_ImageAttribute As _
System.Drawing.Imaging.ImageAttributes
Private Shared s_boldFont As System.Drawing.Font
'------------------------------------------------
'Вызывается для освобождения от любых графических
'ресурсов, которые могли быть кэшированы
'------------------------------------------------
Private Shared Sub g_CleanUpDrawingResources()
'Освободить память от черного пера, если таковое имеется
If Not (s_blackPenIs Nothing) Then
s_blackPen.Dispose()
s_blackPen = Nothing
End If
'Освободить память от белого пера, если таковое имеется
If Not (s_whitePenIs Nothing) Then
s_whitePen.Dispose()
s_whitePen = Nothing
End If
'Освободить память от атрибута ImageAttribute, если таковой имеется.
'Примечание. Метод Dispose() для этого типа не предусмотрен,
'поскольку все его данные являются управляемыми
If Not (s_ImageAttribute Is Nothing) Then
s_ImageAttribute = Nothing
End If
'Освободить память от полужирного шрифта, если таковой имеется
If Not (s_boldFontIs Nothing) Then
b_boldFont.Dispose()
s_boldFont = Nothing
End If
End Sub
'-----------------------------------------
'Эта функция позволяет получить доступ
'к черному перу, находящемуся в кэш-памяти
'-----------------------------------------
Private Shared Function g_GetBlackPen() As System.Drawing.Pen
'Если перо еще не существует, создать его
If (s_blackPen Is Nothing) Then
s_blackPen = New System.Drawing.Pen( _
System.Drawing.Color.Black)
End If
'Возвратить черное перо
Return s_blackPen
End Function
'----------------------------------------
'Эта функция позволяет получить доступ
'к белому перу, находящемуся в кэш-памяти
'----------------------------------------
Private Shared Function g_GetWhitePen() As System.Drawing.Pen
'Если перо еще не существует, создать его
If (s_whitePen Is Nothing) Then
s_whitePen = New System.Drawing.Pen( _
System.Drawing.Color.White)
End If
'Возвратить белое перо
Return s_whitePen
End Function
'-----------------------------------------------
'Эта функция позволяет получить доступ
'к полужирному шрифту, находящемуся в кэш-памяти
'-----------------------------------------------
Private Shared Function g_GetBoldFont() As System.Drawing.Font
'Если перо еще не существует, создать его
If (s_boldFont Is Nothing) Then
s_boldFont = New System.Drawing.Font( _
System.Drawing.FontFamily.GenericSerif, 10, System.Drawing.FontStyle.Bold)
End If
'Возвратить полужирный шрифт
Return s_boldFont
End Function
'-----------------------------------------------------
'Эта функция позволяет осуществлять доступ
'к находящемуся в кэш-памяти объекту imageAttributes,
'который мы используем для изображений с прозрачностью
'-----------------------------------------------------
Private Shared Function g_GetTransparencyImageAttribute() As _
System.Drawing.Imaging.ImageAttributes
'Если объект не существует, создать его
If (s_ImageAttributeIs Nothing) Then
'Создать атрибут изображения
s_ImageAttribute = _
New System.Drawing.Imaging.ImageAttributes
s_ImageAttribute.SetColorKey(System.Drawing.Color.White, _
System.Drawing.Color.White)
End If
'Возвратить его
Return s_ImageAttribute
End Function
End Class
- Листинг 8.1. Применение отложенной загрузки, кэширования и освобождения графических ресурсов
- Листинг 8.2. Общий код, используемый во всех приведенных ниже вариантах тестов
- Листинг 8.3. Тестовый пример, демонстрирующий неэкономное распределение памяти (типичный первоначальный вариант реализации интересующей нас функции)
- Листинг 8.4. Рабочий класс для первого тестового примера
- Листинг 8.5. Тестовый пример, демонстрирующий уменьшение объема памяти, распределяемой для объектов (типичный образец улучшения первоначального варианта реализации интересующей нас функции)
- Листинг 8.6. Рабочий класс для второго тестового примера
- Листинг 8.7. Тестовый пример, демонстрирующий значительное уменьшение объема памяти, распределяемой для объектов (типичный образец существенной алгоритмической оптимизации первоначального варианта реализации интересующей нас функции)
- Листинг 8.8. Рабочий класс для третьего тестового примера
- Листинг 8.9. Сравнение эффективности использования строк и класса stringBuilder в алгоритмах
- Листинг 8.1. Применение отложенной загрузки, кэширования и освобождения графических ресурсов
- Листинг 10.1. (simpleid.c) Отображение идентификаторов пользователя и группы
- Листинг 15.11. Код для загрузки файла с Web-сервера
- Почему при включении клавиатура не работает, а после загрузки Windows все нормально?
- Применение функции scanf( )
- Каждый раз после загрузки Windows запускаются разные бесполезные приложения, а возле часов появляются лишние значки. Что...
- Я часто использую сетевую папку другого компьютера, как сделать, чтобы она не пропадала после перезагрузки?
- Применение PHP-технологий в программе HtmlPad
- Если не включить внешний модем (COM-порт) до загрузки компьютера, то он не определяется системой. Это можно исправить?
- Удалил драйвер видеокарты, а потом еще и отключил устройство по умолчанию SVGA. После перезагрузки увидел черный экран… ...
- Восстановление системы через меню загрузки
- Во время загрузки появляется окно с запросом пароля, но раскладка используется русская, а у меня пароль на английском. К...