Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/40: Рейтинг темы: голосов - 40, средняя оценка - 4.93
3 / 3 / 2
Регистрация: 19.02.2014
Сообщений: 142

Мгновенное обновление всей консоли

23.02.2014, 17:21. Показов 8238. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При обновлении небольшой области консоли очень хорошо помогает SetConsoleCursorPosition, однако, если нужно быстро обновить всё окно, перерисовка очень заметна. Есть ли что-нибудь быстрее, чем std::cout?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.02.2014, 17:21
Ответы с готовыми решениями:

Обновление определенной координаты консоли, а не всей в С++
Здравствуйте, у меня назрел такой вопрос, бегая по просторам интернета, я нашел такую ЗАМЕЧАТЕЛЬНУЮ функцию как cls; она прекрасна,...

Мгновенное считывание клавишы в консоли (аналог readkey из c#/pascal)
Есть такое? Я наткнулся на информацию, что нет, а потом на сильное колдунство, что есть и в итоге запутался. Нужно чтобы символ вводился...

Использование всей консоли для вывода
Почему когда печатается последний символ в консоли то курсор переходит на новую строку? Добавлено через 6 минут Вот код ...

6
25 / 11 / 4
Регистрация: 26.10.2013
Сообщений: 85
Записей в блоге: 1
23.02.2014, 17:22
system("cls")?
0
3 / 3 / 2
Регистрация: 19.02.2014
Сообщений: 142
23.02.2014, 17:25  [ТС]
EzCoding, это очень медленная штука. И дело не в очистке консоли, а в её перерисовке.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
23.02.2014, 21:54
Лучший ответ Сообщение было отмечено Devilox как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void clearConsole() {
    COORD topLeft  = { 0, 0 };
    HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO screen;
    DWORD written;
 
    GetConsoleScreenBufferInfo(console, &screen);
    FillConsoleOutputCharacterA(
        console, ' ', screen.dwSize.X * screen.dwSize.Y, topLeft, &written
    );
    FillConsoleOutputAttribute(
        console, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE,
        screen.dwSize.X * screen.dwSize.Y, topLeft, &written
    );
    SetConsoleCursorPosition(console, topLeft);
}
Для windows
1
3 / 3 / 2
Регистрация: 19.02.2014
Сообщений: 142
23.02.2014, 22:55  [ТС]
Спасибо! То, что нужно!
0
0 / 0 / 0
Регистрация: 18.09.2022
Сообщений: 2
18.09.2022, 17:31
При использовании этой функции мой код стал обновляться еще медленней, прям значительно

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
using namespace std;
bool gameOver;
const int width = 20;
const int height = 20;
int x, y, Fx, Fy, score;
enum eDirecton {STOP = 0, LEFT, RIGHT, UP, DOWN};
eDirecton dir;
 
void clearConsole() {
    COORD topLeft = { 0, 0 };
    HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO screen;
    DWORD written;
 
    GetConsoleScreenBufferInfo(console, &screen);
    FillConsoleOutputCharacterA(
        console, ' ', screen.dwSize.X * screen.dwSize.Y, topLeft, &written
    );
    FillConsoleOutputAttribute(
        console, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE,
        screen.dwSize.X * screen.dwSize.Y, topLeft, &written
    );
    SetConsoleCursorPosition(console, topLeft);
}
 
void Draw()
{
    clearConsole();
    for (int i = 0; i < width + 2; i++)
        cout << "#";
    cout << endl;
 
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            if (j == 0)
                cout << "#";
            if (i == y && j == x)
                cout << "O";
            else
                if (i == Fx && j == Fy)
                    cout << "@";
                else
                    cout << " ";
            
 
            if (j == width - 1)
                cout << "#";
        }
        cout << endl;
    }
 
    for (int i = 0; i < width+2; i++)
        cout << "#";
    cout << endl;
 
int main()
{
    Setup();
 
    while (true)
    {
        Draw();
        Input();
        Logic();
    }
    
}
 
}
(Это код из гайда: ТЫК )
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
18.09.2022, 18:11
Цитата Сообщение от voxhrim Посмотреть сообщение
При использовании этой функции мой код стал обновляться еще медленней, прям значительно
Звучит как обвинение

На самом деле подход надо просто менять. Сейчас у вас два буфера используется - а это однозначно приведет к проблемам с отрисовкой.

По мотивам этого поста: Как работать с WriteConsoleOutput?
исправил ваш код.
Кликните здесь для просмотра всего текста
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
#include <iostream>
#include <cstring>
#include <conio.h>
#include <windows.h>
using namespace std;
bool gameOver;
const int width = 20;
const int height = 20;
int x, y, fruitX, fruitY, score;
int tailX[100], tailY[100];
int nTail;
enum eDirecton { STOP = 0, LEFT, RIGHT, UP, DOWN};
eDirecton dir;
void Setup()
{
    gameOver = false;
    dir = STOP;
    x = width / 2;
    y = height / 2;
    fruitX = rand() % width;
    fruitY = rand() % height;
    score = 0;
}
 
template <size_t Lines, size_t Chars>
class screen_buffer
{
    void reset_position()
    {
        static COORD crd = {};
        SetConsoleCursorPosition(hStdout_, crd);
    }
 
public:
    enum
    {
        Size = Lines * Chars
    };
 
    screen_buffer()
        : hStdout_(GetStdHandle(STD_OUTPUT_HANDLE))
    {
        clear();
    }
 
    void flush()
    {
        SMALL_RECT srctWriteRect = { 0, 0, Chars - 1, Lines - 1 };
        COORD crd   = { 0, 0 };
        COORD bsize = { Chars, Lines };
 
        CHAR_INFO chInfo[Size];
        for(size_t i = 0; i < Size; ++i)
        {
            chInfo[i].Char.AsciiChar = screen_[i] ? screen_[i] : ' ';
            chInfo[i].Attributes     = 7;
        }
        WriteConsoleOutput(hStdout_, chInfo, bsize, crd, &srctWriteRect);
    }
 
    int printf(char const * format, ...)
    {
        va_list args;
        va_start(args, format);
        const size_t remainLen = Size - screenOff_;
        const int r = std::vsnprintf(&screen_[screenOff_], remainLen, format, args);
        screenOff_ += r;
        va_end(args);
        return r;
    }
    int printf(size_t x, size_t y, char const * format, ...)
    {
        va_list args;
        va_start(args, format);
        char * off = &screen_[x + y * Chars];
        char * beg = &screen_[0];
        const size_t remainLen = Size - std::distance(beg, off);
        const int r = std::vsnprintf(off, remainLen, format, args);
        va_end(args);
        return r;
    }
    void endline()
    {
        size_t line = screenOff_ / Chars;
        screenOff_ = Chars * (line + 1);
    }
 
    void clear()
    {
        screenOff_ = 0;
        std::memset(screen_, ' ', Size);
    }
 
private:
    HANDLE hStdout_;
    size_t screenOff_;
    char   screen_[Size];
};
 
void Draw(screen_buffer<60, 80> & buf)
{
    buf.clear();
    for (int i = 0; i < width+2; i++)
        buf.printf("#");
    buf.endline();
 
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            if (j == 0)
                buf.printf("#");
            if (i == y && j == x)
                buf.printf("O");
            else if (i == fruitY && j == fruitX)
                buf.printf("F");
            else
            {
                bool print = false;
                for (int k = 0; k < nTail; k++)
                {
                    if (tailX[k] == j && tailY[k] == i)
                    {
                        buf.printf("o");
                        print = true;
                    }
                }
                if (!print)
                    buf.printf(" ");
            }
 
 
            if (j == width - 1)
                buf.printf("#");
        }
        buf.endline();
    }
 
    for (int i = 0; i < width+2; i++)
        buf.printf("#");
    buf.endline();
    buf.printf("Score: %d", score);
    buf.endline();
    buf.flush();
}
void Input()
{
    if (_kbhit())
    {
        switch (_getch())
        {
        case 'a':
            dir = LEFT;
            break;
        case 'd':
            dir = RIGHT;
            break;
        case 'w':
            dir = UP;
            break;
        case 's':
            dir = DOWN;
            break;
        case 'x':
            gameOver = true;
            break;
        }
    }
}
void Logic()
{
    int prevX = tailX[0];
    int prevY = tailY[0];
    int prev2X, prev2Y;
    tailX[0] = x;
    tailY[0] = y;
    for (int i = 1; i < nTail; i++)
    {
        prev2X = tailX[i];
        prev2Y = tailY[i];
        tailX[i] = prevX;
        tailY[i] = prevY;
        prevX = prev2X;
        prevY = prev2Y;
    }
    switch (dir)
    {
    case LEFT:
        x--;
        break;
    case RIGHT:
        x++;
        break;
    case UP:
        y--;
        break;
    case DOWN:
        y++;
        break;
    default:
        break;
    }
    //if (x > width || x < 0 || y > height || y < 0)
    //  gameOver = true;
    if (x >= width) x = 0; else if (x < 0) x = width - 1;
    if (y >= height) y = 0; else if (y < 0) y = height - 1;
 
    for (int i = 0; i < nTail; i++)
        if (tailX[i] == x && tailY[i] == y)
            gameOver = true;
 
    if (x == fruitX && y == fruitY)
    {
        score += 10;
        fruitX = rand() % width;
        fruitY = rand() % height;
        nTail++;
    }
}
int main()
{
    screen_buffer<60, 80> conBuf;
 
    Setup();
    while (!gameOver)
    {
        Draw(conBuf);
        Input();
        Logic();
        Sleep(200); //sleep(10);
    }
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.09.2022, 18:11
Помогаю со студенческими работами здесь

Обновление символов в консоли
У меня есть рамка в которой движется символ. Каким образом я при управлении символом могу не перерисовывать рамку? Если нужно - скину код.

Мгновенное обновление новых сообщений
Добрый день, возник такой вопрос: Как реализовать мгновенное обновление при поступлении новых данных в БД. Пример личных...

Обновление div отдельно от всей страницы
Имеется страница, в ней есть такой кусок кода: &lt;div class=&quot;logging&quot;&gt; &lt;?php $f =...

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

Обновление графического интерфейса всей программы на Java
У меня есть несколько классов, к примеру MainClass - он отвечает за создание главного JFrame, JMenuBar и JToolBar, потом класс Table...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru