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

winAPI c++ Во время растягивания окна пропадает изображение (5 стр)

Страницы: 1 2 3 4 5
#60
7:58, 28 июля 2017

MrShoor
А вообще я тут осмыслил твоё предложение на счёт использования сообщений в диапазоне от WM_USER до 0x7FFF и идея мне показалась очень даже толковой :)
Спасибо за идею, буду её разрабатывать!


#61
15:29, 27 авг. 2017

Пытаюсь сделать по нормальному, как MrShoor сказал - и чё то стрёмно делается: между DispatchMessage и wndproc такая конская цепочка вызовов... ИЧСХ, проходит через opengl32.dll >_<

/*
The module executable file D:\chentrah\modules\_test022\_test022.dll is missing!

Call stack:
  cl_module.inc:46 (tmodule.load)  in chentrah.exe
  cl_module.inc:548 (tmodule.pulse)  in chentrah.exe
  framework_basic.pp:378 (tbasicframework.pulse)  in chentrah.exe
  framework_winapi.pp:438 (wndproc)  in chentrah.exe
  753962FAh in USER32.dll
  75396D3Ah in USER32.dll
  753A0D3Fh in USER32.dll
  753A0D65h in USER32.dll
  594C60FBh in opengl32.dll
  753962FAh in USER32.dll
  75396D3Ah in USER32.dll
  75396DE8h in USER32.dll
  75396E44h in USER32.dll
  7793011Ah in ntdll.dll
  75397BCAh in USER32.dll
  framework_winapi.pp:1275 (twinapiframework.heartbeat)  in chentrah.exe
  framework_basic.pp:525 (tbasicframework.mainthreadmainloop)  in chentrah.exe
  cl_main.inc:447 (run)  in chentrah.exe
  chentrah.lpr:113 (main)  in chentrah.exe
*/
#62
22:04, 27 авг. 2017

Cheb
> и чё то стрёмно делается: между DispatchMessage и wndproc такая конская цепочка
> вызовов... ИЧСХ, проходит через opengl32.dll >_<
А стремного то что?

#63
22:19, 27 авг. 2017

Ну... как же... Винда, системные DLL... Зловеще...

А, забейте. Это у меня застарелая травма от многих лет на непатченной, необновлённой Windows 98.

Изображение
#64
15:24, 1 сен. 2017

Благодаря советам MrShoor и некоторому количеству пляски с вуду-бубном было рождено нижеследующее чудовищное преступление против природы и разума: 
(вследствие модульной структуры движка, более логичные алгоритмы не годились, т.к. ведающая окном матка не знает, чем занимается игровой модуль: физикой там, рендером, или ворон считает, а модуль игровой DLL ничего не знает о платформе, ему периодически вызывают коллбек пульса, кормя с ложечки уже заполненной глобальной переменной, где приведены текущий размер окна, события мыши и прочая. Также любые дополнительные потоки - это вотчина игрового модуля, матка лишь помогает ему с обработкой исключений в потоках)

Оконная процедура. Обратите внимание на использование WM_TIMER: без него, если начать резайсить окно а потом просто остановить мышь, обновления останавливались, что неприемлемо ни для игры, ни для тулзета с потенциально анимированными задниками.

На событие таймера поставлена задержка, т.к. - это таки нештатный режим. В норме пульс должен вызываться из бесконечного цикла после обработки событий.

Ограничитель FPS есть как в самом пульсе - хитровывернутый HiResSleep, так и у игрового модуля может быть собственный, о котором матка ничего не знает.
Штатное поведение - держать 30 FPS, поднимать лимит до 60 если мышью активно шевелят (подсмотрел идею в Morrowind FPS Optimizer где для гуляния по местности можно было выставить, напрример, 20, а для битвы - 40)

+ Показать
#65
22:04, 1 сен. 2017

