Доброго времени суток.
Я начинающий программист на С+ , пишу консольный игровой движок на С++ +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;
}
Спасибо за помощь.
Другие языки программирования и технологии
Помощь с проектом на C++
Такой вариант вас устроит?
#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;
}
#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;
}
консоль довольно медленная штука
чтобы не так сильно тормозило, попробуй с каждым кадром обновлять не всю консоль, а изменять только то что изменилось
чтобы не так сильно тормозило, попробуй с каждым кадром обновлять не всю консоль, а изменять только то что изменилось
Похожие вопросы
- Необходима помощь в решении задачи. C++
- Я пишу проект на C#.
- Программка c# нужна помощь
- Почему проект в Dev C++ не компилируется?
- Вывести название массива с помощью char, C++
- (C++) Нужна помощь в создании метода "пузырька".
- Описать код на C# с помощью госта 1981 года.
- [C++] Добавление .cpp-файлов в проект
- Запись звука с помощью DirectShow C#
- требуется помощь специалистов. Ребята что мне сделать с компьтером чтобы объединить память диска C и D