Tôi có ứng dụng dựa trên DirectX. Và gần đây tôi thấy rằng hàm Now()
trả về một giá trị sai khi được gọi từ bên trong vòng lặp chính của công cụ đồ họa của tôi. Nó cung cấp cho một giá trị được gọi trước khi khởi động động cơ và một giá trị khác (thường khác 2-3 phút trở lại hoặc chuyển tiếp) khi được gọi trong ứng dụng của tôi khi đồ họa được khởi động.Hàm Delphi Now() trả về một giá trị sai
Tôi thấy rằng Now()
chức năng là trình bao bọc cho chức năng Windows API GetLocalTime()
. Bất cứ ai cũng có thể chỉ ra những gì có thể ảnh hưởng đến giá trị trả về của chức năng này? Tôi sử dụng nhiều chức năng timeGetTime()
trong vòng lặp chính của ứng dụng của tôi, nó có thể là nguồn gốc của vấn đề không? Ngoài ra, tôi cần phải sử dụng chức năng CheckSyncronize()
trong vòng lặp chính ...
Bất kỳ ý tưởng nào? Tôi ra khỏi manh mối ... :(
mã của vòng lặp chính:
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;
Bây giờ() được gọi ở đâu đó trong f_OnFrame()
chức năng
Liệu nó misbehave trên tất cả các máy? Bạn có thể tái tạo điều này trong một chương trình mẫu nhỏ không? –
Có. Thực ra tôi đã nhận được lỗi này dưới dạng báo cáo lỗi. Tôi nghĩ rằng tôi có thể làm một chương trình nhỏ nhưng nó sẽ liên quan đến liên kết của công cụ đồ họa của tôi ... –
Tôi đã đăng một mã vòng lặp chính trong thông báo trên cùng. –