Cheb
Я бы еще WM_TIMER сделал через Invalidate:

      WM_TIMER: begin
        if Assigned(Framework) then with (Framework as TWinApiFramework) do begin
          CycleAccum+= Mother^.Timer.UsecDelta(@CycleBeginMark);
          if CycleAccum > (1000000 / 25) then
            InvalidateRect((Framework as TWinApiFramework).Windowhandle, nil, false);
        end;
        Exit(1);
      end;
#66
22:53, 1 сен. 2017

Ахтыжежеж... :(  "Слышу, слышу, но я разобрал катер." (с) капитан Зелёный
На днях снова доведу до компилируемости - и применю.

#67
5:21, 2 сен. 2017

MrShoor
> Я бы еще WM_TIMER сделал через Invalidate
Я решил бросить эту затею :) сделал отображение картинки при изменении размера и ладно, видно, как что меняется, а так смысла не вижу.
Хотя, когда сделаю курсор текстурой, это вообще актуальность потеряет :)))

#68
13:44, 18 сен. 2017

Сделал :D Работает :D
Ещё раз спасибо!

  function WndProc(hWnd: HWND; Msg: UINT;  wParam: WPARAM;  lParam: LPARAM): LRESULT; stdcall;
  var
    ps: TPaintStruct;
  begin
    if not (Assigned(Framework) and (Framework as TWinApiFramework).WindowSubsystemInitialized)
      then Exit(DefWindowProc(hWnd, Msg, wParam, lParam));
    case msg of
      WM_SIZE: begin
        if Assigned(Framework) then begin
          InvalidateRect((Framework as TWinApiFramework).Windowhandle, nil, false);
          Exit(0);
        end;
      end;
      WM_TIMER: begin
        if Assigned(Framework) then with (Framework as TWinApiFramework) do begin
          CycleAccum+= Mother^.Timer.UsecDelta(@CycleBeginMark);
          if CycleAccum > (1000000 / 25) then begin
            InvalidateRect(Windowhandle, nil, false);
          end;
        end;
        Exit(1);
      end;
      WM_PAINT: begin
        if Assigned(Framework) and (CurrentFrame > 30)
        then with (Framework as TWinApiFramework) do begin
          BeginPaint(WindowHandle, ps);
          try
            HeartbeatIsCalledRecursively:= true;
            Heartbeat; // recursion =8(
          finally
            HeartbeatIsCalledRecursively:= false;
          end;
          EndPaint(WindowHandle, ps);
          NoteThreadOccupation(tlk_PollingInput);
          Exit(1);
        end;
      end; 
[...]
    end;
    Result := DefWindowProc(hWnd, Msg, wParam, lParam) // Default result if nothing happens
  end;     

Значимость and (CurrentFrame > 30) в разнице между

Приступаю к загрузке модуля "Панель управления Чентры"
[кадр №4, 13:36:51.598, Пн, 18.09.2017]
Mother is loading the module #0...
  Writing to config, [session].MostRecentUsedModule = "_hub"... Ok
 Loading the module _hub.dll ...
<----=* ОШИБКА! ---- (расшифровку см. ниже) *=---->
=============== Сообщение об ошибке: ===============
Не удалось загрузить модуль _hub.dll
Отсутствует исполняемый файл модуля D:\chentrah\modules\chentrah\_hub.dll
Стек вызовов:
  cl_module.inc:46 (tmodule.load)  в debug-chentrah.exe
  cl_module.inc:549 (tmodule.pulse)  в debug-chentrah.exe
  framework_basic.pp:410 (tbasicframework.pulse)  в debug-chentrah.exe
  framework_winapi.pp:1302 (twinapiframework.heartbeat)  в debug-chentrah.exe
  framework_basic.pp:558 (tbasicframework.mainthreadmainloop)  в debug-chentrah.exe
  cl_main.inc:447 (run)  в debug-chentrah.exe
  chentrah.lpr:113 (main)  в debug-chentrah.exe
