@@ -72,16 +72,21 @@ void windowserver_t::startInputHandlers()
7272 }
7373
7474 server->loadCursor ();
75- server->requestUpdate ();
75+ server->requestUpdateLater ();
7676}
7777
78- void startOtherTasks ()
78+ void windowserver_t:: startOtherTasks ()
7979{
8080 g_task_register_id (" windowserver/launcher" );
8181 // TODO not the windowservers job
8282 g_spawn (" /applications/desktop.bin" , " " , " " , G_SECURITY_LEVEL_APPLICATION);
8383}
8484
85+ void windowserver_t::startLazyUpdateLoop ()
86+ {
87+ windowserver_t::instance ()->updateDebounceLoop ();
88+ }
89+
8590void windowserver_t::launch ()
8691{
8792 g_task_register_id (" windowserver" );
@@ -98,10 +103,10 @@ void windowserver_t::launch()
98103
99104 g_create_task ((void *) &interfaceRegistrationThread);
100105 g_create_task ((void *) &startOtherTasks);
106+ g_create_task ((void *) &startLazyUpdateLoop);
101107
102- updateTask = g_create_task_d ((void *) startUpdateLoop, this );
103108 renderTask = g_get_tid ();
104- renderLoop (screenBounds);
109+ updateLoop (screenBounds);
105110}
106111
107112void windowserver_t::createVitalComponents (g_rectangle screenBounds)
@@ -146,70 +151,62 @@ void windowserver_t::initializeVideo()
146151 }
147152}
148153
149- void windowserver_t::startUpdateLoop (windowserver_t * self)
150- {
151- self->updateLoop ();
152- }
153-
154- void windowserver_t::updateLoop ()
154+ void windowserver_t::updateLoop (const g_rectangle& screenBounds) const
155155{
156156 g_task_register_id (" windowserver/updater" );
157157
158- int timesUpdated = 0 ;
158+ graphics_t global;
159+ global.resize (screenBounds.width , screenBounds.height , false );
160+
161+ cursor_t ::nextPosition = g_point (screenBounds.width / 2 , screenBounds.height / 2 );
159162
163+ uint64_t lastUpdate = 0 ;
160164 g_mutex_acquire (updateLock);
161165 while (true )
162166 {
163- ++timesUpdated;
164167 eventProcessor->process ();
165168
166169 screen->resolveRequirement (COMPONENT_REQUIREMENT_UPDATE, 0 );
167170 screen->resolveRequirement (COMPONENT_REQUIREMENT_LAYOUT, 0 );
168171 screen->resolveRequirement (COMPONENT_REQUIREMENT_PAINT, 0 );
169172
170- requestRender ();
173+ screen->blit (&global, screenBounds, g_point (0 , 0 ));
174+ cursor_t::paint (&global);
175+
176+ output (&global);
171177
178+ framesTotal++;
172179 if (!g_mutex_acquire_to (updateLock, 1000 ))
173- {
174- klog (" Times updated: %i" , timesUpdated);
175- }
180+ klog (" Times updated: %i" , framesTotal);
181+
182+ auto now = g_millis ();
183+ if (now - lastUpdate < 10 )
184+ g_sleep (5 );
185+ lastUpdate = now;
176186 }
177187}
178188
179- void windowserver_t::requestUpdate () const
189+ void windowserver_t::requestUpdateImmediately () const
180190{
181191 g_mutex_release (updateLock);
182192}
183193
184-
185- void windowserver_t::renderLoop (g_rectangle screenBounds)
194+ void windowserver_t::requestUpdateLater () const
186195{
187- g_task_register_id (" windowserver/renderer" );
188-
189- graphics_t global;
190- global.resize (screenBounds.width , screenBounds.height , false );
191-
192- cursor_t ::nextPosition = g_point (screenBounds.width / 2 , screenBounds.height / 2 );
196+ g_mutex_release (lazyUpdateLock);
197+ }
193198
194- g_mutex_acquire (renderLock);
199+ void windowserver_t::updateDebounceLoop () const
200+ {
201+ g_mutex_acquire (lazyUpdateLock);
195202 while (true )
196203 {
197- screen->blit (&global, screenBounds, g_point (0 , 0 ));
198- cursor_t::paint (&global);
199-
200- output (&global);
201-
202- framesTotal++;
203- g_mutex_acquire_to (renderLock, 1000 );
204+ g_sleep (10 );
205+ g_mutex_acquire_to (lazyUpdateLock, 1000 );
206+ g_mutex_release (updateLock);
204207 }
205208}
206209
207- void windowserver_t::requestRender () const
208- {
209- g_mutex_release (renderLock);
210- g_yield_t (renderTask);
211- }
212-
213210void windowserver_t::output (graphics_t * graphics) const
214211{
215212 g_rectangle invalid = screen->grabInvalid ();
@@ -360,7 +357,7 @@ void windowserver_t::fpsCounter()
360357 std::stringstream s;
361358 s << " FPS: " << framesTotal << " , Time: " << seconds;
362359 instance ()->stateLabel ->setTitle (s.str ());
363- instance ()->requestUpdate ();
360+ instance ()->requestUpdateLater ();
364361 framesTotal = 0 ;
365362 }
366363}
0 commit comments