Расскажите о данном способе вывода в консоль

Столкнулся вот с таким способом вывода в консоль (его использовали вместо обычного cout<<, аргументируя это тем, что он быстрее):

wchar_t *screen = new wchar_t[nScreenWidth*nScreenHeight + 1]; // Массив для записи в буфер
HANDLE hConsole = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL); // Буфер экрана
SetConsoleActiveScreenBuffer(hConsole); // Настройка консоли
DWORD dwBytesWritten = 0; // Для дебага

screen[nScreenWidth * nScreenHeight] = '\0';  // Последний символ - окончание строки
WriteConsoleOutputCharacter(hConsole, screen, nScreenWidth * nScreenHeight, { 0, 0 }, &dwBytesWritten); // Запись в буфер

Я с ним не знаком и хотелось бы увидеть подробный разбор, буду очень благодарен :) Пытался погуглить, вышло не очень.

Если что, код вот из этой статьи (для контекста): http://ilinblog.ru/article.php?id_article=49


Ответы (1 шт):

Автор решения: Strunder

Рассказываю, (я вам в этой теме не до конца прошарен но отвечу) всё на самом деле довольно просто!

  1. 1 строка и вправду создаёт массив для записи в буфер, но отсюда вытекает вопрос

что за буфер?

Буфер экрана - это своего рода тоже массив (или точнее вектор зависящий от размеров окна). На 2 строке создаётся обращение к массиву буфера, то есть к тексту, что потом будет на экране! Это легко доказать просто выдели пустые места в консоли. На 3 строке через

SetConsoleActiveScreenBuffer

идёт разрешение на доступ к массиву (как-то так, но это не точно. НО без этого работать не будет) Дебаг на 4 строке есть дебаг тут всё понятно!

screen[nScreenWidth * nScreenHeight] = '\0';

здесь мы указываем последний символ для того чтоб был перенос символов и текст не улетал за экран! А последняя это запись в наш массив буфера и автоматическое обновление! => Мы имеем мгновенное изменение элементов текста в консоли и запись из 1 массива с информацией в другой буферный с авто обновлением! (это не 100% инфа это только как я сам понял этот код)

→ Ссылка