====================================================
МОДУЛЬ БЫЛ ВЫГРУЖЕН.
«ПРОБЕЛ»  - ПЕРЕЗАПУСК МОДУЛЯ,
«F12» + «BACKSPACE» - ВЫБОР МОДУЛЯ
«ESC» - ЗАВЕРШИТЬ ПРОГРАММУ.

и

Приступаю к загрузке модуля "Панель управления Чентры"
[кадр №4, 13:33:31.130, Пн, 18.09.2017]
Mother is loading the module #0...
  Writing to config, [session].MostRecentUsedModule = "_hub"... Ok
 Loading the module _hub.dll ...
<----=* ОШИБКА! ---- (расшифровку см. ниже) *=---->
  763F62FAh is C:\windows\syswow64\USER32.dll, base 763E0000h
  ..file "C:\windows\syswow64\USER32.zstabs", exists=False..
  ..file "D:\chentrah\modules\chentrah\bin\lineinfo\USER32.zstabs", exists=False..
Не найдена отладочная информация Stabs для C:\windows\syswow64\USER32.dll.
  763F62FAh is C:\windows\syswow64\USER32.dll, base 763E0000h
  ..file "C:\windows\syswow64\USER32.zdwarf2", exists=False..
  ..file "D:\chentrah\modules\chentrah\bin\lineinfo\USER32.zdwarf2", exists=False..
Не найдена отладочная информация Dwarf2 для C:\windows\syswow64\USER32.dll.
  77AD011Ah is C:\windows\SysWOW64\ntdll.dll, base 77AC0000h
  ..file "C:\windows\SysWOW64\ntdll.zstabs", exists=False..
  ..file "D:\chentrah\modules\chentrah\bin\lineinfo\ntdll.zstabs", exists=False..
Не найдена отладочная информация Stabs для C:\windows\SysWOW64\ntdll.dll.
  77AD011Ah is C:\windows\SysWOW64\ntdll.dll, base 77AC0000h
  ..file "C:\windows\SysWOW64\ntdll.zdwarf2", exists=False..
  ..file "D:\chentrah\modules\chentrah\bin\lineinfo\ntdll.zdwarf2", exists=False..
Не найдена отладочная информация Dwarf2 для C:\windows\SysWOW64\ntdll.dll.
=============== Сообщение об ошибке: ===============
Не удалось загрузить модуль _hub.dll
Отсутствует исполняемый файл модуля D:\chentrah\modules\chentrah\_hub.dll
Стек вызовов:
  cl_module.inc:46 (tmodule.load)  в debug-chentrah.exe
  cl_module.inc:549 (tmodule.pulse)  в debug-chentrah.exe
  framework_basic.pp:410 (tbasicframework.pulse)  в debug-chentrah.exe
  framework_winapi.pp:1299 (twinapiframework.heartbeat)  в debug-chentrah.exe
  framework_winapi.pp:450 (wndproc)  в debug-chentrah.exe
  763F62FAh в USER32.dll
  763F6D3Ah в USER32.dll
  763F6DE8h в USER32.dll
  763F6E44h в USER32.dll
  77AD011Ah в ntdll.dll
  763F7BCAh в USER32.dll
  framework_winapi.pp:1234 (twinapiframework.heartbeat)  в debug-chentrah.exe
  framework_basic.pp:558 (tbasicframework.mainthreadmainloop)  в debug-chentrah.exe
  cl_main.inc:447 (run)  в debug-chentrah.exe
  chentrah.lpr:113 (main)  в debug-chentrah.exe
====================================================
МОДУЛЬ БЫЛ ВЫГРУЖЕН.
«ПРОБЕЛ»  - ПЕРЕЗАПУСК МОДУЛЯ,
«F12» + «BACKSPACE» - ВЫБОР МОДУЛЯ
«ESC» - ЗАВЕРШИТЬ ПРОГРАММУ.

:D

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

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