Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# Windows Forms

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.81
Kill100
419 / 285 / 39
Регистрация: 11.12.2010
Сообщений: 1,193
Завершенные тесты: 1
#1

Оптимизация отрисовки, или как добиться плавности интерфейса - C#/.NET 4.x

04.03.2012, 13:00. Просмотров 2451. Ответов 14
Метки нет (Все метки)

Во время написания проги заметил очень неприятный эффект.
При максимизации (развертывании) её на весь экран или изменения размера формы система сильно тормозит и на форме на некоторое время появляются дикие артефакты.
Что на форме:
Panel - 15 шт. В них указано изображение в среднем 1x7, 2x12 пикселов режим замощения. + свойство Anchor = AnchorStyles.Top | низ| Право или Лево;

И вот это всё глючит жесть как.

Вопрос:
Если увеличу изображения до больших размеров глюки исчезнут?
Или надо делать что то другое. Ведь видел много прог с красивейшим интерфейсов на WinForm.

PS возможно не в тот раздел.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2012, 13:00
Я подобрал для вас темы с готовыми решениями и ответами на вопрос .NET 4.x Оптимизация отрисовки, или как добиться плавности интерфейса (C#):

Как сделать свой интрепретатор C# или подключаемую из интерфейса DLL ? - C#
Возможно я не совсем правильно обозвал эту тему, но смысл следующий. Есть программа работающая с сервером, получает и обрабатывает от...

Для отрисовки Windows Forms используется процессор или видеокарта? - C#
Для отрисовки Windows Forms используется процессор или видеокарта? Насколько знаю, для отрисовки WPF может использоваться видеокарта....

Оптимизация UnsafeBitmap, или как ещё можно ускорить обработку Изображений? - C#
Доброго времени суток.. У меня возникла такая проблема, пишу библиотеку на C# для работы с 2D графикой, в её функционал входит генерация,...

Как очистить экран после отрисовки DrawString-ом? - C#
При отрисовке текста на экране с помощью g.DrawString он остается на экране пока окно, поверх которого он был нарисован, не обновится (то...

Как добиться эффекта SpeedButton - C#
Всем привет!!!!! Подскажите пж Как добиться эффекта SpeedButton (кнопка в делфи) нажимаешь и у нее (остается) состояние нажатое или нет...

Как добиться неоднозначности интерфейса что бы компилятор не мог понять какой метод вызывать? - C#
Как добиться неоднозначности интерфейса что бы компилятор не мог понять какой метод вызывать? возможно ли это? using System; ...

14
DimanRu
679 / 672 / 49
Регистрация: 15.06.2011
Сообщений: 1,699
04.03.2012, 13:26 #2
Вы используете DirectX ?
Цитата Сообщение от Kill100 Посмотреть сообщение
Ведь видел много прог с красивейшим интерфейсов на WinForm.
Почти все они используют DirectX или OpenGL. Копайте эту сторону.
0
Kill100
419 / 285 / 39
Регистрация: 11.12.2010
Сообщений: 1,193
Завершенные тесты: 1
04.03.2012, 13:46  [ТС] #3
Цитата Сообщение от DimanRu Посмотреть сообщение
Вы используете DirectX ?

Почти все они используют DirectX или OpenGL. Копайте эту сторону.
Это как?
Я просто на форму понакидал полей и с их помощью сделал дизайн.
Если можно подробнее объясните.
И в этом случае можно всю форму рендерить OpenGL / DirectX
(ПС а если комп не держит новые OpenGL / DirectX )

Пример куска кода
C#
1
2
3
4
5
6
7
for(int i =0; i<Panels.Lenght;i++){
PanelS[i] = new Panel();
.....
.....
PanelS[i].Anchor = AnchorStyles.Top|.|.|;
PanelS[i].BackgroundImage = ResourseList[i].Value;
}
0
DimanRu
679 / 672 / 49
Регистрация: 15.06.2011
Сообщений: 1,699
04.03.2012, 15:47 #4
Я вас понял, вы используете GDI, про умолчанию. Почитайте в разделе про использование библеотек DirectX и OpenGL, я сам не пользовался ими ещё, только звуком, но мне кажется это поможет!

P.S. Не думаю что даже старый комп не потянет OpenGL. Кстати, а может у вас просто компьютер не в силах выполнить такое растяжение?
Цитата Сообщение от Kill100 Посмотреть сообщение
(ПС а если комп не держит новые OpenGL / DirectX )
0
Kill100
419 / 285 / 39
Регистрация: 11.12.2010
Сообщений: 1,193
Завершенные тесты: 1
04.03.2012, 17:20  [ТС] #5
Цитата Сообщение от DimanRu Посмотреть сообщение
Я вас понял, вы используете GDI, про умолчанию. Почитайте в разделе про использование библеотек DirectX и OpenGL, я сам не пользовался ими ещё, только звуком, но мне кажется это поможет!
Пробовал сделать рендеринг всей формы в DX но стало еще хуже
C#
1
2
3
// using Microsoft.DirectX;
// using Microsoft.DirectX.Direct3D;
// using Microsoft.DirectX.PrivateImplementationDetails;
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
        public Device d3dDevice;
 
        /// <summary>
        /// This method basically creates and initialize the Direct3D device and
        /// anything else that doens't need to be recreated after a device 
        /// reset.
        /// </summary>
        internal void Init()
        {
            // Does the hardware support a 16-bit z-buffer?
            if (!Manager.CheckDeviceFormat(Manager.Adapters.Default.Adapter,
                                           DeviceType.Hardware,
                                           Manager.Adapters.Default.CurrentDisplayMode.Format,
                                           Usage.DepthStencil,
                                           ResourceType.Surface,
                                           DepthFormat.D16))
            {
                // POTENTIAL PROBLEM: We need at least a 16-bit z-buffer!
                return;
            }
 
            //
            // Do we support hardware vertex processing? if so, use it. 
            // If not, downgrade to software.
            //
 
            Caps caps = Manager.GetDeviceCaps(Manager.Adapters.Default.Adapter,
                                                   DeviceType.Hardware);
            CreateFlags flags;
 
            if (caps.DeviceCaps.SupportsHardwareTransformAndLight)
                flags = CreateFlags.HardwareVertexProcessing;
            else
                flags = CreateFlags.SoftwareVertexProcessing;
 
            //
            // Everything checks out - create a simple, windowed device.
            //
 
            PresentParameters d3dpp = new PresentParameters();
 
            d3dpp.BackBufferFormat = Format.Unknown;
            d3dpp.SwapEffect = SwapEffect.Discard;
            d3dpp.Windowed = true;
            d3dpp.EnableAutoDepthStencil = true;
            d3dpp.AutoDepthStencilFormat = DepthFormat.D16;
            d3dpp.PresentationInterval = PresentInterval.Immediate;
 
            d3dDevice = new Device(0, DeviceType.Hardware, this.Handle, flags, d3dpp);
 
 
            // Register an event-handler for DeviceReset and call it to continue
            // our setup.
            d3dDevice.DeviceReset += new System.EventHandler(this.OnResetDevice);
            OnResetDevice(d3dDevice, null);
        }
        /// <summary>
        /// This event-handler is a good place to create and initialize any 
        /// Direct3D related objects, which may become invalid during a 
        /// device reset.
        /// </summary>
        public void OnResetDevice(object sender, EventArgs e)
        {
            // This sample doens't create anything that requires recreation 
            // after the DeviceReset event.
        }
        private void Render()
        {
            // d3dDevice.Clear(ClearFlags.Target | ClearFlags.ZBuffer,
            // Color.FromArgb(255, 0, 255, 0), 1.0f, 0);
            //this.BackgroundImage = ((System.Drawing.Image)(global::PravoSysteam.Properties.Resources.BG));
            d3dDevice.BeginScene();
            // Render geometry here...
 
            d3dDevice.EndScene();
 
            d3dDevice.Present();
        }
        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            this.Render();
        }
Цитата Сообщение от DimanRu Посмотреть сообщение
P.S. Не думаю что даже старый комп не потянет OpenGL.
Просто прога может запускаться на медленных компах.

Цитата Сообщение от DimanRu Посмотреть сообщение
Кстати, а может у вас просто компьютер не в силах выполнить такое растяжение?
У меня то?
I7-2600k; AMD HD 6950
0
DimanRu
679 / 672 / 49
Регистрация: 15.06.2011
Сообщений: 1,699
04.03.2012, 17:31 #6

Не по теме:

Цитата Сообщение от Kill100 Посмотреть сообщение
У меня то?
I7-2600k; AMD HD 6950
Я просто спросил из-за фразы "ПС а если комп не держит новые OpenGL / DirectX".


Ну я незнаю тогда как сделать...
0
temich-92
c#
88 / 88 / 4
Регистрация: 25.03.2011
Сообщений: 290
04.03.2012, 18:00 #7
попробуйте вместо панелей использовать picbox'ы, или вообще через graphics рисуйте
0
Kill100
419 / 285 / 39
Регистрация: 11.12.2010
Сообщений: 1,193
Завершенные тесты: 1
04.03.2012, 21:03  [ТС] #8
Цитата Сообщение от temich-92 Посмотреть сообщение
попробуйте вместо панелей использовать picbox'ы, или вообще через graphics рисуйте
То же самое на вид быстрее не стало
0
temich-92
c#
88 / 88 / 4
Регистрация: 25.03.2011
Сообщений: 290
05.03.2012, 00:32 #9
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public partial class Form1 : Form
    {
        Graphics graphics;
        BufferedGraphics bufferedGraphics;
        BufferedGraphicsContext bufferedGraphicsContext;
 
        Panel panel;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            ClientSize = new System.Drawing.Size(640, 480);
            panel = new Panel()
            {
                Location = new Point(5, 5),
                Size = new Size(ClientSize.Width - 10, ClientSize.Height - 10),
                Anchor = AnchorStyles.Top,
                BorderStyle = BorderStyle.Fixed3D
            };
            Controls.Add(panel);
 
            graphics = panel.CreateGraphics();
            bufferedGraphicsContext = new BufferedGraphicsContext();
            bufferedGraphics = bufferedGraphicsContext.Allocate(graphics, new Rectangle(0, 0, panel.Width, panel.Height));
        }
 
        public void Draw()
        {
            Image image=WindowsFormsApplication4.Properties.Resources.tank;
            bufferedGraphics.Graphics.Clear(Color.White);
 
            float x = 5, y = 5;
            int counter = 0;
 
            for (int i = 0; i < 300; i++)
            {
                bufferedGraphics.Graphics.DrawImage(image, x, y);
 
                x += image.Width + 5;
                counter++;
                if (counter == 25)
                {
                    counter = 0;
                    x = 5;
                    y += image.Height + 5;
                }
            }
 
            bufferedGraphics.Render();
            
        }
 
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Draw();
        }
