Домашняя страница Оптимизация C# кода. Работа с ресурсами сборки.
Публикация
Отменить

Оптимизация C# кода. Работа с ресурсами сборки.

Если вам нужно множеству объектов передать один и тот же объект Image, который лежит у вас в качестве ресурсов сборки, то нужно сначала его создать, а затем передавать всем объектам. Не в коем случае на получать его из ресурсов для каждого объекта. Это можно проиллюстрировать на примере.

Так не надо (время выполнения: 4.633 секунды + OutOfMemory при количестве 250000):

1
2
3
List< Image > l1 = new List< Image >();
for( int i = 0; i < 25000; ++i )
    l1.Add( Properties.Resources.help );

Надо так (время выполнения: 0 секунд (меньше миллисекунды)):

1
2
3
4
Image img = Properties.Resources.help;
List< Image > l2 = new List< Image >();
for( int i = 0; i < 25000; ++i )
    l2.Add( img );

Это происходит по тому, что при каждом указании Properties.Resources.help происходит создание нового объекта Image, инициализация новой области памяти. Во втором же случае происходит копирование ссылки на один и тот же объект. Это важно понимать, что если вы захотите модифицировать картинку, то вероятно вам нужно еще раз загрузить ресурс, чтобы эта картинка не изменилась во всех местах ее использования. При взятии элемента из ресурсов вызывается такой код:

1
(Bitmap) ResourceManager.GetObject("help", resourceCulture);

То же самое происходит при работе с другими типами ресурсов.

Читайте другие статьи по оптимизации кода в C#:

Комментарии

tan4eg, 10 февр. 2012, 23:51

если одну и ту же картинку нужно нацепить на несколько элементов в гуи, то используется ImageList, куда предварительно загружается нужная картинка (набор картинок).

FiloXSee, 11 февр. 2012, 00:57

ImageList для больших приложений не очень удобен. Особенно, когда много разных окон и сборок, а хочется использовать одну иконку. В большом проекте игрового редактора, состоящем из десятка модулей я поступил немного иначе. Я сделал свой менеджер ресурсов на основе Dictionary< String, Image > и хранил в нем все картинки.

Любой модуль мог добавить картинку:

1
ImageResources.AddImage( «Properties.Resources.help», Properties.Resources.help ); // — регистрация картинки по имени.

Потом эту картинку можно получить из любого модуля по имени:

1
Image img = ImageResources.GetImage( «Properties.Resources.help» );

Это позволяет повторно использовать ресурсы, иметь общую библиотеку иконок и картинок и при этом все работает очень быстро.

Публикация защищена лицензией CC BY 4.0 .

Под льдами Плутона может оказаться жидкий океан!

Оптимизация C# кода. Создание класса ObjectPool