【发布时间】:2012-08-27 19:27:24
【问题描述】:
我有基于 DirectX 的应用程序。最近我发现Now() 函数在从图形引擎的主循环中调用时返回错误值。它会在引擎初始化之前调用一个值,而在我的应用程序中启动图形时调用另一个值(通常前后相差 2-3 分钟)。
我发现 Now() 函数是 Windows API GetLocalTime() 函数的包装器。任何人都可以指出什么会影响这个函数的返回值?我在我的应用程序的主循环中大量使用timeGetTime() 函数,这可能是问题的根源吗?另外我需要在主循环中使用CheckSyncronize() 函数...
有什么想法吗?我没有线索...... :(
主循环代码:
procedure Td2dCore.System_Run;
var
l_Msg: TMsg;
l_Point: TPoint;
l_Rect : TRect;
l_Finish: Boolean;
begin
if f_WHandle = 0 then
begin
System_Log('Engine was not started!');
Exit;
end;
if not Assigned(f_OnFrame) then
begin
System_Log('Frame function is not assigned!');
Exit;
end;
// MAIN LOOP
l_Finish := False;
while not l_Finish do
begin
// dispatch messages
if PeekMessage(l_Msg, 0, 0, 0, PM_REMOVE) then
begin
if l_Msg.message = WM_QUIT then
l_Finish := True;
DispatchMessage(l_Msg);
Continue;
end;
GetCursorPos(l_Point);
GetClientRect(f_WHandle, l_Rect);
MapWindowPoints(f_WHandle, 0, l_Rect, 2);
f_MouseOver := f_MouseCaptured or (PtInRect(l_Rect, l_Point) and (WindowFromPoint(l_Point) = f_WHandle));
if f_Active or f_DontSuspend then
begin
repeat
f_DeltaTicks := timeGetTime - f_Time0;
if f_DeltaTicks <= f_FixedDelta then
Sleep(1);
until f_DeltaTicks > f_FixedDelta;
//if f_DeltaTicks >= f_FixedDelta then
begin
f_DeltaTime := f_DeltaTicks / 1000.0;
// if delay was too big, count it as if where was no delay
// (return from suspended state for instance)
if f_DeltaTime > 0.2 then
if f_FixedDelta > 0 then
f_DeltaTime := f_FixedDelta / 1000.0
else
f_DeltaTime := 0.01;
f_Time := f_Time + f_DeltaTime;
f_Time0 := timeGetTime;
if(f_Time0 - f_Time0FPS < 1000) then
Inc(f_FPSCount)
else
begin
f_FPS := f_FPSCount;
f_FPSCount := 0;
f_Time0FPS := f_Time0;
end;
f_OnFrame(f_DeltaTime, l_Finish);
if Assigned(f_OnRender) then
f_OnRender();
ClearQueue;
{
if (not f_Windowed) and (f_FixedFPS = D2D_FPS_VSYNC) then
Sleep(1);
}
end;
{
else
if (f_FixedDelta > 0) and (f_DeltaTicks+3 < f_FixedDelta) then
Sleep(1);
}
end
else
Sleep(1);
CheckSynchronize;
end;
end;
Now() 在 f_OnFrame() 函数的某处被调用。
【问题讨论】:
-
它是否在所有机器上都出现异常?你能在一个小的示例程序中重现这个吗?
-
是的。实际上我收到了这个错误作为错误报告。我想我可以做一个小程序,但它会涉及到我的图形引擎的链接......
-
我已经在顶部消息中发布了一个主循环代码。
-
你能重现这种行为吗?它是否在所有机器上都出现异常?
-
是的。在我可以检查它的几台机器上它是不正常的......
标签: delphi datetime delphi-2007