если правильно понял то наверно так....
посмотри..(не забудь на события для формы подписаться)
1
Kill100
419 / 285 / 39
Регистрация: 11.12.2010
Сообщений: 1,193
Завершенные тесты: 1
05.03.2012, 00:48  [ТС] #10
Хм.
А если панели в ручную распологал.
Как ни будь циклом пройтись по всем им можно?
0
temich-92
c#
88 / 88 / 4
Регистрация: 25.03.2011
Сообщений: 290
05.03.2012, 08:21 #11
может это и не совсем правильно но вот:
C#
1
2
3
4
foreach (Panel panel in this.Controls)
{
    panel.BackColor = Color.Red;
}
Добавлено через 1 минуту
но раз у тебя их так много то не лучше создать их динамически?
1
Egr66001
35 / 35 / 2
Регистрация: 14.01.2011
Сообщений: 111
05.03.2012, 08:29 #12
просто рисуй на форме через BufferedGraphics, про directx это бред не трать время.
0
Kill100
419 / 285 / 39
Регистрация: 11.12.2010
Сообщений: 1,193
Завершенные тесты: 1
05.03.2012, 19:56  [ТС] #13
Б кароче не понял нечего.
Набросал просто панелей примерно в таком же количевстве как у меня ТОльк картинки на них у каждой другие.
И если форму во весь экран развернуть попробовать то будут жутки артефакты на несколько сек.
0
Вложения
Тип файла: zip WindowsFormsApplication2.zip (103.8 Кб, 7 просмотров)
temich-92
06.03.2012, 17:00
  #14

