Форум: "WinAPI";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];
ВнизОсновной код приложния с ттаймером... Найти похожие ветки
← →
SkyRanger (2003-12-02 03:08) [0]Не подскажите нормальный код win API приложения, чтобы он по-человечески работал с таймером у меня сейчас сделанно так:
//Задаем размеры окна
WinHeight:=400;
WinWidth:=400;
WinTop:=100;
WinLeft:=100;
CreateMyWnd; //Создаем окно и получаем дискриптор
// Для уверенности что окно будет после запуска поверх остальных
ShowWindow(mywnd, SW_SHOW);
//Пока не будет посланно сообщение 0 программа будет работать
IsFinish := False;
while not IsFinish do
begin
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
if Msg.Message = WM_QUIT then
IsFinish := True
else
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
end
else
begin
FPSCnt:=FPSCnt+1; // Увеличиваем счетчик FPS
end;
WinPaint(); // Прорисовываем окно
// Если нажата ESC на выход
if (keyBuf[VK_ESCAPE]) then
IsFinish := True;
HandleKeys(); // обрабатываем нажатия клавишь
end;
//Освобождение памяти
FreeMem;
KillTimer(mywnd, timer_id);
UnRegisterClass(ClassName,hInstance);
Код окна соответственно:
{ MyWndProc
Функция обработки главного окна программы. }
function MyWndProc(wnd: hWnd; msg, wParam, lParam: longint): longint; stdcall;
var
s : string;
begin
case msg of
WM_CREATE : // Инициализация при создании окна
begin
OnWindowCreate(wnd,WinHeight,WinWidth,WinTop,WinLeft);
end;
WM_MOVE : begin // Изменение положения при перемещении окна
WinTop := LOWORD(lParam);
WinLeft:= HIWORD(lParam);
end;
WM_SIZE:begin // На случай изменения размеров окна
OnWinResize(LOWORD(lParam),HIWORD(lParam));
end;
WM_DESTROY: // Выход из программы
begin
PostQuitMessage(0);
result := 0;
end;
WM_TIMER: // Периодическое обновление окна
begin
if wparam = 1 then // Обновление счетчика FPS
begin
str(FPSCnt,s);
SetWindowText(mywnd, PChar(WindowTitle+" Demo FPS : " + s));
FPSCnt := 0;
Result := 0;
end;
end;
WM_KEYDOWN : // При нажатии клавиши отмечаем ее
begin
keyBuf[wParam] := True;
Result := 0;
end;
WM_KEYUP: // Когда клавиша отжата отмечаем это
begin
keyBuf[wParam] := False;
Result := 0;
end;
else
result := DefWindowProc(wnd, msg, WParam, LParam);
end;
end;
После того, как я поменял дома Geforce 2 MX 400 на ATI RADEON 9600 Pro У меня FPS зашкаливает за 999 и скорость ненормальная, хотя на Geforce 2 MX 400 все вроде достаточно медленно. Так что нужен код, чтобы он давал отсечку от таймера нормально, и перерисовка происходила СТРОГО через отмерянные промежутки времени...
← →
BiN (2003-12-02 10:23) [1]интересно, а как у тебя сочетаются команды
ShowWindow(mywnd, SW_SHOW);
и
KillTimer(mywnd, timer_id);
← →
SkyRanger (2003-12-03 04:28) [2]А они и не сочитаются... Это останки от предыдущего кода и находится все енто щастье перед end.
← →
BiN (2003-12-03 10:36) [3]procedure MySuperPuperTimerProc(H:HWND;MSG:UINT;idTimer:UINT;dwTime:DWORD); stdcall;
begin
//Делай чо хошь
end;
Var
TimerID:UINT;
MyHWND:HWND;
begin
TimerID:=123;
MyWnd:=CreateMyWnd;// не забудь определить WNDProc для своего окна
SetTimer(MyWnd, TimerID, MyTimerInterval,MySuperPuperTimerProc);
repeat
///Обрабатывай сообщения
until ...
...
killtimer(TimerID);
...
end;
← →
SkyRanger (2003-12-04 07:21) [4]
procedure MyTimerProc(H:HWND;MSG:UINT;idTimer:UINT;dwTime:DWORD); stdcall;
begin
WinPaint(); // Прорисовываем окно
// Если нажата ESC на выход
if (keyBuf[VK_ESCAPE]) then
IsFinish := True;
HandleKeys(); // обрабатываем нажатия клавишь
//Делай чо хошь
end;
SetTimer(mywnd, timer_id, 1000, @MyTimerProc);
Вот так сдеал, но результат плачевный, началися такие тормоза аж жуть... А если по-старому все ОК!
← →
BiN (2003-12-04 09:16) [5]ага конечно у тебя 1 кадр в секунду (1000 = 1000миллисекунд = 1 сек)
← →
SkyRanger (2003-12-04 09:19) [6]Ну ставил я 1, пофигу! Все равно притормаживает сволоч!
← →
BiN (2003-12-04 09:26) [7]минимально ты можешь ставить где-то 55-60 - экспериментируй
если у тебя везде GetLastError равен нулю, значит, в плане таймера ты все сделал ок. А тормоза - это, скорее, проблема твоих алгоритмов
← →
BiN (2003-12-04 09:58) [8]Кстати, я совсем забыл - ты же с графикой работаешь. В твоем случае лучше все-таки использовть GetTickCount для определения интервалов между кадрами
← →
SkyRanger (2003-12-15 08:45) [9]Блин.... Че то меня клинит... Подскажите пример использования GetTickCount сколько там лучше задержку поставить чтобы FPS был на уровне ну скажем 60...
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c