void Stage::render(lua_State *L) { LOOM_PROFILE_START(stageRenderBegin); GFX::Graphics::setNativeSize(getWidth(), getHeight()); GFX::Graphics::beginFrame(); updateLocalTransform(); lualoom_pushnative<Stage>(L, this); renderState.alpha = alpha; renderState.clipRect = Loom2D::Rectangle(0, 0, -1, -1); renderState.blendMode = blendMode; LOOM_PROFILE_END(stageRenderBegin); LOOM_PROFILE_START(stageRenderDisplayList); renderChildren(L); LOOM_PROFILE_END(stageRenderDisplayList); LOOM_PROFILE_START(stageRenderEnd); lua_pop(L, 1); GFX::Graphics::endFrame(); LOOM_PROFILE_END(stageRenderEnd); LOOM_PROFILE_START(waitForVSync); /* Update the screen! */ SDL_GL_SwapWindow(sdlWindow); LOOM_PROFILE_END(waitForVSync); }
void loom_tick() { if (atomic_load32(&gLoomTicking) < 1) { // Signal that the app has really stopped execution if (atomic_load32(&gLoomPaused) == 0) { atomic_store32(&gLoomPaused, 1); } // Sleep for longer while paused. // Since graphics aren't running in a paused state, there is no yielding // we would otherwise run in a busy loop without sleeping. loom_thread_sleep(30); return; } atomic_store32(&gLoomPaused, 0); Telemetry::beginTick(); LOOM_PROFILE_START(loom_tick); LSLuaState *vm = NULL; vm = LoomApplication::getReloadQueued() ? NULL : LoomApplication::getRootVM(); // Mark the main thread for NativeDelegates. On some platforms this // may change so we remark every frame. NativeDelegate::markMainThread(); if (vm) NativeDelegate::executeDeferredCalls(vm->VM()); performance_tick(); profilerBlock_t p = { "loom_tick", platform_getMilliseconds(), 17 }; if (LoomApplication::getReloadQueued()) { LoomApplication::reloadMainAssembly(); } else { if (vm) { // https://theengineco.atlassian.net/browse/LOOM-468 // decouple debugger enabled from connection time // as the debugger matures this may change a bit if (LoomApplicationConfig::waitForDebugger() > 0) { vm->invokeStaticMethod("system.debugger.DebuggerClient", "update"); } LoomApplication::ticks.invoke(); } } loom_asset_pump(); platform_HTTPUpdate(); GFX::Texture::tick(); if (Loom2D::Stage::smMainStage) Loom2D::Stage::smMainStage->invokeRenderStage(); finishProfilerBlock(&p); LOOM_PROFILE_END(loom_tick); LOOM_PROFILE_ZERO_CHECK() Telemetry::endTick(); }