Member 14846576 Ответов: 1

[C#] как нарисовать несколько изображений без мерцания?


Я делаю стратегическую игру на C# (ничего слишком дикого, никакой анимации или экшена). Мне удалось нарисовать участок карты и позволить пользователю прокручивать его, используя DrawImage и указать область изображения карты для рисования:

RectangleF srcRect = new RectangleF(currentMapX, currentMapY, 500, 500);
mapSectionGraphics.DrawImage(mapImage, 0, 0, srcRect, GraphicsUnit.Pixel);


Теперь, когда я прокручиваю карту, она работает нормально, но когда я рисую дополнительные изображения на карте, они мерцают при прокрутке.
В идеале, я думаю, я бы нарисовал всю карту со всеми объектами на ней в одном PictureBox, и затем возьмите фрагмент из этого составного изображения, чтобы нарисовать его на экране навигации по карте. Это устраняет мерцание, так как карта не нуждается в постоянном создании резервной копии во время прокрутки.

Вот мой вопрос... как мне это сделать? Я все еще изучаю веревки в C#, поэтому я надеюсь, что что-то подобное можно сделать не слишком сложным способом. Спасибо!

Что я уже пробовал:

Насколько я вижу, я могу использовать DrawImage только для рисования реальных "графических" ресурсов PictureBoxes, а не фактического результата нескольких операций рисования.

Я действительно нашел фрагмент кода, который позволяет скопировать результат и нарисовать его в другой PictureBox, и это хорошо сработало, но для этого источник (в моем случае полная карта) также должен быть виден на экране, чего я не хочу.

1 Ответов

Рейтинг:
0

OriginalGriff

Вы можете попробовать установить для свойства form DoubleBuffered значение true: Контроль.Свойство DoubleBuffered (System.Окна.Формы) | Microsoft Docs[^] и посмотрим, улучшит ли это его, но лучшее решение-вообще не использовать PictureBox. Вместо этого поместите панель на форму и обработайте ее событие Paint, чтобы нарисовать изображения самостоятельно, используя Графика.Метод DrawImage[^] по графику объекта, предоставленного в аргументы события.
В долгосрочной перспективе это гораздо более гибкое решение (и не такое сложное, как кажется).


Member 14846576

Спасибо за ваш ответ. Как бы я это сделал? Я вижу событие Paint на панели, но не знаю, как действовать дальше..

OriginalGriff

Следуйте ссылкам, которые я вам дал - это не сложно!

Member 14846576

Спасибо, я вижу, теперь я сделал это так, как там было написано. К сожалению, он все еще мерцает, когда я использую .Refresh() или .Invalidate() во время прокрутки, чтобы вызвать событие Paint.. кажется, я все еще делаю что-то не так..