如何利用Lv值实现三级降帧

目录

一、核心逻辑(

[二、5 种帧率 → 精简为 3 级](#二、5 种帧率 → 精简为 3 级)

[三、LV 阈值划分](#三、LV 阈值划分)

四、代码实现


一、核心逻辑

亮度越暗 → LV 越小 → 帧率越低 亮度越亮 → LV 越大 → 帧率越高

三级降帧就是:

  1. 高亮度:高帧率(30fps)
  2. 中亮度:中帧率(20/25fps)
  3. 低亮度:低帧率(10/8fps)

二、5 种帧率 → 精简为 3 级

三级档位定义(最常用、最稳定)

  • 等级 3:高亮 → 30fps
  • 等级 2:中亮 → 20fps / 25fps
  • 等级 1:低亮 → 10fps / 8fps

三、LV 阈值划分

你的 LV 范围:0 ~ 19(+6 偏置后)

  1. LV ≥ 12.0 → 等级 3 → 30fps
  2. 6.0 ≤ LV < 12.0 → 等级 2 → 20/25fps
  3. LV < 6.0 → 等级 1 → 10/8fps

阈值可自由微调,逻辑不变。

滞回完美防抖动

  • 升高帧率:阈值 + 滞回
  • 降低帧率:阈值 − 滞回不会在阈值附近反复跳变。

四、代码实现

cpp 复制代码
#include <stdint.h>
#include <stdio.h>

// ==================== 核心配置 ====================
#define Q12_SCALE         4096       // Q12 定点格式 2^12
#define LV_OFFSET         6          // LV 偏置,确保全正数

// ==================== 三级帧率定义 ====================
typedef enum {
    FPS_8FPS     = 0,    // 低亮度
    FPS_20FPS    = 1,    // 中亮度
    FPS_30FPS    = 2,    // 高亮度
    FPS_DEFAULT  = FPS_30FPS
} FPS_LEVEL_e;

// ==================== 【可调参数】LV 阈值(浮点,方便调试) ====================
// LV 范围:0 ~ 19.0(已 +6 偏置)
#define LEVEL_HIGH_TO_MID    12.0f   // LV < 12 → 30→20
#define LEVEL_MID_TO_LOW     6.0f    // LV < 6  → 20→8
#define HYSTERESIS_VAL       0.5f    // 滞回宽度(防抖)

// ==================== 自动转 Q12 定点(无需手动计算) ====================
#define TO_Q12(val)          ((int32_t)((val) * Q12_SCALE))

static const int32_t THRESH_HIGH_MID  = TO_Q12(LEVEL_HIGH_TO_MID);
static const int32_t THRESH_MID_LOW   = TO_Q12(LEVEL_MID_TO_LOW);
static const int32_t HYST            = TO_Q12(HYSTERESIS_VAL);

// ==================== 优化版:三级降帧 + 滞回防抖 ====================
FPS_LEVEL_e auto_frame_control(int32_t lv_q12)
{
    static FPS_LEVEL_e cur_level = FPS_DEFAULT;  // 静态保存当前状态

    switch (cur_level)
    {
        // 当前:30fps(高亮)
        case FPS_30FPS:
            if (lv_q12 < THRESH_HIGH_MID - HYST)
                cur_level = FPS_20FPS;
            break;

        // 当前:20fps(中亮)
        case FPS_20FPS:
            if (lv_q12 >= THRESH_HIGH_MID + HYST)
                cur_level = FPS_30FPS;
            else if (lv_q12 < THRESH_MID_LOW - HYST)
                cur_level = FPS_8FPS;
            break;

        // 当前:8fps(低亮)
        case FPS_8FPS:
            if (lv_q12 >= THRESH_MID_LOW + HYST)
                cur_level = FPS_20FPS;
            break;

        default:
            cur_level = FPS_DEFAULT;
            break;
    }
    return cur_level;
}

// ==================== 帧率输出 ====================
void set_target_fps(FPS_LEVEL_e level)
{
    switch(level)
    {
        case FPS_30FPS: printf("FPS = 30\n"); break;
        case FPS_20FPS: printf("FPS = 20\n"); break;
        case FPS_8FPS:  printf("FPS = 8\n");  break;
        default:        printf("FPS = 30\n");
    }
}

// ==================== 调用示例 ====================
int main(void)
{
    // 传入 LUT 输出的 Q12 格式 LV(全正数)
    int32_t current_lv_q12 = TO_Q12(9.5f);

    // 自动判断等级
    FPS_LEVEL_e level = auto_frame_control(current_lv_q12);

    // 输出帧率
    set_target_fps(level);

    return 0;
}
相关推荐
大尚来也2 小时前
驾驭并发:.NET多线程编程的挑战与破局之道
java·前端·算法
向阳而生,一路生花2 小时前
深入浅出 JDK7 HashMap 源码分析
算法·哈希算法
君义_noip2 小时前
信息学奥赛一本通 4150:【GESP2509七级】⾦币收集 | 洛谷 P14078 [GESP202509 七级] 金币收集
c++·算法·gesp·信息学奥赛·csp-s
摸个小yu2 小时前
【力扣LeetCode热题h100】链表、二叉树
算法·leetcode·链表
汀、人工智能3 小时前
[特殊字符] 第93课:太平洋大西洋水流问题
数据结构·算法·数据库架构·图论·bfs·太平洋大西洋水流问题
ZPC82103 小时前
rviz2 仿真控制器与真实机器人切换
人工智能·算法·机器人
澈2073 小时前
双指针,数组去重
c++·算法
小辉同志3 小时前
207. 课程表
c++·算法·力扣·图论
CheerWWW3 小时前
深入理解计算机系统——位运算、树状数组
笔记·学习·算法·计算机系统