Не по теме:

еще бы не тормозило...12 панелей и все растягиваются до ширины экрана при максимизации..

1
Egr66001
35 / 35 / 2
Регистрация: 14.01.2011
Сообщений: 111
07.03.2012, 06:02 #15
ты для того чтобы рисовать ты используешь контроллы, внутри которых при изменении размеров отрабатываются различные события, в этом проичина тормозов. как я уже писал раньше рисуй непосредственно на форме. проще через Graphics но будет мерцать. BufferedGraphics немного посложнее, но результат будет намного лучше
0
07.03.2012, 06:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.03.2012, 06:02
Привет! Вот еще темы с ответами:

Оптимизация интерфейса програмы - Delphi
Народ, столкнулся с такой проблемой, что на другом компьютере моя программа выглядит не так( Скажите, это можно как то решить? Я...

Как добиться обтекания текстом (справа или слева) одновременно двух/трех картинок - HTML, CSS
ВСЕМ привет! Подскажите как добиться обтекания текстом (справа или слева) одновременно двух/трех картинок (одной ширины но рзн...

Как пингануть с интерфейса или с ip - Debian Linux
всем привет не получается простая вещь на хосте 2 интерфейса eth0 и eth1 мне нужно пингануть узел находящийся в сети eth1 из сети...

GIF! Как текст лучше сохранить ни теряя его плавности? - Web-дизайн
сама картинка gif полностью прозрачная, а текст белый, сохраняю как gif, в итоге на веб-странице он выглядит какбуд-то подраный, видно что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru