Как улучшить производительность рисования в WinForms?C#

Место общения программистов C#
Ответить
Гость
 Как улучшить производительность рисования в WinForms?

Сообщение Гость »


Я понимаю, что Winforms не предназначен для интенсивного использования графики, но я не знаю ничего, кроме C#, поэтому на протяжении многих лет я создавал различные программы с использованием C# и Visual Studio, которые расширяют возможности (по моему мнению) того, что можно эффективно сделать с ограничениями Visual Studio/Winforms.

Пример просмотра рассматриваемой программы

Эта программа читает файлы в формате Rock Band и воспроизводит их, как музыкальный проигрыватель, с дополнительной функцией, заключающейся в том, что она использует дополнительную информацию из файла Rock Band, такую ​​как чарты, обложки альбомов и тексты песен, для завершения работы. Все работает очень хорошо. Рисунок выполнен на графике, все изображения не загружаются и не перемещаются (что, как я обнаружил, медленнее).

Каждый экземпляр графики сопровождается следующим кодом, который я нашел здесь:

graphics.SmoothingMode = SmoothingMode.HighSpeed; Graphics.CompositingQuality = CompositingQuality.HighSpeed; Что, как я полагал, повысит производительность.

Все рисование происходит на основе таймера, который работает с частотой 60 Гц (16 мс), поэтому 60 раз в секунду он рисует все на экране. Это работает для всего, кроме текстов. Я могу без проблем сохранить тексты песен в статическом режиме или в режиме караоке. Но если я настрою их на прокрутку вместе с вокальными нотами (на изображении выше синие ноты внизу, текст должен привязываться к этим нотам и прокручиваться вместе с ними), их станет невозможно прочитать, если вы не сделаете паузу, тогда это очень разборчиво. Я пробовал играть с частотой обновления таймера от 1 до 500 мс, и поведение не изменилось. Неразборчивая прокрутка текста.

Это соответствующий код для прокрутки текста песни:

private void DrawLyricsScrolling (текст IEnumerable, метка управления, цвет цвета, графическая графика) { if (!openSideWindow.Checked || PlayingSong == null || btnPlayPause.Tag.ToString() == "играть" || !doScrollingLyrics) возвращаться; вар время = GetCorrectedTime(); label.Text = ""; Graphics.SmoothingMode = SmoothingMode.HighSpeed; Graphics.CompositingQuality = CompositingQuality.HighSpeed; используя (var pen = new SolidBrush(MediaPlayer.Visible? picVisuals.BackColor: LabelBackgroundColor)) { графики.FillRectangle(перо, метка.ClientRectangle); } foreach (var lyric in Lyric.TakeWhile(lyric => lyric.LyricStart !(lyric.LyricStart + (PlaybackWindow * 2) < time))) { var left = (int)(((lyric.LyricStart - время)/PlaybackWindow) * label.Width); TextRenderer.DrawText(graphics,lyric.LyricText,label.Font,new Point(left, 0),color); } } Я надеюсь, что вы сможете указать мне, что я делаю неправильно или чего мне вообще не хватает для повышения производительности, если это вообще возможно, в рамках Winforms. В этой программе у меня более 6000 строк уникального кода, поэтому я не собираюсь переходить на WPF или другой язык или среду. Либо его можно улучшить в C#/Winforms, либо оставить так.

Спасибо!
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»