Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 22.10.2010
Сообщений: 29

Жизнь "игра" - При обработке поля 1000*600 возникают серьезные тормоза

15.02.2013, 22:00. Показов 2502. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер.
Написал "жизнь". Сначала была проблема в скорости прорисовки, которую я решил использованием BufferedGraphics. Теперь возникла новая проблема: при обработке поля, например, 1000*600 возникают серьезные тормоза. Размер 200*200 обрабатывает хорошо и быстро, но нагружает процессор на 8 процентов (у меня интел с восемью виртуальными ядрами). То есть, нагружается половина одного виртуального ядра. При размере 1000*600 загрузка этого ядра полная, то есть 12-13 процентов.
Алгоритм, который рассчитывает новую доску, ниже:
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
 private void generation_Tick(object sender, EventArgs e)
        {
            bool[,] tmp = new bool[size_x, size_y];
            for (int i = 0; i < size_x; ++i)
                for (int j = 0; j < size_y; ++j)
                    tmp[i, j] = desk[i, j];
            int c;
            for (int i = 0; i < size_x; ++i)
                for (int j = 0; j < size_y; ++j)
                {
                    c = count(i, j);
                    if (desk[i, j] == true)
                    {
                        if (c <= 1 || c >= 4) tmp[i, j] = false;
                    }
 
                    else
                    {
                        if (c == 3) tmp[i, j] = true;
                    }
                }
            for (int i = 0; i < size_x; ++i)
                for (int j = 0; j < size_y; ++j)
                    desk[i, j] = tmp[i, j];
 
            draw();
        }
Здесь используется вызов функции count, которая считает количество соседей клетки. Вот и она:
Кликните здесь для просмотра всего текста
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
        private int count(int x, int y)
        {
            int c = 0;
 
            if (x > 0 && y > 0 && x < size_x - 1 && y < size_y - 1)
            {
                if (desk[x - 1, y - 1] == true) ++c;
                if (desk[x - 1, y] == true) ++c;
                if (desk[x - 1, y + 1] == true) ++c;
                if (desk[x, y - 1] == true) ++c;
                if (desk[x, y + 1] == true) ++c;
                if (desk[x + 1, y - 1] == true) ++c;
                if (desk[x + 1, y] == true) ++c;
                if (desk[x + 1, y + 1] == true) ++c;
            }
 
            else if (x == 0 && y > 0 && y < size_y - 1)
            {
                if (desk[x, y - 1] == true) ++c;
                if (desk[x, y + 1] == true) ++c;
                if (desk[x + 1, y - 1] == true) ++c;
                if (desk[x + 1, y] == true) ++c;
                if (desk[x + 1, y + 1] == true) ++c;
            }
 
            else if (x == size_x - 1 && y > 0 && y < size_y - 1)
            {
                if (desk[x - 1, y - 1] == true) ++c;
                if (desk[x - 1, y] == true) ++c;
                if (desk[x - 1, y + 1] == true) ++c;
                if (desk[x, y - 1] == true) ++c;
                if (desk[x, y + 1] == true) ++c;
            }
 
            else if (x > 0 && x < size_x - 1 && y == 0)
            {
                if (desk[x - 1, y] == true) ++c;
                if (desk[x - 1, y + 1] == true) ++c;
                if (desk[x, y + 1] == true) ++c;
                if (desk[x + 1, y] == true) ++c;
                if (desk[x + 1, y + 1] == true) ++c;
            }
 
            else if (x > 0 && x < size_x - 1 && y == size_y - 1)
            {
                if (desk[x - 1, y - 1] == true) ++c;
                if (desk[x - 1, y] == true) ++c;
                if (desk[x, y - 1] == true) ++c;
                if (desk[x + 1, y - 1] == true) ++c;
                if (desk[x + 1, y] == true) ++c;
            }
 
            else if (x == 0 && y == 0)
            {
                if (desk[x, y + 1] == true) ++c;
                if (desk[x + 1, y] == true) ++c;
                if (desk[x + 1, y + 1] == true) ++c;
            }
 
            else if (x == size_x - 1 && y == size_y - 1)
            {
                if (desk[x - 1, y - 1] == true) ++c;
                if (desk[x - 1, y] == true) ++c;
                if (desk[x, y - 1] == true) ++c;
            }
 
            else if (x == 0 && y == size_y - 1)
            {
                if (desk[x, y - 1] == true) ++c;
                if (desk[x + 1, y - 1] == true) ++c;
                if (desk[x + 1, y] == true) ++c;
            }
 
            else if (x == size_x - 1 && y == 0)
            {
                if (desk[x - 1, y] == true) ++c;
                if (desk[x - 1, y + 1] == true) ++c;
                if (desk[x, y + 1] == true) ++c;
            }
 
            return c;
        }


