Форум программистов, компьютерный форум, киберфорум
Наши страницы
bedvit
Войти
Регистрация
Восстановить пароль
Рейтинг: 5.00. Голосов: 3.

Клеточные автоматы ч.2 - Conway's Game of Life (С++ WinAPI)

Запись от bedvit размещена 01.03.2019 в 21:15
Обновил(-а) bedvit 31.10.2019 в 15:09 (13/05/2019 Актуализация версии: Life v1.7.0.0)

Решил сделать свой велик.
Программа Life
Продукт написан на С++, GUI на WinAPI.
Предыдущая часть: Клеточные автоматы ч.1 - Conway's Game of Life in Excel

Основные параметры:
1. Размер игрового поля 2^32 на +2^32 клеток (рамка примерно 4,3*4,3 млрд. клеток) - поле закольцовано по X, Y координатам.
2. Масштаб от 32 пикселей - одна клетка, до 1 млр. клеток на один пиксель (можно загрузить целиком самый большой космический корабль "Gemini", размером рамки в 4 млн. клеток, посмотреть в подробностях - по ссылке есть загрузочный шаблон в архиве и даже увидеть всю игровую вселенную на экране)
3. Замедление хода в мс.(микросекунда=1/1000 сек.)
4. Шаг поколений. В один ход (ход - отрисовка инфо на экране) рассчитываем указанное количество поколений. Параметр нужен для того, что бы посмотреть динамику жизни при скорости выше 60-65 поколений в секунду. Предполагаю, потому как, WinAPI (WM_PAINT) не может отрисовать более 60Гц в секунду (частота обновления экрана).
5. Быстрая отрисовка в WinAPI через CreateDIBSection, с прямым доступом через DIB к битам Bitmap (следующий этап - Dirext3D, пока в разработке).
6. Кнопка "Начало координат" - перемещение в начало координат (левая верхняя точка пользовательского окна - координаты: 0.0). Работает при расчете жизни. Если вдруг потерялись Эта же позиция отрисовывается при запуске программы и при создании нового поля. Загрузка всех шаблонов происходит тоже в начало координат.
7. Горячие кнопки
8. Сочетание кнопок для действий - новый холст, открыть и сохранить файл - стандартные (к примеру, сохранить CTRL+S)
9. Чтение и запись формата RLE, форматы

10. Рисуем/Удаляем левой кнопкой
11. Таскаем холст - правой
12. Масштабирование - колесико мышки


14/03/2019 Обновление версии: Life v1.4.0.0 (1.4.0.4)
- Обновлен интерфейс и сетка игрового поля.
- Оптимизирован алгоритм расчета и отрисовки - теперь быстрее на 30%.
- Добавлены команды:
13. "Инфо.панель" - информация о настройках, игровом поле.
14. "Показать ареал" - показать весь ареал (клетки, где была и есть жизнь) на экране.
15. "Автомасштаб" - автомасштабирование ареала до размеров экрана.
16. "Ареал по живым" - сужения ареала только до живых клеток.

И замеченного: у меня, версия х32 работает на 30% быстрее, чем х64 (win7 x64), что на первый взгляд, кажется парадоксальным (в профилировщике видно, что в версии х64 больше ресурсов уходит на поиск - "std::unordered_map::find")

В комбинации "Автомасштаб" и "Ареал по живым" дают интересный эффект - можно смотреть движение одиночных фигур в пространстве, к примеру космические корабли (для более качественного просмотра, можно замедлить движение, см.п.3).

В архиве, прилагаю для теста, несколько простых шаблонов в формате RLE.

На рис. "Желудь" ("Acorn"), "Фабрика космических кораблей" ("p416 60P5H2V0 gun"), "Космический корабль" ("p15 pre-pulsar spaceship") (по ссылкам есть шаблоны, которые можно загрузить в программу)

15/04/2019 Обновление версии: Life v1.5.0.0 - Завершение проекта
1. Оптимизирован алгоритм расчета, итого с 1й версии до 5й скорость выросла с 26 поколений в секунду до 232 п./с. на примере фигуры ("p416 60P5H2V0 gun") (27 тыс. живых клеток).
2. Расширен диапазон MAX количества живых клеток - до 10 млн. (за счет резервирования большего количества памяти), построение на примере фигуры Max, (в прилагаемых шаблонах есть). С проверкой переполнения.
3. Немного переработан интерфейс, разделил вывод и ввод, мелкие оптимизации для правильной работы с клавиатуры.
4. Планировал перейти на 3D (работу начал, но на это нужно время, которого сейчас нет, и в ближайшем будущем не будет на этот проект) посему выкладываю рабочие исходники данной версии на WinAPI, может кто-то напишет лучше, подключит Direct3D или в целях самообразования просто попилит код.
Код, писал в целях обучения, еще есть где оптимизировать, к примеру контролируемое перехеширование и перезапись итераторов, позволит изначально использовать меньше памяти (резервировать меньше изначально). Можно, к примеру, уйти от хеш-таблиц, создать динамический выделяемые блоки памяти (к примеру по 1024*1024 байт), с контролем времени жизни (есть/нет живые клетки). С ними линейные скорости чтения, поиска (мы знаем адрес), записи. Перемещение - смещение на степень двойки очень быстрая процедура. Но опять же, есть и свои подводные камни. А времени нет додумать концепцию и реализовать.
Исходники с комментариями на русском, распространяются как есть, под свободной лицензией.
Репозиторий: https://github.com/bedvit/Life

