2014-02-12 3 views
0

Десять лет назад я создал простую игру Tetris, чтобы изучить .NET и WinForms. Я создал сетку размером 10 на 30 из элементов управления ярлыками. Эти метки связаны с ImageList, который содержит изображение каждого блока. Через пару недель мои друзья попросили игру в тетрис для локальной сети, поэтому я взял свою старую игру Tetris, и я продублировал сетку и ярлык, чтобы поддержать 10 игроков.Winform с тысячами элементов управления рендерингом

Ядро игры отлично работает. Однако с более чем 3 000 меток рендеринг начинает бороться.

Итак, вот мой вопрос: есть ли способ улучшить рендеринг моего приложения?

я могу заменить этикетки для другого элемента управления пользователя, но я хотел бы, чтобы избежать попадания в DirectX/OpenGL рисунок (даже если это лучшее решение, у меня не было достаточно времени, чтобы пройти через кривую обучения)

ответ

2

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

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

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

Я также понимаю, что это меняет вашу концепцию и потребует много изменений в кодировке, но это намного проще, чем directx/opengl route.

Удачи вам!

+0

Интересно. Я попробую, и я посмотрю, соответствует ли он моему коду. –

1

Каждый элемент управления в вашей форме имеет свою собственную ручку и обрабатывается как отдельное окно. Окно не будет обрабатывать большое количество элементов управления (в точке Windowing, WPF не использует отдельный дескриптор окна для каждого элемента управления, а вместо него для всего окна).

3000+ элементов управления - отличная идея, и вы это знаете, но давайте попробуем применить полосовую помощь, хотя мы мало знаем о вашем приложении!

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

  • Вы скрываете какие-либо элементы управления, если вы используете свойство Visible или достигаете этого с помощью BackColor элемента управления? Сделав ненужные элементы управления невидимыми, вы можете сэкономить на ненужных красках. Помните о влиянии скрытия элементов управления и отключении их. Элементы управления отключены.

  • Хотя это не повлияет на скорость рендеринга, если у вас есть мерцание, я бы посмотрел на double buffering. Используйте флаг WS_EX_COMPOSITED, который был введен с XP и (как сообщается, также работает в Windows 8), это обеспечит двойную буферизацию формы и ее элементов управления.Вопрос распространяется на этот вопрос: Winforms Double Buffering

+0

Я знал о дескрипторе в WinForm. Я не знал, что WPF использует один дескриптор для каждого окна. Я попробую. –

Смежные вопросы