Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 28.01.2017
Сообщений: 15

Ускорить вывод в консоли

29.01.2020, 22:42. Показов 5014. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я написал Понг в консоли, но она слишком медленно выводит графику, из-за чего картинка дерганая, а если повысить частоту обновлений, она и вовсе превращается в черти что.

Можно ли как-то ускорить вывод текста в консоли? А если нет, то любопытно, каким образом создавались игры под DOS и т.д.

вот скрин как это выглядит
Миниатюры
Ускорить вывод в консоли  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.01.2020, 22:42
Ответы с готовыми решениями:

Игра из текста в консоли: как ускорить прорисовку?
Здравствуйте, я решил реализовать игру, используя консоль. (именно консоль, т.к. хочу сделать закос под "доисторические игры")...

Ускорить вывод в RichEdit
Я генерирую миллион значений Все значения вывожу в поток: osftream p("text.txt"); for(i=0; i < 1000000; i++) { p <<...

Как ускорить вывод изображения?
Здравствуйте уважаемые программисты! Вот я пишу игровой 2D движок на C++ directx9 и то, что у меня получилось сравниваю с американским 2D...

7
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
29.01.2020, 22:49
yahnoyah, код покажите.
0
0 / 0 / 0
Регистрация: 28.01.2017
Сообщений: 15
29.01.2020, 22:53  [ТС]
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
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
 
namespace cds
{
    class pixel
    {
        public ConsoleColor backColor;
        public ConsoleColor textColor;
        public Char content;
        
        public pixel()
        {
            backColor = ConsoleColor.Black;
            textColor = ConsoleColor.White;
            content = ' ';
        }
    }
    class area : Object
    {
        public int xsize, ysize;
        private pixel[,] buf;
        public area(int x, int y)
        {
            xsize = x;
            ysize = y;
            buf = new pixel[x, y];
            for(int i = 0; i < y; i++)
            {
                for (int k = 0; k < x; k++)
                {
                    buf[k, i] = new pixel();
                }
            }
        }
        public void draw()
        {
            Console.Clear();
            for(int i=0; i<ysize; i++)
            {
                for(int ii=0; ii<xsize; ii++)
                {
                    Console.BackgroundColor = buf[ii, i].backColor;
                    Console.ForegroundColor = buf[ii, i].textColor;
                    Console.Write(buf[ii, i].content);
                }
                if (i != ysize - 1) { Console.WriteLine(); }
            }
            Console.ForegroundColor = ConsoleColor.Black;
        }
        public void clear()
        {
            Console.Clear();
            for (int i = 0; i < ysize; i++)
            {
                for (int ii = 0; ii < xsize; ii++)
                {
                    buf[ii, i].backColor = ConsoleColor.Black;
                    buf[ii, i].textColor = ConsoleColor.White;
                    buf[ii, i].content = ' ';
                }
            }
            Console.ForegroundColor = ConsoleColor.Black;
        }
        public void drawRectangle(int xc, int yc, int xl, int yl, ConsoleColor clr)
        {
            for(int i = yc; i < yc+yl; i++)
            {
                for(int k = xc; k<xc+xl; k++)
                {
                    buf[k, i].backColor = clr;
                }
            }
        }
 
        public void drawRectangle(int xc, int yc, int xl, int yl, ConsoleColor clr, int border, ConsoleColor bclr)
        {
            switch(border)
            {
                case 1:
                    for (int i = xc + 1; i < xc + xl - 1; i++)
                    {
                        buf[i, yc].content = '—';
                    }
                    for (int i = yc; i < yc + yl; i++)
                    {
                        buf[xc, i].content = '|';
                    }
                    for (int i = yc; i < yc + yl; i++)
                    {
                        buf[xc + xl - 1, i].content = '|';
                    }
                    for (int i = xc + 1; i < xc+xl - 1; i++)
                    {
                        buf[i, yc + yl - 1].content = '—';
                    }
                    break;
                case 2:
                    drawRectangle(xc-1,yc-1,xl+2,yl+2, bclr);
                    break;
                case 3:
                    for (int i = xc; i < xc + xl; i++)
                    {
                        buf[i, yc-1].content = '—';
                    }
                    for (int i = yc-1; i < yc + yl + 1; i++)
                    {
                        buf[xc-1, i].content = '|';
                    }
                    for (int i = yc-1; i < yc + yl + 1; i++)
                    {
                        buf[xc + xl, i].content = '|';
                    }
                    for (int i = xc; i < xc + xl; i++)
                    {
                        buf[i, yc + yl].content = '—';
                    }
                    drawRectangle(xc - 1, yc - 1, xl + 2, yl + 2, bclr);
                    break;
                default:
                    drawRectangle(xc, yl, xl, yl, clr);
                    break;
            }
            drawRectangle(xc, yc, xl, yl, clr);
        }
 
        public void drawRectangle(int xc, int yc, int xl, int yl, ConsoleColor clr, int border)
        {
            switch(border)
            {
                case 1:
                    drawRectangle(xc, yc, xl, yl, clr, 1, ConsoleColor.Black);
                    break;
                case 2:
                    drawRectangle(xc, yc, xl, yl, clr, 2, ConsoleColor.Black);
                    break;
                case 3:
                    drawRectangle(xc, yc, xl, yl, clr, 3, ConsoleColor.Black);
                    break;
                default:
                    drawRectangle(xc, yl, xl, yl, clr);
                    break;
            }
        }
 
        public void drawText(int xc, int yc, string text)
        {
            int k = 0;
            foreach(char c in text)
            {
                buf[xc + k, yc].content = c;
                k++;
            }
            
        }
        public static string ClassDescription
        {
            get
            {
                return "Класс area. Хранит данные об изображении в консоли.";
            }
        }
 
    }
}
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
using System;
using System.Threading;
using cds;
 
namespace pong
{
    class player
    {
        public const int First = 0;
        public const int Second = 1;
 
        public int xpos;
        public int ypos;
        public int score;
 
        public player(int x)
        {
            ypos = 1;
            xpos = x;
        }
 
        public void draw(area a)
        {
            a.drawRectangle(xpos, ypos, 1, 5, ConsoleColor.White);
        }
    }
 
    class ball : Object
    {
        public int xpos;
        public int ypos;
        public int speed;
        public bool xdirection;
        public bool ydirection;
 
        public const bool RIGHT = true;
        public const bool LEFT = false;
        public const bool UP = true;
        public const bool DOWN = false;
 
        public ball(int x, int y, int s, bool xd, bool yd)
        {
            xpos = x;
            ypos = y;
            speed = s;
            xdirection = xd;
            ydirection = yd;
        }
 
        public void draw(area a)
        {
            a.drawRectangle(xpos, ypos, 1, 1, ConsoleColor.White);
        }
    }
 
    class Program
    {
 
        static area screen = new area(119, 30);
 
        static player First = new player(10);
        static player Second = new player(109);
 
        static ball Ball = new ball(60, 15, 1, ball.LEFT, ball.UP);
 
        public const int FPS = 2; // ФПС
        public const int MPFPS = 1; // отношение частоты обновления позиций объектов к ФПС (нужно увеличивать, если увеличиваем ФПС, чтобы игра не стала слишком быстрой)
        public const int renewTick = 1000 / FPS; // частота обновлений (зависит от FPS)
        static int gamespeed = 1; // скорость игры ( 1 - нормальная, 2 - в 2 раза выше и т.д. )
        static int timePassed = 0;
        static bool debugMode = true;
        static bool accel = false;
 
        static TimerCallback movement = new TimerCallback(moveTimer);
        static TimerCallback rendering = new TimerCallback(renderTimer);
        static TimerCallback acceleration = new TimerCallback(accelerationTimer);
 
        static Timer tmovement;
        static Timer trendering;
        static Timer tacceleration;
 
        static void Main(string[] args)
        {
            Console.SetWindowSize(120, 30);
 
            tmovement = new Timer(movement, null, 0, renewTick * MPFPS / gamespeed);
            trendering = new Timer(rendering, null, 0, renewTick);
            if (accel) { tacceleration = new Timer(acceleration, null, 20000, 20000); }
 
            while (Console.ReadKey().Key != ConsoleKey.Escape) 
            { 
                if (Console.ReadKey().Key == ConsoleKey.F3) { debugMode = !debugMode; } 
                if (Console.ReadKey().Key == ConsoleKey.F4) { accel = !accel; }
                if ((Console.ReadKey().Key == ConsoleKey.Home) & (First.ypos != 0)) { First.ypos--; }
                if ((Console.ReadKey().Key == ConsoleKey.End) & (First.ypos != 25)) { First.ypos++; }
                if ((Console.ReadKey().Key == ConsoleKey.PageUp) & (Second.ypos != 0)) { Second.ypos--; }
                if ((Console.ReadKey().Key == ConsoleKey.PageDown) & (Second.ypos != 25)) { Second.ypos++; }
            }
 
            Console.Clear();
        }
        public static void accelerationTimer(object c)
        {
            gamespeed++;
            tmovement = new Timer(movement, null, renewTick * MPFPS / gamespeed, renewTick * MPFPS / gamespeed);
        }
 
        public static void moveTimer(object b)
        {
            if(Ball.xdirection == ball.LEFT)
            {
                Ball.xpos = Ball.xpos - Ball.speed;
            }
            else
            {
                Ball.xpos = Ball.xpos + Ball.speed;
            }
 
            if(Ball.ydirection == ball.UP)
            {
                Ball.ypos = Ball.ypos - Ball.speed;
            }
            else
            {
                Ball.ypos = Ball.ypos + Ball.speed;
            }
 
            if((Ball.ypos+Ball.speed > 29) & (Ball.ydirection == ball.DOWN))
            {
                Ball.ydirection = ball.UP;
            }
            if ((Ball.ypos-Ball.speed < 0) & (Ball.ydirection == ball.UP)) 
            {
                Ball.ydirection = ball.DOWN;
            }
            if ((Ball.xpos+Ball.speed > 118) & (Ball.xdirection == ball.RIGHT))
            {
                Ball.xdirection = ball.LEFT;
                First.score++;
            }
            if ((Ball.xpos-Ball.speed < 0) & (Ball.xdirection == ball.LEFT))
            {
                Ball.xdirection = ball.RIGHT;
                Second.score++;
            }
            if ((Ball.xpos == 11) && (Ball.ypos > First.ypos-1) && (Ball.ypos < First.ypos + 5) && (Ball.xdirection == ball.LEFT)) { Ball.xdirection = ball.RIGHT; }
            if ((Ball.xpos == 108) && (Ball.ypos > Second.ypos - 1) && (Ball.ypos < Second.ypos + 5) && (Ball.xdirection == ball.RIGHT)) { Ball.xdirection = ball.LEFT; }
        }
 
        public static void renderTimer(object a)
        {
            screen.clear();
 
            screen.drawText(5, 1, First.score.ToString());
            screen.drawText(114, 1, Second.score.ToString());
            if (debugMode) { screen.drawText(30, 0, "DEBUG INFO: timePassed = " + timePassed.ToString() + "; gamespeed = " + gamespeed + "; accel = " + accel); } 
            timePassed = timePassed + renewTick;
 
            First.draw(screen);
            Second.draw(screen);
 
            Ball.draw(screen);
            screen.draw();
        }
    }
}
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
29.01.2020, 22:57
yahnoyah, как я понял вы какждый раз полностью очищаете консоль и потом заново её отрисовываете.
Это неправильно.
Надо отрисовывать только изменившиеся позиции.
0
0 / 0 / 0
Регистрация: 28.01.2017
Сообщений: 15
29.01.2020, 23:00  [ТС]
Да, я догадывался.

Что мне нужно использовать, чтобы отрисовывать только изменившиеся позиции? Где можно прочитать про то, как это делается? (своими ручонками не смог найти)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
29.01.2020, 23:06
Цитата Сообщение от yahnoyah Посмотреть сообщение
Что мне нужно использовать, чтобы отрисовывать только изменившиеся позиции? Где можно прочитать про то, как это делается? (своими ручонками не смог найти)
У вас же массив пикселей.
Перед записью в него нового значения, проверяете на равенство со старым значением.
Если значения различны, то выводите новое значение на консоль в соответствующую позицию.
0
0 / 0 / 0
Регистрация: 28.01.2017
Сообщений: 15
29.01.2020, 23:19  [ТС]
Я не знал, как выводить что-то в конкретную точку консоли без того, чтобы перерисовать все с нуля)
Уже нашел, спасибо большое.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
29.01.2020, 23:31
Цитата Сообщение от yahnoyah Посмотреть сообщение
Уже нашел, спасибо большое.
После реализации напишите как помогло.
И если возможно - код реализации.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.01.2020, 23:31
Помогаю со студенческими работами здесь

Необходимо ускорить вывод данных
Есть двумерный массив из которого необходимо вывести данные в textbox2 с проверкой. Проверка и вывод происходит после каждого нового...

Ускорить вывод изображения в JLabel
Подскажите, пожалуйста, можно ли каким-то образом ускорить вывод изображения в JLabel. Использую двойную буферизацию, как off-screen буфер...

Ускорить вывод большой строковой переменной в консоль
Друзья, помогите, кто чем сможет, пожалуйста. Необходимо вывести 10 млн записей(Имя, адрес, телефон) в консоль. Я делаю так: создаю...

Построение иерарх. дерева на основе существующей БД. Как ускорить вывод данных.
Есть БД в которой заложен вывод данных в иерархическом виде (1С) т.е. там есть ID и ParentID (вхождение в ветвь). Мне нужно вывести...

Решето Эратосфена, кто может ускорить вывод чисел с 2 до 1000000 до 0,5 сек?
a,n = map(int,input().split()) c = d ='' for i in range(0,n+1): c.append(0) for i in range(2,n+1): for j in...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru