|
0 / 0 / 0
Регистрация: 01.01.2017
Сообщений: 7
|
||||||
Оптимизация и усовершенствование01.01.2017, 01:35. Показов 1224. Ответов 21
Метки нет (Все метки)
Здравствуйте, совсем недавно начал изучать язык программирования "С++". Решил попрактиковаться, сделал маленькую консольную игру. Назвал "Лабиринт", помогите как можно упростить код и уменьшить время прорисовки "лабиринта" после каждого хода. В будущем добавлю "монстров" (если так можно назвать символы, разумеется
), и выход, который открываеться ключиком, который будет "спавниться" в одном из нескольких мест, случайно.
0
|
||||||
| 01.01.2017, 01:35 | |
|
Ответы с готовыми решениями:
21
усовершенствование кода
|
|
Любитель чаепитий
|
|
| 01.01.2017, 06:38 | |
|
Чтобы "ускорить" прорисовку надо либо делать её с помощью сишных потоков(этого вряд ли будет достаточно), либо использовать сторонние либы, которые могут работать с буфером консоли(правда в таком случае обновления прорисовки вообще не понадобится), либо использовать для подобного API системы.
0
|
|
|
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
|
|
| 01.01.2017, 11:22 | |
|
В целом согласен с GbaLog-, но не совсем.
1) Не очень понятно каким образом "сишные потоки" ускорят прорисовку? Что имелось в виду? cout разве не идентификатор потока? Или подразумевалась многопоточность самого приложения, _beginthread(...) и т.п.) ? 2) Сомневаюсь, что есть какие то "сторонние либы" работающие с буфером консоли, потому что вся эта функциональность исчерпывающе реализована набором соответствующего API: Console Functions. Там есть и чтение символов (ReadConsoleOutputCharacter), и запись (WriteConsole) и позиционирование курсора (SetConsoleCursorPosition) и изменение цвета и пр. 3) По коду: возможно не стоит хранить массив констант и при выводе делать каждому символу if(..). Лучше хранить сразу строки символов (типа "###$####....") Так их проще выводить просто printf'ом Но еще лучше конечно же работать с буфером консоли. Тогда будет достаточно перерисовывать только изменившиеся символы, а не весь экран (что бы не было мерцания).
0
|
|
|
Любитель чаепитий
|
|||||
| 01.01.2017, 15:15 | |||||
идентификатор?
0
|
|||||
|
0 / 0 / 0
Регистрация: 01.01.2017
Сообщений: 7
|
||||||
| 01.01.2017, 18:22 [ТС] | ||||||
|
Вот новая версия добавил "передвигаемые блоки", которые можно ставить на "t", "f", "g", "h". Простите за не читаемую функцию "player".
0
|
||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 02.01.2017, 00:39 | ||
|
а во-вторых, что б не мерцало, нужно пользовать двойную буферизацию. это единственный способ достичь плавности. ну и в третьих, как я понял, тс не жаловалосо на мерцание.
0
|
||
|
Любитель чаепитий
|
|||||
| 02.01.2017, 10:34 | |||||
|
Ложь? Что это такое я знаю, а как в консоли юзать - нет. Скорее всего, только через АПИ системы?
0
|
|||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||
| 02.01.2017, 14:37 | |||||
|
что медленность с++ потоков - миф. всё зависит от того, как их правильно готовить. так например, в режиме оптимизаций, отключая все возможные проверки, синхронизацию с сишными потоками, получаем:
но зато очень наглядно иллюстрируется: Большой блок + Boost::Spirit ---> абсолютный чемпион. такой перфоманс в первую очередь достигается за счет грамотного алгоритма загрузки в целом. примерно тоже самое можно было бы провернуть и на сишных функциях, и на приплюснутых. в целом я конечно согласен, что с ослабленной защитой, и многочисленными нарушениями инвариантов, приплюснутые потоки начинают работать, как обычные сишные функции (собственно, они то там и используется у них под капотом). и в этом случае проще не заморачиваться, а сразу писать на сишных функциях ради перфоманса. но фишка в том, что это все - экономия на спичках. операции ввода/вывода - традиционно самые медленные. и настоящая оптимизация здесь - правильно подобрать параметры. где то отключить буферизацию. где то наоборот включить. подобрать оптимальный размер блока, и тд. причем практика показывает, что в случае просадки производительности, проще поставить быстрый скази-диск, и ничего не менять в коде. и скорость ввода/вывода увеличится в сотни раз! и это будет намного дешевле, чем платить программисту столько денег, за непонятные мозговыверты. для современной графики он конечно несколько морально устарел и не используется. (все расчеты нынче происходят прям на видеокарточках). но для текстовой консольки - то, что доктор прописал. суть такая: создаем обычную матрицу цветных буковок. и запрашиваем у системы два буфера. один основной (видимый), другой задний (не видимый). в процессе работы бизнес-логики, производим модификацию в нашей матрица. собственно матрица - это что то вроде нашей игровой сцены. после того, как очередной цикл работы бизнес-логики завершился, мы определяем: были ли в матрицу внесены изменения. и если были, тогда копируем содержимое матрицы в задний (не видимый буфер) консоли. после чего делаем flip - делаем задний буфер передним. а передний соответственно, становится задним. содержимое заднего буфера моментально отображается в консоли. подобный способ позволяет выполнять достаточно сложные расчеты бизнес-логики, и при этом позволяет достигать плавной анимации, и избавляет от неприятного мерцания. Добавлено через 25 секунд
2
|
|||||
|
Любитель чаепитий
|
|||
| 02.01.2017, 14:53 | |||
![]() Тут вряд ли даже двойная буферизация спасёт. Вообще, мерцание возникает из-за низкой скорости вывода, т.к. просто не успевает с такой скоростью отрисовываться и стираться. Работа напрямую с буфером от этого спасает, т.к. отрисовываются и стираются только нужные части.
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 02.01.2017, 15:11 | |||
|
я ж сказал, что делал уже в консольке. можно делать очень плавную анимацию, при возможности колоссальной скорости отрисовки. даже если вы будите напрямки писать в активный буфер, средствами апи мерцания вы не избежите. это может быть не заметно при перемещении одной буковки. но если там ещё расчеты делать, и допустим проанимировать человечка в акси-арт, будет мерцать. только двойная буферизация. двойная буферизация позволяет мгновенно перерисовать весь буфер.
1
|
|||
|
Любитель чаепитий
|
||
| 02.01.2017, 15:17 | ||
|
Перерисовок будет меньше, и, соответственно, мерцание будет меньше, если вообще будет.
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 02.01.2017, 15:25 | ||
|
иначе глаз заметит лаги))
0
|
||
|
Любитель чаепитий
|
||
| 02.01.2017, 15:43 | ||
|
А вот в играх хуже. К примеру, мой глаз видит лаги уже при 40 кадрах, ибо глаз привык к 60+ фпс, но нормальных драйверов на мою видеокарту не нашлось для 7-ки(слишком старая уже), поэтому приходится играть <60 фпс, либо вообще не играть.
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 02.01.2017, 15:52 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 01.01.2017
Сообщений: 7
|
||||||
| 03.01.2017, 01:37 [ТС] | ||||||
|
Собственно, как можно реализовать двойную буферизацию в консольном приложении?
Добавлено через 7 часов 28 минут Добавил выход(Он то был, но не функционировал.), добавил двери и ключи ($ - дверь, * - ключ).Что бы открыть дверь нужно подобрать ключ, после открытия двери он исчезает. Мерцание так и не устранил. Осознал что надо было писать тему в "cpp-beginners".
0
|
||||||
|
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
|
|||||||||||||||||||||
| 03.01.2017, 12:18 | |||||||||||||||||||||
|
Ребята, всё это конечно хорошо, дискуссия получилась интересной и познавательной, но вам не кажется, что двойная буферизация для консольной игрушки, которую пишет начинающий это немножко перебор? Анимация псевдографики "дискретна" по своей природе, и "плавности" всё равно не будет (т.е. полюбому символы будут двигаться скачками). Для устранения мерцания просто не надо перерисовывать весь экран. Нужно избавиться от цикличного вызова ф-ции maps() заменив его чем нибудь вроде этого:
Функцию player() тоже можно упростить сведя все повторяющиеся однотипные проверки в одно место. Если Написать универсальную процедуру:
0
|
|||||||||||||||||||||
| 03.01.2017, 12:52 | |
|
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||
| 04.01.2017, 09:51 | ||||
|
зависит от самой псевдографики. в интернетах можно нарыть качественную анимацию человечков например. https://youtu.be/3wYz3zVnkIA шняга это все.
1
|
||||
|
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
|
||
| 04.01.2017, 11:25 | ||
|
hoggy, клёвая видяшка
экран наверное символов в триста шириной.. при таком разрешении конечно есть где разгуляться.Впрочем, я не спорю. ..всё это дело вкуса и личных убеждений. Все правы
0
|
||
|
0 / 0 / 0
Регистрация: 01.01.2017
Сообщений: 7
|
|
| 07.01.2017, 16:04 [ТС] | |
|
0
|
|
| 07.01.2017, 16:04 | |
|
Помогаю со студенческими работами здесь
20
Типы оптимизация: черная оптимизация, серая оптимизация и белая оптимизация Усовершенствование кода Усовершенствование программы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение.
И на уровне агентов добавится между грибами или бактериями взаимодействий.
До того я пробовал подход через многомерные массивы,. . .
|
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Сочетание глобально распределённой вычислительной мощности и инновационных. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|