ПрограммированиеФорумОбщее

Игровой цикл (4 стр)

Страницы: 1 2 3 4
#45
17:59, 3 мар 2017

cNoNim
основной цикл разгребал очередь, рендерящий тупо рендерил пок на все.
даже когда сломалась с фатальной ошибкой, или зависла игра, картинка рендерилась хоть бы че =)
а так да, это был велосипед, но простой, поэтому не буду приписывать в свои достижения велосипедостроения.

#46
20:53, 3 мар 2017

cNoNim
> слушай... без обид... откуда вообще вся эта инфа?
> то что ты пишешь?
> давай попробуем доки почитать?
> я понимаю это щас не модно и проще пороть бред на форуме изображая веское
> мнение
Я это написал в #40 сообщении, а чуть раньше в #32 я объяснял как работает WM_PAIN. Почитаем?

Виндой это гарантируется. В msdn где-то можно найти. WM_PAINT - не настоящая мессага, а генерируемая (т.е. GetMessage и PeekMessage генерируют её, когда в очереди нет никаких сообщений кроме WM_TIMER-а, и только если окно имеет не валидные участки), с одним из самых низких приоритетов. Ниже WM_PAINT по приоритетам только WM_TIMER.

Это внезапно почти то же самое, что ты пытаешься мне доказать. Почему почти? Потому что твои сведения не полные.
Почему не полные? Потому что WM_TIMER ниже по приоритету, и пока в очереди установлен этот самый флажок, генерирующий WM_PAINT - ты не получишь WM_TIMER.

cNoNim
> достаточно самого тупого цикла
Твой тупой цикл почти нормальный. Осталось его чуть починить, чтобы было совсем нормально:

    while (!done) {
        while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
            if (msg.message == WM_QUIT)
                done = true;
            else {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
        RedrawWindow(demo.window, NULL, NULL, RDW_INTERNALPAINT);
    }

Почему так? Тот же самый пресловутый WM_TIMER будет выгребаться каждый заход, а не когда получится.
Но ты не привел обработчик WM_PAINT. А я говорил именно про него

GetUpdateRect звать надо в любом случае, чтобы определять надо звать BeginPaint/EndPaint или нет. Либо если это рендер - нужно будет звать ValidateRect. Иначе WM_PAINT будет все время в очереди сидеть.

Ведь GetUpdateRect, BeginPaint, EndPaint зовут именно в нем. Почему надо звать? Потому что пока у тебя есть не валидный регион в окне - GetMessage/PeekMessage будет постоянно выгребать WM_PAINT и до WM_TIMER дело не дойдет. BeginPaint/EndPaint помечают всю невалидную область валидной. ValidateRect делает тоже самое (но для заданного региона).
Чтобы проверить это - далеко ходить не надо. Можешь взять этот мой пример: http://pastebin.com/9dmsbbYc
Закомментировать строки:

            hdc = BeginPaint(hWnd, &ps);
            EndPaint(hWnd, &ps);

И посмотреть, сколько раз будет вызван обработчик таймера в TimerProc

p.s. Ну и я лично против, когда в оконном цикле напрямую вставляют RedrawWindow/InvalidateRect, потому что это только чтобы атмосферу греть. Какой смысл выводить одинаковую картинку несколько раз подряд? Вот у тебя физика не обновилась, ни одного Update не прошло, пользователь ничего не нажал, а ты уже как молодец 10 одинаковых кадров отрисовал. Не чем больше занять железо чтоль?

#47
3:49, 4 мар 2017

MrShoor
Сори я щас в дрободан... Ты напиши зачем тебе таймер а я отвечу завтра.... Ну если ты не написал ещк

Страницы: 1 2 3 4
ПрограммированиеФорумОбщее

Тема в архиве.