Skip to content

Commit bb5d5c7

Browse files
authored
Refactor director APIs (#3242)
- Rename Director's startAnimation/stopAnimation to activate/deactivate, isValid to isActive - Rename Director's stepFrame to renderFrame - Fix applicationEnterForground can't trigger
1 parent 2f2c079 commit bb5d5c7

19 files changed

Lines changed: 218 additions & 207 deletions

File tree

axmol/base/Director.cpp

Lines changed: 116 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -293,105 +293,6 @@ void Director::setRenderDefaults()
293293
_renderer->setDepthCompareFunc(rhi::CompareFunc::LESS_EQUAL);
294294
}
295295

296-
// process 1 frame
297-
void Director::processFrame()
298-
{
299-
const auto canRender = _renderer->beginFrame();
300-
301-
// calculate "global" dt
302-
calculateDeltaTime();
303-
304-
if (_renderView)
305-
_renderView->pollEvents();
306-
307-
// tick before glClear: issue #533
308-
if (!_paused)
309-
{
310-
_eventDispatcher->dispatchEvent(_eventBeforeUpdate);
311-
_scheduler->update(_deltaTime);
312-
performFrameTasks(_nextUpdateTasks);
313-
_eventDispatcher->dispatchEvent(_eventAfterUpdate);
314-
}
315-
316-
if (canRender) [[likely]]
317-
{
318-
_renderer->clear(ClearFlag::ALL, _clearColor, 1, 0, -10000.0);
319-
320-
_eventDispatcher->dispatchEvent(_eventBeforeDraw);
321-
322-
/* to avoid flickr, nextScene MUST be here: after tick and before draw.
323-
* FIXME: Which bug is this one. It seems that it can't be reproduced with v0.9
324-
*/
325-
if (_nextScene)
326-
{
327-
setNextScene();
328-
}
329-
330-
if (_runningScene)
331-
{
332-
_runningScene->tick(_deltaTime);
333-
334-
// clear draw stats
335-
_renderer->clearDrawStats();
336-
337-
// render the scene
338-
_renderView->renderScene(_renderer, _runningScene);
339-
340-
_eventDispatcher->dispatchEvent(_eventAfterVisit);
341-
}
342-
343-
// draw the notifications node
344-
if (_notificationNode)
345-
{
346-
auto previousCamera = Camera::_visitingCamera;
347-
auto* overlayCamera = getOverlayCamera();
348-
if (overlayCamera)
349-
{
350-
Camera::_visitingCamera = overlayCamera;
351-
overlayCamera->apply();
352-
_notificationNode->visit(_renderer, Mat4::identity, 0);
353-
}
354-
Camera::_visitingCamera = previousCamera;
355-
}
356-
357-
updateFrameRate();
358-
359-
if (_statsDisplay)
360-
{
361-
#if !AX_STRIP_FPS
362-
showStats();
363-
#endif
364-
}
365-
366-
#ifdef AX_ENABLE_OPENXR
367-
showVRModeIndicator();
368-
#endif
369-
370-
_renderer->render();
371-
372-
_eventDispatcher->dispatchEvent(_eventAfterDraw);
373-
374-
_totalFrames++;
375-
376-
// swap buffers
377-
if (_renderView)
378-
{
379-
_renderView->swapBuffers();
380-
}
381-
382-
_renderer->endFrame();
383-
}
384-
385-
if (_statsDisplay)
386-
{
387-
#if !AX_STRIP_FPS
388-
calculateMPF();
389-
#endif
390-
}
391-
392-
_poolManager->getCurrentPool()->clear();
393-
}
394-
395296
void Director::calculateDeltaTime()
396297
{
397298
// new delta time. Re-fixed issue #1277
@@ -651,7 +552,7 @@ void Director::runWithScene(Scene* scene)
651552
AXASSERT(_runningScene == nullptr, "_runningScene should be null");
652553

653554
pushScene(scene);
654-
startAnimation();
555+
activate();
655556
}
656557

657558
void Director::replaceScene(Scene* scene)
@@ -915,7 +816,7 @@ void Director::reset()
915816
_scenesStack.popBack();
916817
}
917818

918-
stopAnimation();
819+
deactivate();
919820

920821
AX_SAFE_RELEASE_NULL(_FPSLabel);
921822
AX_SAFE_RELEASE_NULL(_drawnBatchesLabel);
@@ -1001,7 +902,7 @@ void Director::restartDirector()
1001902
_poolManager->getCurrentPool()->clear();
1002903

1003904
// Restart animation
1004-
startAnimation();
905+
activate();
1005906

1006907
// Real restart in script level
1007908
#if AX_ENABLE_SCRIPT_BINDING
@@ -1442,16 +1343,16 @@ void Director::setEventDispatcher(EventDispatcher* dispatcher)
14421343
}
14431344
}
14441345

1445-
void Director::startAnimation()
1346+
void Director::activate()
14461347
{
1447-
startAnimation(SetIntervalReason::BY_ENGINE);
1348+
activate(SetIntervalReason::BY_ENGINE);
14481349
}
14491350

