C # быстро объединяет растровые изображения для пользовательского интерфейса - PullRequest
0 голосов
/ 23 мая 2011

В основном я делаю анимированный интерфейс с нуля.Все в пользовательском интерфейсе является производным от базового класса ScreenThing, который может хранить растровое изображение, используемое для рисования этой вещи, а также ее положение.Когда я хочу нарисовать пользовательский интерфейс, я создаю новое пустое растровое изображение нужного размера, создаю объект Graphics из этого растрового изображения, а затем передаю этот графический объект всем методам ScreenThings Draw () для рисования самостоятельно.Когда это сделано, я печатаю растровое изображение на экране с помощью элемента управления PictureBox.

Все это прекрасно работает, но слишком медленно.Я хочу, чтобы это происходило по крайней мере 30 раз в секунду, поэтому анимация плавная, но на все это уходит более 33 миллисекунд.Я видел, что причиной этой медленности является блокировка и разблокировка растровой памяти.Я попробовал некоторый код, который нашел в Интернете, который разблокирует растровые изображения и создает новые функции GetPixel и SetPixel, и попытался комбинировать изображения попиксельно, как показано ниже, но это заняло еще больше времени.(приведенный ниже код был всего лишь тестом, он не помещает изображение в нужное место)

for (int i = 0; i < images.Count; i++)
{
    FastBitmap foreground = new FastBitmap(images[i]);
    foreground.LockImage();

    for (int x = 0; x < images[0].Width; x++)
    {
        for (int y = 0; y < images[0].Height; y++)
        {
            output.SetPixel(x, y, foreground.GetPixel(x, y));
        }
    }

    foreground.UnlockImage();
}

Так каков наилучший способ сделать это?Можно ли использовать C # для рисования довольно большого изображения (например, 1024x768) в режиме реального времени, как это?Если все остальное не помогло, я думаю, я мог бы найти способ рисовать только те части, которые изменились, но я бы хотел избежать этого, если возможен перебор всех сил.Большое спасибо!

Ответы [ 2 ]

1 голос
/ 23 мая 2011

Вы никогда не должны использовать растровые изображения для рисования анимации в реальном времени.Просто создайте CustomControl и переопределите его метод OnPaint, как этот

protected override void OnPaint(PaintEventArgs pe)
{
}

, где вы можете использовать pe.Graphics для создания любого рисунка, который вам нужен, и копирование на экран не требуется.Я использовал его, и если вы рисуете процедуры достаточно быстро, это будет гладко.

Кроме того, не забудьте вызвать SetStyle(ControlStyles.OptimizedDoubleBuffer, true); в конструкторе элемента управления, чтобы получить двойную буферизацию

1 голос
/ 23 мая 2011

Пиксельный подход - худшее, что вы можете сделать. Вместо этого вы должны профиль вашего приложения. Это просто: запустите его при полной загрузке (100% ЦП) и 10 раз остановите отладчик. Посмотрите, где это больше всего останавливается, это ваша точка доступа, которую вы должны оптимизировать.

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