Более быстрая загрузка изображений в форме C ++ - PullRequest
0 голосов
/ 21 марта 2011

У меня есть форма, которая содержит спиннер и пустую область, где я буду рисовать изображения с масштабом, установленным на слайдере.Пути к изображениям создаются, когда форма загружается и не изменится.В настоящее время я использую что-то вроде этого для отображения изображений:

    void drawImages(void)
    {
        //...

        clearImages();
        for each(String ^image in images)
        {
            box = gcnew PictureBox;
            box->Name = "pictureBox" + i.ToString(); //Used when deleting.
            // setting properties snipped
            box->Image = Image::FromFile(image);
            Controls->Add(box);
         }
    }

А вот код очистки, связанный с событием «значение изменено» счетчика и событие «изменен размер» в форме:

    void clearImages(void)
    {
        for(int i=0; i<images->Count; ++i)
            Controls->RemoveByKey("pictureBox" + i.ToString());
    }

Проблема в том, что они перезагружаются и мерцают очень долго из-за этого.Есть ли способ исправить это?Единственное улучшение, которое я хочу сделать, - это перерисовывать изображения, когда пользователь поднимает мышь со счетчика, а не перерисовывать их каждый раз, когда они меняются.

1 Ответ

0 голосов
/ 21 марта 2011

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

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

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

В-третьих, двойной буфер логики вашего дисплея. Это может вам не сильно помочь в этом случае, потому что вы все равно бросаете их на экран одним выстрелом, но стоит попробовать.

В-четвертых, вы можете использовать таймер вместо события изменения значения счетчика. Когда пользователь перетаскивает ползунок, запускают таймер и, в событии Tick таймера, выполняют свою логику. Когда пользователь отпускает слайдер, остановите таймер. Таким образом, вы можете контролировать максимальную скорость обновления.

В конце концов, я должен был получить доступ к данным изображения напрямую, чтобы выполнить свои манипуляции с изображениями, потому что GDI + был слишком медленным. Опять же, вы фактически не меняете данные пикселей, поэтому передача битовых блоков (blt) должна быть достаточно быстрой.

Я надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...