Функция generation_Tick вызывается каждые 50 миллисекунд, по таймеру.
Прошу помочь ускорить работу.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.02.2013, 22:00
Ответы с готовыми решениями:

Игра "Жизнь". Метод проверки поля
Доброго времени суток. Начинаю программировать Windows приложения и не во всем еще разобрался, заранее спасибо за помощь. Задача:...

Инженер по тестированию (600-1000 $)
Инженер по тестированию (600-1000 $) Город: Москва Требования

Vacancy: Tester/QA Engineer $600-1000
&lt;H3 style=&quot;MARGIN: 0cm 0cm 0pt &lt;SPAN style=&quot;FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Tahoma &lt;FONT size=2&gt;Тестировщик ПО&lt;?xml:namespace...

4
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
15.02.2013, 23:00
1 вариант: переносить расчёты на GPU - OpenCL\CUDA (или вообще чисто на GPU - DirectX, XNA, OpenGL).
2 вариант: пытаться оптимизировать код - избавляться от циклов и условий. Под спойлером вообще ужас - если я не ошибаюсь программа отрабатывает все условия, воспользуйтесь конструкцией switch - case, там хоть перебор происходит и при вызове break программа больше не проходит по всем условиям.
0
0 / 0 / 0
Регистрация: 22.10.2010
Сообщений: 29
16.02.2013, 00:15  [ТС]
С точки зрения читабельности да - ужас. Но там я избежал цикла. Переносить расчеты на GPU - это, безусловно, круто, но метод плохой, на мой взгляд. Раньше не было таких технологий, и компьютеры были слабее, но все равно прекрасно работало. Если я ошибаюсь, буду рад прочитать, почему. Я учусь, и мне это полезно.
Посоветуете что-нибудь конкретное для оптимизации? Просто, я с этим еще не сталкивался практически.
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
16.02.2013, 13:00
Цитата Сообщение от Graz Посмотреть сообщение
С точки зрения читабельности да - ужас.
да не с точки зрения читабельности там ужас, а с точки зрения производительности.

Цитата Сообщение от Graz Посмотреть сообщение
Переносить расчеты на GPU - это, безусловно, круто, но метод плохой, на мой взгляд.
и чем же он плох? Просчитывать в 400 раз быстрее это по вашему плохо.

Цитата Сообщение от Graz Посмотреть сообщение
Посоветуете что-нибудь конкретное для оптимизации?
Цитата Сообщение от _lunar_ Посмотреть сообщение
воспользуйтесь конструкцией switch - case
0
432 / 433 / 93
Регистрация: 16.07.2012
Сообщений: 886
16.02.2013, 13:42
Для начала можно копирование массивов оптимизировать. Например, вместо:
C#
1
2
3
for (int i = 0; i < size_x; ++i)
  for (int j = 0; j < size_y; ++j)
    tmp[i, j] = desk[i, j];
сделать
C#
1
Array.Copy(desk, tmp, size_x * size_y);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.02.2013, 13:42
Помогаю со студенческими работами здесь

Vacancy: Tester/QA Engineer $600-1000
&lt;H3 style=&quot;MARGIN: 0cm 0cm 0pt &lt;SPAN style=&quot;FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Tahoma &lt;FONT size=2&gt;Тестировщик ПО&lt;?xml:namespace...

Написать условие при столкновении со стеной жизнь уменьшается,и змейка становиться на место.Оттуда начинается след жизнь
Здравствуйте. Не могу решить проблему, которая указана в заголовке. Код прикреплён. Буду благодарен увидеть условие, которое решает...

Игра жизнь
Нужно написать игру &quot;Жизнь&quot; простым кодом. Только начал изучать c++

Игра 'Жизнь'
Доброго времени суток. Нужно создать программу на основе игры 'Жизнь', что именно нужно: Колония клеток пусть задана множеством (set)...

игра жизнь
содержимое life.cpp// Life.cpp: определяет точку входа для консольного приложения. // #include &lt;iostream&gt; #include...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru