Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Медленная отрисовка консоли на C++ WinAPI, Медленная отрисовка консоли на C++WinAPI 
:(
    Опции темы
АлексейX86
  Дата 7.2.2013, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 7.2.2013

Репутация: нет
Всего: нет



Доброго времени суток.
Я  - начинающий программист на С++ , пишу консольный игровой движок на С++ +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;
} 


Спасибо за помощь. smile 

PM MAIL   Вверх
volatile
Дата 8.2.2013, 00:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 13
Всего: 85



Цитата(АлексейX86 @  7.2.2013,  20:50 Найти цитируемый пост)
symbol = rand();

Не надо выводить полный набор wchar_t. 
Выводите нормальные символы.

PM MAIL   Вверх
xvr
Дата 8.2.2013, 11:14 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Сделайте у себя копию того, что хотите вывести и выводите потом 1 вызовом WriteConsoleOutput. Многочисленные вызовы FillConsoleOutput* для заполнения всего 1го элемента - это очень и очень медленно

PM MAIL   Вверх
АлексейX86
Дата 8.2.2013, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 7.2.2013

Репутация: нет
Всего: нет



xvr , спасибо за обяснение , но допустим у меня в игре есть ландшафт - массив char'ов , и у каждого этого char'а должен быть свой цвет в консоли , а я так понял что WriteConsoleOutput записыват прямоугольник чаров одного цвета :

Код

    BOOL WriteConsoleOutput(

        HANDLEhConsoleOutpu,           // дескриптор экранного буфера
        CONST CHAR_INFO *lpBuffer,   // буфер данных
        COORD dwBufferSize,               // размер буфера данных
        COORD dwBufferCoord,            // координаты ячейки
        PSMALL_RECT lpWriteRegion    // прямоугольник для чтения

    );

typedef struct _CHAR_INFO {

union {

        WCHAR UnicodeChar;
        CHAR AsciiChar;

      } Char;

    WORD Attributes;

} CHAR_INFO, *PCHAR_INFO;



Вот пример такого ландфафта :
(рисовал не я)
http://s1.ipicture.ru/Gallery/Viewfull/21462127.html

Или я не прав насчет WriteConsoleOutput?


Это сообщение отредактировал(а) АлексейX86 - 8.2.2013, 18:57
PM MAIL   Вверх
artsb
Дата 8.2.2013, 20:52 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 5
Всего: 64



Параметр
CONST CHAR_INFO *lpBuffer
это массив структур. Как вы сами указали, каждая такая структура содержит символ и его атрибуты.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
АлексейX86
Дата 9.2.2013, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 7.2.2013

Репутация: нет
Всего: нет



Спасибо всем , разобрался.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0445 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.