optimized WorkManager, fixed crash after close window.

This commit is contained in:
hyzboy 2025-01-25 20:01:37 +08:00
parent 6fdf0e1fbd
commit a569d08269
3 changed files with 32 additions and 25 deletions

View File

@ -157,10 +157,10 @@ int main(int,char **)
WorkManager wm(&rf);
AutoDelete<TestApp> app=new TestApp(&rf);
TestApp *test=new TestApp(&rf);
if(!app->Init())
if(!test->Init())
return(-2);
wm.Start(app);
wm.Start(test);
}

View File

@ -65,6 +65,7 @@ namespace hgl
double last_update_time=0;
double last_render_time=0;
double cur_time=0;
WorkObject *cur_work_object=nullptr;
@ -88,29 +89,23 @@ namespace hgl
void Update(WorkObject *wo)
{
double cur_time=GetDoubleTime();
double delta_time;
double delta_time=cur_time-last_update_time;
if(wo->IsTickable())
if(delta_time>=frame_time)
{
delta_time=cur_time-last_update_time;
if(delta_time>=frame_time)
{
last_update_time=cur_time;
wo->Tick(delta_time);
}
last_update_time=cur_time;
wo->Tick(delta_time);
}
}
if(wo->IsRenderable())
void Render(WorkObject *wo)
{
double delta_time=cur_time-last_render_time;
if(delta_time>=frame_time)
{
delta_time=cur_time-last_render_time;
if(delta_time>=frame_time)
{
last_render_time=cur_time;
wo->Render(delta_time);
}
last_render_time=cur_time;
wo->Render(delta_time);
}
}
@ -119,12 +114,24 @@ namespace hgl
if(!cur_work_object)
return;
Window *win=render_framework->GetWindow();
graph::GPUDevice *dev=render_framework->GetDevice();
while(!cur_work_object->IsDestroy())
{
Update(cur_work_object);
cur_time=GetDoubleTime();
render_framework->GetWindow()->Update();
render_framework->GetDevice()->WaitIdle();
if(cur_work_object->IsTickable())
Update(cur_work_object);
if(win->IsVisible()&&cur_work_object->IsRenderable())
{
Render(cur_work_object);
dev->WaitIdle();
}
if(!win->Update())
break;
}
}

2
res

@ -1 +1 @@
Subproject commit 475d8ad43ceee084cd24f5d0bed59de9f6aa36fd
Subproject commit e1a36d78f0eead5f6bb65493432c4690637b991d