С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.93/14: Рейтинг темы: голосов - 14, средняя оценка - 4.93
Kill100
420 / 286 / 81
Регистрация: 11.12.2010
Сообщений: 1,200
Завершенные тесты: 1
1

Оптимизация отрисовки, или как добиться плавности интерфейса

04.03.2012, 13:00. Просмотров 2709. Ответов 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
Ответы с готовыми решениями:

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

Для отрисовки Windows Forms используется процессор или видеокарта?
Для отрисовки Windows Forms используется процессор или видеокарта? Насколько...

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

Как очистить экран после отрисовки DrawString-ом?
При отрисовке текста на экране с помощью g.DrawString он остается на экране...

Как добиться эффекта SpeedButton
Всем привет!!!!! Подскажите пж Как добиться эффекта SpeedButton (кнопка в...

14
DimanRu
684 / 677 / 167
Регистрация: 15.06.2011
Сообщений: 1,701
04.03.2012, 13:26 2
Вы используете DirectX ?
Цитата Сообщение от Kill100 Посмотреть сообщение
Ведь видел много прог с красивейшим интерфейсов на WinForm.
Почти все они используют DirectX или OpenGL. Копайте эту сторону.
0
Kill100
420 / 286 / 81
Регистрация: 11.12.2010
Сообщений: 1,200
Завершенные тесты: 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
684 / 677 / 167
Регистрация: 15.06.2011
Сообщений: 1,701
04.03.2012, 15:47 4
Я вас понял, вы используете GDI, про умолчанию. Почитайте в разделе про использование библеотек DirectX и OpenGL, я сам не пользовался ими ещё, только звуком, но мне кажется это поможет!

P.S. Не думаю что даже старый комп не потянет OpenGL. Кстати, а может у вас просто компьютер не в силах выполнить такое растяжение?
Цитата Сообщение от Kill100 Посмотреть сообщение
(ПС а если комп не держит новые OpenGL / DirectX )
0
Kill100
420 / 286 / 81
Регистрация: 11.12.2010
Сообщений: 1,200
Завершенные тесты: 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
684 / 677 / 167
Регистрация: 15.06.2011
Сообщений: 1,701
04.03.2012, 17:31 6

Не по теме:

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


Ну я незнаю тогда как сделать...
0
temich-92
c#
90 / 90 / 27
Регистрация: 25.03.2011
Сообщений: 290
04.03.2012, 18:00 7
попробуйте вместо панелей использовать picbox'ы, или вообще через graphics рисуйте
0
Kill100
420 / 286 / 81
Регистрация: 11.12.2010
Сообщений: 1,200
Завершенные тесты: 1
04.03.2012, 21:03  [ТС] 8
Цитата Сообщение от temich-92 Посмотреть сообщение
попробуйте вместо панелей использовать picbox'ы, или вообще через graphics рисуйте
То же самое на вид быстрее не стало
0
temich-92
c#
90 / 90 / 27
Регистрация: 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();
        }
если правильно понял то наверно так....
посмотри..(не забудь на события для формы подписаться)
2
Kill100
420 / 286 / 81
Регистрация: 11.12.2010
Сообщений: 1,200
Завершенные тесты: 1
05.03.2012, 00:48  [ТС] 10
Хм.
А если панели в ручную распологал.
Как ни будь циклом пройтись по всем им можно?
0
temich-92
c#
90 / 90 / 27
Регистрация: 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 / 1
Регистрация: 14.01.2011
Сообщений: 111
05.03.2012, 08:29 12
просто рисуй на форме через BufferedGraphics, про directx это бред не трать время.
0
Kill100
420 / 286 / 81
Регистрация: 11.12.2010
Сообщений: 1,200
Завершенные тесты: 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 / 1
Регистрация: 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

Как добиться плавности перемещения
Как добиться плавности перемещения камеры? В каких-то статьях написано, что...

Как добиться неоднозначности интерфейса что бы компилятор не мог понять какой метод вызывать?
Как добиться неоднозначности интерфейса что бы компилятор не мог понять какой...

Улучшаем начинку. Или как студенту добиться дзена
Приветствую, уважаемые. Захотелось немного порадовать себя и заняться...


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

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

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