Другие языки программирования и технологии

Помощь с проектом на C++

Доброго времени суток.
Я начинающий программист на С+ , пишу консольный игровой движок на С++ +WinAPI, и вот проблема с выводом графики.
Консоль отрисовываеться ОЧЕНЬ медленно, почему - не могу понять. Алгоритм отрисовки работает через WinAPI (то есть без всяких cout, system("cls") , и т. д. ) - при полной прорисовке консоли : во-первых сама консоль медленно отрисовываеться, во-вторых видно как перерисовывается экран (на волну похоже) .
Но я видел консоли, алгоритм отрисовки которых работает тоже на WinAPI, но скорость отрисовки в разы больше.
Как можно сделать быструю прорисовку/отрисовку консоли на С++ WinAPI?
Вот мой код :

(алгоритм выводит на всю консоль случайные символы, частота отрисовки неограничена)

#include <windows.h>
#include <ctime>
using namespace std;

const int CONST_WINDOW_XSIZE = 80;
const int CONST_WINDOW_YSIZE = 50;

HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO sinfo = {0};
CONSOLE_CURSOR_INFO cinfo = {0};

int main(void) {

SetConsoleTitle(L"Для выхода Esc");

SMALL_RECT src = {0, 0, CONST_WINDOW_XSIZE-1, CONST_WINDOW_YSIZE-1};
SetConsoleWindowInfo (hout, true, &src);

GetConsoleScreenBufferInfo(hout, &sinfo);
sinfo.dwSize.Y = CONST_WINDOW_YSIZE;
sinfo.dwSize.X = CONST_WINDOW_XSIZE;

GetConsoleCursorInfo(hout, &cinfo);
cinfo.bVisible = FALSE;
SetConsoleCursorInfo(hout, &cinfo);

DWORD dwr = 1L;
WCHAR symbol = 30;

srand ( time(NULL) );

while(1) {

for(int iY = 0; iY <= CONST_WINDOW_YSIZE-3; iY++)
{
for(int iX = 0; iX <= CONST_WINDOW_XSIZE-3; iX++)
{
symbol = rand();
COORD newCoord = {iX,iY};

FillConsoleOutputCharacter(hout, symbol, 1uL, newCoord, &dwr);
FillConsoleOutputAttribute(hout, FOREGROUND_GREEN, 1uL, newCoord, &dwr);

}
}

}

return 0;
}

Спасибо за помощь.
Ratmir Imamytdinov
Ratmir Imamytdinov
36
Такой вариант вас устроит?

#include <windows.h>
#include <ctime>
#include <conio.h>
const size_t CWX = 80;
const size_t CWY = 50;
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO sinfo = {0};
CONSOLE_CURSOR_INFO cinfo = {0};
int main(void) {
    ::SetConsoleTitleW(L"Для выхода Esc");
    SMALL_RECT src = {0, 0, CWX - 1, CWY - 1};
    SetConsoleWindowInfo (hout, true, &src);
    GetConsoleScreenBufferInfo(hout, &sinfo);
    sinfo.dwSize.Y = CWY;
    sinfo.dwSize.X = CWX;
    GetConsoleCursorInfo(hout, &cinfo);
    cinfo.bVisible = FALSE;
    SetConsoleCursorInfo(hout, &cinfo);
    DWORD dwr = 1L;
    WCHAR symbol = 30;
    srand(unsigned(time(NULL)));
    const size_t size = CWX * CWY;
    char * symbols = new char [size];
    char * beg = NULL, * end = symbols + size - 1;
    size_t y = CWY - 3, x = CWX - 3, iY, iX, pos, n;
    COORD coord;
    bool flag = false;
    while(true) {
        beg = symbols;
        if (flag) {
            n = 0;
            while (n++ < size) {
                coord.Y = rand() % (y + 1);
                coord.X = rand() % (x + 1);
                FillConsoleOutputCharacter(hout, *beg++, 1uL, coord, &dwr);
                FillConsoleOutputAttribute(hout, FOREGROUND_GREEN, 1uL, coord, &dwr);
            }
        } else {
            while (beg <= end) *beg++ = 33 + rand() % 96;
            beg = symbols;
            for (iY = 0, pos = 0; iY <= y; iY++) {
                coord.Y = iY;
                for (iX = 0; iX <= x; iX++) {
                    coord.X = iX;
                    FillConsoleOutputCharacter(hout, *beg++, 1uL, coord, &dwr);
                    FillConsoleOutputAttribute(hout, FOREGROUND_GREEN, 1uL, coord, &dwr);
                }
            }
            flag = true;
        } if (_kbhit() && _getch() == 27) break;
    }
    delete[] symbols;
    return 0;
}
Сергей Елькин
Сергей Елькин
80 919
Лучший ответ
консоль довольно медленная штука
чтобы не так сильно тормозило, попробуй с каждым кадром обновлять не всю консоль, а изменять только то что изменилось