如何利用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;
}
相关推荐
BothSavage11 小时前
Trae远程开发中DeepSeek自定义模型4054错误的排查与修复
算法
小林ixn11 小时前
从暴力到KMP:一道题彻底搞懂字符串匹配的前世今生
算法
烬羽13 小时前
字符串算法入门:从反转字符串到回文判断,面试不再慌
算法·面试
先吃饱再说1 天前
判断回文字符串,从一行代码到双指针优化
算法
黄敬峰1 天前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
得物技术1 天前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六1 天前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
胡萝卜术2 天前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试