return false from RenderTicker when frame skipped

This commit is contained in:
Nick Fisher
2025-05-09 11:20:21 +08:00
parent 8a6ba637a7
commit 50c1c871a8

View File

@@ -29,12 +29,11 @@
#include <filament/TransformManager.h> #include <filament/TransformManager.h>
#include <filament/VertexBuffer.h> #include <filament/VertexBuffer.h>
#include "Log.hpp"
#include "RenderTicker.hpp"
#include <chrono> #include <chrono>
#include "Log.hpp"
#include "RenderTicker.hpp"
namespace thermion namespace thermion
{ {
@@ -63,10 +62,10 @@ namespace thermion
TRACE("Set %d views as renderable", numViews); TRACE("Set %d views as renderable", numViews);
} }
void RenderTicker::render(uint64_t frameTimeInNanos) bool RenderTicker::render(uint64_t frameTimeInNanos)
{ {
auto startTime = std::chrono::high_resolution_clock::now(); auto startTime = std::chrono::high_resolution_clock::now();
bool rendered = false;
std::lock_guard lock(mMutex); std::lock_guard lock(mMutex);
for (auto animationManager : mAnimationManagers) { for (auto animationManager : mAnimationManagers) {
@@ -88,14 +87,20 @@ namespace thermion
bool beginFrame = mRenderer->beginFrame(swapChain, frameTimeInNanos); bool beginFrame = mRenderer->beginFrame(swapChain, frameTimeInNanos);
if (beginFrame) if (beginFrame)
{ {
rendered = true;
auto durationNs = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now() - mLastRender).count() / 1e6f;
TRACE("Beginning frame (%.3f ms since last endFrame())", durationNs);
for (auto view : views) for (auto view : views)
{ {
mRenderer->render(view); mRenderer->render(view);
} }
mLastRender = std::chrono::high_resolution_clock::now();
} else { } else {
Log("Skipping frame"); auto durationNs = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now() - mLastRender).count() / 1e6f;
TRACE("Skipping frame (%.3f ms since last endFrame())", durationNs);
} }
mRenderer->endFrame(); mRenderer->endFrame();
#ifdef ENABLE_TRACING #ifdef ENABLE_TRACING
numRendered++; numRendered++;
} else { } else {
@@ -114,6 +119,7 @@ namespace thermion
float durationMs = durationNs / 1e6f; float durationMs = durationNs / 1e6f;
TRACE("Total render() time: %.3f ms", durationMs); TRACE("Total render() time: %.3f ms", durationMs);
return rendered;
} }
void RenderTicker::addAnimationManager(AnimationManager* animationManager) { void RenderTicker::addAnimationManager(AnimationManager* animationManager) {