From 302f18fbfeb622bd3f14b4e678de597c4565e13d Mon Sep 17 00:00:00 2001 From: Frank <91616163+softhack007@users.noreply.github.com> Date: Fri, 26 Jan 2024 17:08:37 +0100 Subject: [PATCH] small speedup * currentBri() is called for any setpixelColor(), so we can speed up everything (a bit) by allowing the compiler to inline which saves a few cycles of call/return overhead. * aligned the function with upstream, and added another optimization by only calling progress() when a transition is active. --- wled00/FX.h | 13 ++++++++++++- wled00/FX_fcn.cpp | 11 +++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/wled00/FX.h b/wled00/FX.h index 1cba9000..2a357e95 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -589,7 +589,18 @@ typedef struct Segment { void startTransition(uint16_t dur); // transition has to start before actual segment values change void handleTransition(void); uint16_t progress(void); //transition progression between 0-65535 - uint8_t currentBri(uint8_t briNew, bool useCct = false); + + // WLEDMM method inlined for speed (its called at each setPixelColor) + inline uint8_t currentBri(uint8_t briNew, bool useCct = false) { + uint32_t prog = (transitional && _t) ? progress() : 0xFFFFU; + if (transitional && _t && prog < 0xFFFFU) { + if (useCct) return ((briNew * prog) + _t->_cctT * (0xFFFFU - prog)) >> 16; + else return ((briNew * prog) + _t->_briT * (0xFFFFU - prog)) >> 16; + } else { + return (useCct ? briNew : (on ? briNew : 0)); // WLEDMM aligned with upstream + } + } + uint8_t currentMode(uint8_t modeNew); uint32_t currentColor(uint8_t slot, uint32_t colorNew); CRGBPalette16 &loadPalette(CRGBPalette16 &tgt, uint8_t pal); diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index c62ae60d..f405beaa 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -416,22 +416,25 @@ void Segment::startTransition(uint16_t dur) { } // transition progression between 0-65535 -uint16_t Segment::progress() { +uint16_t IRAM_ATTR_YN Segment::progress() { if (!transitional || !_t) return 0xFFFFU; unsigned long timeNow = millis(); if (timeNow - _t->_start > _t->_dur || _t->_dur == 0) return 0xFFFFU; return (timeNow - _t->_start) * 0xFFFFU / _t->_dur; } -uint8_t Segment::currentBri(uint8_t briNew, bool useCct) { - uint32_t prog = progress(); +// WLEDMM Segment::currentBri() is declared inline, see FX.h +#if 0 +uint8_t IRAM_ATTR_YN Segment::currentBri(uint8_t briNew, bool useCct) { + uint32_t prog = (transitional && _t) ? progress() : 0xFFFFU; if (transitional && _t && prog < 0xFFFFU) { if (useCct) return ((briNew * prog) + _t->_cctT * (0xFFFFU - prog)) >> 16; else return ((briNew * prog) + _t->_briT * (0xFFFFU - prog)) >> 16; } else { - return briNew; + return (useCct ? briNew : (on ? briNew : 0)); // WLEDMM aligned with upstream } } +#endif uint8_t Segment::currentMode(uint8_t newMode) { return (progress()>32767U) ? newMode : _t->_modeP; // change effect in the middle of transition