1450-
void Director::startAnimation(SetIntervalReason reason)
1351+
void Director::activate(SetIntervalReason reason)
14511352
{
14521353
_lastUpdate = std::chrono::steady_clock::now();
14531354

1454-
_invalid = false;
1355+
_active = true;
14551356

14561357
_axmol_thread_id = std::this_thread::get_id();
14571358

@@ -1504,35 +1405,131 @@ void Director::performFrameTasks(FrameTaskQueue& frameTasks)
15041405
}
15051406
}
15061407

1507-
void Director::stepFrame()
1408+
void Director::renderFrame()
15081409
{
1509-
if (_cleanupDirectorInNextLoop)
1410+
if (_renderView)
1411+
_renderView->pollEvents();
1412+
1413+
if (_cleanupDirectorInNextLoop) [[unlikely]]
15101414
{
15111415
_cleanupDirectorInNextLoop = false;
15121416
cleanupDirector();
1417+
return;
15131418
}
1514-
else if (_restartDirectorInNextLoop)
1419+
1420+
if (_restartDirectorInNextLoop) [[unlikely]]
15151421
{
15161422
_restartDirectorInNextLoop = false;
15171423
restartDirector();
1518-
_renderView->pollEvents();
1424+
return;
1425+
}
1426+
1427+
if (!_active) [[unlikely]]
1428+
return;
1429+
1430+
const auto canRender = _renderer->beginFrame();
1431+
1432+
// calculate "global" dt
1433+
calculateDeltaTime();
1434+
1435+
// tick before glClear: issue #533
1436+
if (!_paused)
1437+
{
1438+
_eventDispatcher->dispatchEvent(_eventBeforeUpdate);
1439+
_scheduler->update(_deltaTime);
1440+
performFrameTasks(_nextUpdateTasks);
1441+
_eventDispatcher->dispatchEvent(_eventAfterUpdate);
1442+
}
1443+
1444+
if (canRender) [[likely]]
1445+
{
1446+
_renderer->clear(ClearFlag::ALL, _clearColor, 1, 0, -10000.0);
1447+
1448+
_eventDispatcher->dispatchEvent(_eventBeforeDraw);
1449+
1450+
/* to avoid flickr, nextScene MUST be here: after tick and before draw.
1451+
* FIXME: Which bug is this one. It seems that it can't be reproduced with v0.9
1452+
*/
1453+
if (_nextScene)
1454+
{
1455+
setNextScene();
1456+
}
1457+
1458+
if (_runningScene)
1459+
{
1460+
_runningScene->tick(_deltaTime);
1461+
1462+
// clear draw stats
1463+
_renderer->clearDrawStats();
1464+
1465+
// render the scene
1466+
_renderView->renderScene(_renderer, _runningScene);
1467+
1468+
_eventDispatcher->dispatchEvent(_eventAfterVisit);
1469+
}
1470+
1471+
// draw the notifications node
1472+
if (_notificationNode)
1473+
{
1474+
auto previousCamera = Camera::_visitingCamera;
1475+
auto* overlayCamera = getOverlayCamera();
1476+
if (overlayCamera)
1477+
{
1478+
Camera::_visitingCamera = overlayCamera;
1479+
overlayCamera->apply();
1480+
_notificationNode->visit(_renderer, Mat4::identity, 0);
1481+
}
1482+
Camera::_visitingCamera = previousCamera;
1483+
}
1484+
1485+
updateFrameRate();
1486+
1487+
if (_statsDisplay)
1488+
{
1489+
#if !AX_STRIP_FPS
1490+
showStats();
1491+
#endif
1492+
}
1493+
1494+
#ifdef AX_ENABLE_OPENXR
1495+
showVRModeIndicator();
1496+
#endif
1497+
1498+
_renderer->render();
1499+
1500+
_eventDispatcher->dispatchEvent(_eventAfterDraw);
1501+
1502+
_totalFrames++;
1503+
1504+
// swap buffers
1505+
if (_renderView)
1506+
{
1507+
_renderView->swapBuffers();
1508+
}
1509+
1510+
_renderer->endFrame();
15191511
}
1520-
else if (!_invalid)
1512+
1513+
if (_statsDisplay)
15211514
{
1522-
processFrame();
1515+
#if !AX_STRIP_FPS
1516+
calculateMPF();
1517+
#endif
15231518
}
1519+
1520+
_poolManager->getCurrentPool()->clear();
15241521
}
15251522

1526-
void Director::stepFrame(float dt)
1523+
void Director::renderFrame(float dt)
15271524
{
15281525
_deltaTime = dt;
15291526
_deltaTimePassedByCaller = true;
1530-
stepFrame();
1527+
renderFrame();
15311528
}
15321529

1533-
void Director::stopAnimation()
1530+
void Director::deactivate()
15341531
{
1535-
_invalid = true;
1532+
_active = false;
15361533
}
15371534

15381535
void Director::setAnimationInterval(float interval)
@@ -1543,10 +1540,10 @@ void Director::setAnimationInterval(float interval)
15431540
void Director::setAnimationInterval(float interval, SetIntervalReason reason)
15441541
{
15451542
_animationInterval = interval;
1546-
if (!_invalid)
1543+
if (_active)
15471544
{
1548-
stopAnimation();
1549-
startAnimation(reason);
1545+
deactivate();
1546+
activate(reason);
15501547
}
15511548
}
15521549

0 commit comments

Comments
 (0)