13/05/2019 Обновление версии: Life v1.7.0.0 - Игровое поле, пользовательские сообщения
1. Реализована закольцовка игрового поля по по X, Y координатам.
2. Реализован правильный механизм масштабирования на границах
3. Увеличен диапазон масштабирования до 1 млр. клеток на один пиксель, теперь всю вселенную можно уместить на экран и даже в несколько пикселей (удобно при масштабировании/поиске сильно отдаленных друг от друга объектов).
4. Добавлены пользовательские сообщения (о выходе за рамки игрового поля и т.д.)
5. Исправлены некритичные ошибки.
6. Репозиторий обновлен.
В итоге: теперь программа представляется, как вполне законченная.
Миниатюры
Нажмите на изображение для увеличения
Название: Life2.PNG
Просмотров: 202
Размер:	34.6 Кб
ID:	5243   Нажмите на изображение для увеличения
Название: Life1.4.0.0.PNG
Просмотров: 160
Размер:	32.9 Кб
ID:	5304   Нажмите на изображение для увеличения
Название: Life1.5.0.0_Max2.PNG
Просмотров: 102
Размер:	31.6 Кб
ID:	5329  

Нажмите на изображение для увеличения
Название: Life1.5.0.0_232.PNG
Просмотров: 139
Размер:	73.2 Кб
ID:	5330  
Вложения
Тип файла: zip Шаблоны.zip (288.5 Кб, 23 просмотров)
Тип файла: zip Life(1.7.0.0).zip (128.5 Кб, 108 просмотров)
Тип файла: zip Life(1.8.0.0).zip (128.5 Кб, 72 просмотров)
Размещено в Без категории
Просмотров 798 Комментарии 14
Всего комментариев 14
Комментарии
  1. Старый комментарий
    Аватар для vlisp
    gui ужасный, дальше смотреть нет желания
    Запись от vlisp размещена 02.03.2019 в 23:52 vlisp вне форума
  2. Старый комментарий
    Аватар для bedvit
    Красивый будет на Dirext3D, если будет время доделать. Здесь была цель сделать просто и без изысков, с максимальным обзором игрового поля. Хотя на вкус и цвет все помидоры разные, это да.
    Запись от bedvit размещена 03.03.2019 в 09:05 bedvit вне форума
  3. Старый комментарий
    Аватар для Avazart
    "Новый" "Открыть" "Сохранить" должно быть наверное как подменю "Файл" наверное про это речь.
    Запись от Avazart размещена 06.03.2019 в 16:11 Avazart вне форума
  4. Старый комментарий
    Аватар для bedvit
    Так есть и как подменю, просто для удобства (т.к. команд пока мало выложил дополнительно и в основное меню). В следующей версии оставлю только подменю, раз народу не нравится Замечания по делу приветствуются.
    Запись от bedvit размещена 06.03.2019 в 21:41 bedvit вне форума
  5. Старый комментарий
    Аватар для bedvit
    14/03/2019 Обновление версии: Life v1.4.0.0
    Интересны мнения и выявленные баги.
    Запись от bedvit размещена 14.03.2019 в 20:19 bedvit вне форума
  6. Старый комментарий
    Аватар для Вадим Тукаев
    Это просто круто! К сожалению, ничем не могу помочь, это далеко за пределами моей компетенции. Я сам хочу что-то подобное сделать, но сначала попроще. Скажем, на поле 800x600. Подумываю изучить либо Qt, либо SDL. WinAPI для меня слишком сложно. Я вообще почти не работал с графикой. Мне нравится решать задачи на алгоритмы и структуры данных.
    Запись от Вадим Тукаев размещена 15.03.2019 в 09:53 Вадим Тукаев вне форума
  7. Старый комментарий
    Аватар для bedvit
    Вадим Тукаев, спасибо за оценку. По нижепредставленной ссылке начинал данную тему, реализация на VBA, с полем 500*500 клеток, закольцованное и с гибелью на границах. Может будет интересно для начала. Клеточные автоматы ч.1 - Conway's Game of Life in Excel. Реализация на WinAPI тоже не такая сложная. Сейчас, лично для меня, сложнее на DirectX 11 + C++ переложить, чем было перейти с VBA на WinAPI.
    Запись от bedvit размещена 15.03.2019 в 21:54 bedvit вне форума
  8. Старый комментарий
    “написан на С++, GUI на WinAPI.”
    Странный выбор. Сегодня наверно адекватно GUI на Qt. Графика там же. На хабре был вроде как редактор на Web OpenGL. Посмотрел картинки гугла клеточные автоматы…все они скучны и однообразны. Не понимаю чем заинтересовали. Например странные аттракторы Symmetric Icons, IFS fractals https://habr.com/ru/post/328568/
    или Fractal Flames другое дело.
    Запись от Excalibur921 размещена 15.03.2019 в 22:39 Excalibur921 вне форума
  9. Старый комментарий
    Даже играя со старыми фракталами можно парой строк делать красиво.
    http://www.cyberforum.ru/opengl/thread2208557.html
    Запись от Excalibur921 размещена 15.03.2019 в 23:20 Excalibur921 вне форума
  10. Старый комментарий
    Аватар для bedvit
    Был интересен вариант сделать графику без доп.библиотек, на низкоуровневом фундаменте под Win, понять как все работает, прокачать уровень. Будет время, хочу подключить к отрисовке ГП, т.е. DirectX 11. Опять же, по возможности без доп.библиотек, пощупать все своими руками. Может быть возьму минимум из SDK (к примеру вывод шрифтов, писать свой двиган с нуля нет времени и желания).
    Фракталы - это интересно и красиво, спору нет. Посмотрел ваши ссылки.
    Но клеточные автоматы - это больше алгоритмы, чем графика.
    В жизни Конвея можно построить Универсальный компьютер, реализацию машины Тьюринга. К примеру Spartan universal computer-constructor.
    Запись от bedvit размещена 16.03.2019 в 09:26 bedvit вне форума
    Обновил(-а) bedvit 16.03.2019 в 09:34
  11. Старый комментарий
    Аватар для fever brain
    не запускается на win xp x32

    запускал Life x32 ошибка: -приложение не является win32
    Запись от fever brain размещена 01.04.2019 в 19:16 fever brain на форуме
    Обновил(-а) fever brain 01.04.2019 в 19:18
  12. Старый комментарий
    Аватар для bedvit
    Кто-то может протестировать на win XP x32? (Сам сейчас не смогу). Спасибо.
    Запись от bedvit размещена 01.04.2019 в 19:31 bedvit вне форума
    Обновил(-а) bedvit 22.10.2019 в 15:19
  13. Старый комментарий
    Аватар для bedvit
    15/04/2019 Завершение проекта: Life v1.5.0.0
    1. Оптимизирован алгоритм расчета, итого с 1й версии до 5й скорость выросла с 26 поколений в секунду до 232 п./с. на примере фигуры ("p416 60P5H2V0 gun") (27 тыс. живых клеток).
    2. Расширен диапазон MAX количества живых клеток - до 10 млн. (за счет резервирования большего количества памяти), построение на примере фигуры Max, (в прилагаемых шаблонах есть). С проверкой переполнения.
    3. Немного переработан интерфейс, разделил вывод и ввод, мелкие оптимизации для правильной работы с клавиатуры.
    4. Планировал перейти на 3D (работу начал, но на это нужно время, которого сейчас нет, и в ближайшем будущем не будет на этот проект) посему выкладываю рабочие исходники данной версии на WinAPI, может кто-то напишет лучше, подключит Direct3D или в целях самообразования просто попилит код.
    Код, писал в целях обучения, еще есть где оптимизировать, к примеру контролируемое перехеширование и перезапись итераторов, позволит изначально использовать меньше памяти (резервировать меньше изначально). Можно, к примеру, уйти от хеш-таблиц, создать динамический выделяемые блоки памяти (к примеру по 1024*1024 байт), с контролем времени жизни (есть/нет живые клетки). С ними линейные скорости чтения, поиска (мы знаем адрес), записи. Перемещение - смещение на степень двойки очень быстрая процедура. Но опять же, есть и свои подводные камни. А времени нет додумать концепцию и реализовать.
    Исходники с комментариями на русском, распространяются как есть, под свободной лицензией.
    Репозиторий: https://github.com/bedvit/Life
    Запись от bedvit размещена 15.04.2019 в 19:29 bedvit вне форума
    Обновил(-а) bedvit 16.04.2019 в 10:06
  14. Старый комментарий
    Аватар для bedvit
    13/05/2019 Обновление версии: Life v1.7.0.0 - Игровое поле, пользовательские сообщения
    1. Реализована закольцовка игрового поля по по X, Y координатам.
    2. Реализован правильный механизм масштабирования на границах
    3. Увеличен диапазон масштабирования до 1 млр. клеток на один пиксель, теперь всю вселенную можно уместить на экран и даже в несколько пикселей (удобно при масштабировании/поиске сильно отдаленных друг от друга объектов).
    4. Добавлены пользовательские сообщения (о выходе за рамки игрового поля и т.д.)
    5. Исправлены некритичные ошибки.
    6. Репозиторий обновлен.
    В итоге: теперь программа представляется, как вполне законченная.
    Запись от bedvit размещена 13.05.2019 в 18:54 bedvit вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.