Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
1 / 1 / 1
Регистрация: 16.09.2013
Сообщений: 80
1

Мерцание при рандомном добавлении объекта

20.05.2014, 19:27. Показов 1568. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.нарисовал анимацию,нужно рандомно добавить дерево,но когда оно добавляется начинает очень сильно лагать,в чем причина не пойму,причем лагает только в области движения машины.
Вложения
Тип файла: zip 111.zip (56.4 Кб, 16 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.05.2014, 19:27
Ответы с готовыми решениями:

Мерцание при добавлении компонентов на форму
У меня на форме есть компонент Panel в которую я программно добавляю PictureBox-ы: PictureBox pb...

Мерцание при отрисовке объекта
Вечер добрый! Собственно, в моей программе при круговом движении эллипса наблюдается мерцание на...

NullPointerException при добавлении объекта в ArrayList
Здравствуйте! Проблема в том, что при добавлении объекта в список ArrayList, моя программа выдаёт...

Дублирование в другую таблицу при добавлении объекта
Пишу маленький проект с многоуровневой архитектурой. Использую EF, automapper, для маппинга дто...

11
1 / 1 / 1
Регистрация: 16.09.2013
Сообщений: 80
20.05.2014, 20:35  [ТС] 2
вот код

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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace lab3ig
{
    public partial class Form1 : Form
    {
        Timer autoRefreshTimer = new Timer(); 
        private int xPos = 0;
        private int yPos = 0;
      
        
        
        public Form1()
        {
            InitializeComponent();
           
            autoRefreshTimer.Tick += new EventHandler(updateImage);
            autoRefreshTimer.Interval = 10;
          
        }
        private void updateImage(object sender, EventArgs e)
        {
            xPos += 1;
            pictureBox1.Invalidate(new Rectangle(0, 80, 600, 184));
        }
        private void drawImage(Graphics g)
        {
 
            SolidBrush darkGray = new SolidBrush(Color.DarkGray);
            SolidBrush black = new SolidBrush(Color.Black);
            SolidBrush orange = new SolidBrush(Color.Orange);
            SolidBrush red = new SolidBrush(Color.Red);
            SolidBrush brown = new SolidBrush(Color.Brown);
            SolidBrush green = new SolidBrush(Color.Green);
 
            g.FillRectangle(brown, 100, 80, 18, 100);
            g.FillEllipse(green, 60, 30, 100, 100);
 
            g.FillRectangle(darkGray, xPos + 10, yPos + 135, 185, 35);
 
            g.FillRectangle(black, xPos + 10, yPos + 140, 185, 1);
 
            g.FillRectangle(black, xPos + 55, yPos + 100, 95, 35);
 
            g.FillRectangle(darkGray, xPos + 56, yPos + 101, 45, 33);
            g.FillRectangle(darkGray, xPos + 102, yPos + 101, 47, 33);
 
            g.FillEllipse(black, xPos + 30, yPos + 155, 30, 30);
            g.FillEllipse(black, xPos + 150, yPos + 155, 30, 30);
 
            g.FillRectangle(darkGray, xPos + 45, yPos + 155, 1, 30);
            g.FillRectangle(darkGray, xPos + 30, yPos + 170, 30, 1);
 
            g.FillRectangle(darkGray, xPos + 165, yPos + 155, 1, 30);
            g.FillRectangle(darkGray, xPos + 150, yPos + 170, 30, 1);
 
            g.FillEllipse(orange, xPos + 185, yPos + 140, 15, 15);
 
            g.FillRectangle(black, 0, 185, 600, 18);
            g.FillRectangle(brown, 400, 135, 18, 100);
            g.FillEllipse(green, 360, 80, 100, 100);
 
            
            Random rand = new Random();
 
            int y = rand.Next(1, 50);
            int u = rand.Next(10, 300);
            g.FillRectangle(brown,  y, u, 70, 7);
 
        }
        private void Form1_Load(object sender, EventArgs e)
        {
        
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            autoRefreshTimer.Start();
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            autoRefreshTimer.Stop();
        }
 
        private void pictureBox1_Click(object sender, EventArgs e)
        {
 
        }
 
        private void paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            SolidBrush green = new SolidBrush(Color.Green);
            SolidBrush brown = new SolidBrush(Color.Brown);
          
            drawImage(g);
        }
 
        private void button2_Click_1(object sender, EventArgs e)
        {
 
        }
    }
}
0
191 / 180 / 114
Регистрация: 28.07.2013
Сообщений: 606
20.05.2014, 21:29 3
Скачал Ваш проект... запустил... анимация работает нормально, только мерцает (с каждым тиком таймера) коричневый прямоугольник размерами 70х7 в диапазоне заданном рандомно (у меня мышь по форме бегает нормально и лагов нет, мерцание только в диапазоне y,u), как вы указали здесь:

Цитата Сообщение от viktorius73 Посмотреть сообщение
Random rand = new Random(); int y = rand.Next(1, 50); int u = rand.Next(10, 300); g.FillRectangle(brown, y, u, 70, 7);
пока не ясно, что вы хотите - посадить лес (с каждым тиком по дереву) или разово случайно одно дерево и на том остановиться, или же что то другое?
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
20.05.2014, 23:03 4
http://msdn.microsoft.com/ru-r... .110).aspx

м?
0
1 / 1 / 1
Регистрация: 16.09.2013
Сообщений: 80
20.05.2014, 23:37  [ТС] 5
да да,каждый интервал времени он заново задает этот квадратик ,хотелось бы что бы он задал его рандомно один раз за показ всего фильма или же отрисовывал их и оставлял на месте
Добавлено через 1 минуту
DoubleBuffered у меня был включен по началу,я его выключил,изменений не заметил
0
191 / 180 / 114
Регистрация: 28.07.2013
Сообщений: 606
21.05.2014, 00:18 6
один из вариантов для того
Цитата Сообщение от viktorius73 Посмотреть сообщение
что бы он задал его рандомно один раз за показ всего фильма
вот эту часть
C#
1
2
3
Random rand = new Random();
 y = rand.Next(1, 50);
 u = rand.Next(10, 300);
можно прописать тут:
C#
1
2
3
4
5
6
7
private void button1_Click(object sender, EventArgs e)
        {
            Random rand = new Random();
            y = rand.Next(1, 50);
            u = rand.Next(10, 300);
            autoRefreshTimer.Start();
        }
...или при истечении определённого времени в таймере...
0
1 / 1 / 1
Регистрация: 16.09.2013
Сообщений: 80
21.05.2014, 00:22  [ТС] 7
эмм,так он же работать не будет
0
191 / 180 / 114
Регистрация: 28.07.2013
Сообщений: 606
21.05.2014, 00:27 8
будет, объяви y, u как int заранее

Добавлено через 1 минуту
Вот примерно так :
Кликните здесь для просмотра всего текста

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
int y=-1,u;
        
        private void updateImage(object sender, EventArgs e)
        {
            xPos += 1;
            pictureBox1.Invalidate(new Rectangle(0, 80, 600, 184));
        }
        private void drawImage(Graphics g)
        {
 
            SolidBrush darkGray = new SolidBrush(Color.DarkGray);
            SolidBrush black = new SolidBrush(Color.Black);
            SolidBrush orange = new SolidBrush(Color.Orange);
            SolidBrush red = new SolidBrush(Color.Red);
            SolidBrush brown = new SolidBrush(Color.Brown);
            SolidBrush green = new SolidBrush(Color.Green);
 
            g.FillRectangle(brown, 100, 80, 18, 100);
            g.FillEllipse(green, 60, 30, 100, 100);
            
            g.FillRectangle(darkGray, xPos + 10, yPos + 135, 185, 35);
 
            g.FillRectangle(black, xPos + 10, yPos + 140, 185, 1);
 
            g.FillRectangle(black, xPos + 55, yPos + 100, 95, 35);
 
            g.FillRectangle(darkGray, xPos + 56, yPos + 101, 45, 33);
            g.FillRectangle(darkGray, xPos + 102, yPos + 101, 47, 33);
 
            g.FillEllipse(black, xPos + 30, yPos + 155, 30, 30);
            g.FillEllipse(black, xPos + 150, yPos + 155, 30, 30);
 
            g.FillRectangle(darkGray, xPos + 45, yPos + 155, 1, 30);
            g.FillRectangle(darkGray, xPos + 30, yPos + 170, 30, 1);
 
            g.FillRectangle(darkGray, xPos + 165, yPos + 155, 1, 30);
            g.FillRectangle(darkGray, xPos + 150, yPos + 170, 30, 1);
 
            g.FillEllipse(orange, xPos + 185, yPos + 140, 15, 15);
 
            g.FillRectangle(black, 0, 185, 600, 18);
            g.FillRectangle(brown, 400, 135, 18, 100);
            g.FillEllipse(green, 360, 80, 100, 100);
            
            if(y != -1){
                g.FillRectangle(brown,  y, u, 18, 100);
                g.FillEllipse(green, y-40, u-50, 100, 100);
            }
 
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Random rand = new Random();
            y = rand.Next(1, 50);
            u = rand.Next(10, 300);
            autoRefreshTimer.Start();
        }
0
1 / 1 / 1
Регистрация: 16.09.2013
Сообщений: 80
21.05.2014, 00:27  [ТС] 9
да,получилось,а можно сделать чтобы он отрисовал рандомно к примеру 10 деревьев?
0
191 / 180 / 114
Регистрация: 28.07.2013
Сообщений: 606
21.05.2014, 00:36 10
Нет ничего невозможного, просто мы можем не знать решений

А что бы отрисовывать несколько объектов, можно добавлять из через определённый интервал, например:
если таймер тикнул 5 раз + 1 объект
или если перемещаемый объект (здесь машина) достиг определённые координат и т.д. и т.п.
0
1 / 1 / 1
Регистрация: 16.09.2013
Сообщений: 80
21.05.2014, 00:38  [ТС] 11
а в коде могли бы это показать?
0
191 / 180 / 114
Регистрация: 28.07.2013
Сообщений: 606
21.05.2014, 18:54 12
Лучший ответ Сообщение было отмечено viktorius73 как решение

Решение

Цитата Сообщение от viktorius73 Посмотреть сообщение
а в коде могли бы это показать?
тут на скорую руку:

Кликните здесь для просмотра всего текста
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
int x=0,q=0;
        int[] y= new int[5];
        int[] u = new int[5];
        
        private void updateImage(object sender, EventArgs e)
        {
            xPos += 1;            
            pictureBox1.Invalidate(new Rectangle(0, 80, 600, 184));
        }
        private void drawImage(Graphics g)
        {
 
            SolidBrush darkGray = new SolidBrush(Color.DarkGray);
            SolidBrush black = new SolidBrush(Color.Black);
            SolidBrush orange = new SolidBrush(Color.Orange);
            SolidBrush red = new SolidBrush(Color.Red);
            SolidBrush brown = new SolidBrush(Color.Brown);
            SolidBrush green = new SolidBrush(Color.Green);
 
            g.FillRectangle(brown, 100, 80, 18, 100);
            g.FillEllipse(green, 60, 30, 100, 100);
            
            g.FillRectangle(darkGray, xPos + 10, yPos + 135, 185, 35);
 
            g.FillRectangle(black, xPos + 10, yPos + 140, 185, 1);
 
            g.FillRectangle(black, xPos + 55, yPos + 100, 95, 35);
 
            g.FillRectangle(darkGray, xPos + 56, yPos + 101, 45, 33);
            g.FillRectangle(darkGray, xPos + 102, yPos + 101, 47, 33);
 
            g.FillEllipse(black, xPos + 30, yPos + 155, 30, 30);
            g.FillEllipse(black, xPos + 150, yPos + 155, 30, 30);
 
            g.FillRectangle(darkGray, xPos + 45, yPos + 155, 1, 30);
            g.FillRectangle(darkGray, xPos + 30, yPos + 170, 30, 1);
 
            g.FillRectangle(darkGray, xPos + 165, yPos + 155, 1, 30);
            g.FillRectangle(darkGray, xPos + 150, yPos + 170, 30, 1);
 
            g.FillEllipse(orange, xPos + 185, yPos + 140, 15, 15);
 
            g.FillRectangle(black, 0, 185, 600, 18);
            g.FillRectangle(brown, 400, 135, 18, 100);
            g.FillEllipse(green, 360, 80, 100, 100);
            for(int i=0;i<q;i++){
                g.FillRectangle(brown,  Convert.ToInt32(y[i]), Convert.ToInt32(u[i]), 18, 100);
                g.FillEllipse(green, Convert.ToInt32(y[i])-40, Convert.ToInt32(u[i])-50, 100, 100);
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            autoRefreshTimer.Start();
        }
        private void paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;            
            SolidBrush green = new SolidBrush(Color.Green);
            SolidBrush brown = new SolidBrush(Color.Brown);            
            drawImage(g);
            if(x==10 && q<5){
                Random rand = new Random();
                y[q] = rand.Next(10, 300);
                u[q] = rand.Next(10, 250);
                g.FillRectangle(brown,  Convert.ToInt32(y[q]), Convert.ToInt32(u[q]), 18, 100);
                g.FillEllipse(green, Convert.ToInt32(y[q])-40, Convert.ToInt32(u[q])-50, 100, 100);
                x=0;
                q++;
            }            
        }
        
        void Button2Click(object sender, EventArgs e)
        {
            autoRefreshTimer.Stop();            
        }
        
        void Timer1Tick(object sender, EventArgs e)
        {
            
            autoRefreshTimer.Tick += new EventHandler(updateImage);
            x++;
        }
1
21.05.2014, 18:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.05.2014, 18:54
Помогаю со студенческими работами здесь

При добавлении объекта приложение выпадает ошыбка
Раньше был вот такой код (приведен ниже) для выделения диапазона ячеек. Range(&quot;A1&quot;).Activate...

Ошибка при программном добавлении объекта на форму
Привет! Возникла такая проблема: при программном добавлении на форму текстбоксов и лейблов...

При добавлении объекта в бд у поля ID слетает свойство identity
В модели имеем id: public Int64 Id { get; set; } В бд изначально создал табличку, с полем...

Ошибка при добавлении в вектор объекта типа thread
функцию запускаю void Sorted_Char( char *Memory_Damp, int i_find, int size_arr, std::vector &lt;...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru