Warning: session_start(): open(/var/lib/php5/sess_4uuaegsgr8rkmfpeovjrllrq84, O_RDWR) failed: No space left on device (28) in /opt/www/itw66.ru/engine/modules/session/Session.class.php on line 76
Оптимизация C# кода. Работа с ресурсами сборки. / C# / it works!
C#

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

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


Так не надо (время выполнения: 4.633 секунды + OutOfMemory при количестве 250000):
List< Image > l1 = new List< Image >();
for( int i = 0; i < 25000; ++i )
	l1.Add( Properties.Resources.help );

Надо так (время выполнения: 0 секунд (меньше миллисекунды)):
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, инициализация новой области памяти. Во втором же случае происходит копирование ссылки на один и тот же объект. Это важно понимать, что если вы захотите модифицировать картинку, то вероятно вам нужно еще раз загрузить ресурс, чтобы эта картинка не изменилась во всех местах ее использования. При взятии элемента из ресурсов вызывается такой код:


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


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

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

Похожие записи




Комментарии (2) свернуть  |  развернуть

  • avatar
  • tan4eg
  • 10 февраля 2012, 20:51
0
если одну и ту же картинку нужно нацепить на несколько элементов в гуи, то используется ImageList, куда предварительно загружается нужная картинка (набор картинок).
0
ImageList для больших приложений не очень удобен. Особенно, когда много разных окон и сборок, а хочется использовать одну иконку. В большом проекте игрового редактора, состоящем из десятка модулей я поступил немного иначе. Я сделал свой менеджер ресурсов на основе Dictionary< String, Image > и хранил в нем все картинки.

Любой модуль мог добавить картинку:
ImageResources.AddImage( «Properties.Resources.help», Properties.Resources.help ); — регистрация картинки по имени.

Потом эту картинку можно получить из любого модуля по имени:
Image img = ImageResources.GetImage( «Properties.Resources.help» );

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

Warning: Unknown: open(/var/lib/php5/sess_4uuaegsgr8rkmfpeovjrllrq84, O_RDWR) failed: No space left on device (28) in Unknown on line 0

Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php5) in Unknown on line 0