707n PSRAM优化大屏刷新率方法
707n PSRAM优化大屏刷新率方法
一、优化目标
通过合理利用PSRAM缓存机制、优化页面设计及GPU任务处理逻辑,提升大屏动态特效的帧率表现,改善用户交互体验(如跟手效果、页面滑动流畅度)。
注意:大屏刷新率跟优化结果有关,系统不保证大屏帧率一定能优化到60fps。客户需根据项目实际情况,针对以下各点进行优化。
二、优化方案及实施步骤
1.跟手效果优化(TP报点中断调整)
问题原因:
a. TP报点速度太快,导致系统中累积的刷新点数量较多,导致快速划屏时, GPU 按照报点顺序逐个刷新过来,页面位置刷新总是滞后于手指触点后的几个点位置,看起来不跟手。常见现象为:快速划屏后手指停下,可见页面逐步移动到手指触点的过程。
b.不合理的丢帧机制,导致GPU刷新的点步进时近时远。 一般TP出厂默认报点率为100Hz,部分框架使用丢帧方式,每次GPU渲染新一帧就取当前最新的TP点进行渲染,可能出现有时没丢帧,有时丢了很多帧。常见现象为:快速划屏时页面跟随不流畅,有段落感。
优化原理:
适当降低TP(触控面板)报点中断频率,确保在一个TP周期内完成一帧的完整刷新,确保GPU每次刷新都在最新的点上,且刷新步进间隔均匀,同时能降低大量中断对性能的消耗。
实施步骤:




统计页面刷新时间,计算当前项目在帧率优化之后(执行后面帧率优化方法后)能达到的帧率,联系TP厂更新TP固件,调整TP中断触发间隔,使其与帧刷新周期匹配。
2.页面设计简化(减少GPU负载)
问题原因:
a.大屏时,UI页面中使用的图片相应会增大,同时大屏支持更丰富的UI元素,可能导致页面中使用的图片数量也增加。因此会导致GPU需要读取的UI资源数据量增加,需要计算、渲染的像素数量也增加,导致刷新帧率降低。
b.屏幕接收数据的速度有限制,一般屏幕如果主控按60fps速度输出推屏数据时,屏幕无法完整接收会出现花屏、颜色异常等不稳定问题。因此推屏速度只能在确保屏稳定工作的基础上尽可能快,同时需要分配时间给UI框架计算页面刷新信息,配置GPU 指令。如果过度追求刷新率,则UI框架、GPU渲染时间要相应减少,且推屏SPI速度太快可能屏工作不稳定。
优化原理:
a.减少UI框架逻辑运行时间;
b.简化页面设计,减少图片使用,使用性能最优压缩方式,降低GPU处理的数据量;
c.在确保屏工作稳定前提下,尽可能提升推屏速度。
实施步骤:
a.优化UI框架逻辑,减少UI框架计算时间;
b.减少高分辨率图片资源的使用,优先使用纯色图片,使用性能最优压缩方式;
c.适当提高推屏速度,但要确保屏幕工作稳定。
3.特效帧率优化(缩小合成范围)
问题原因:
GPU进行2 . 5D特效计算时,需要进行大量的数据与矩阵计算,2. 5D特效渲染的范围越大, GPU需要采集、计算、输出的数据量越多。同理减小特效渲染区域范围,降低GPU处理的数据量,可以适当提升特效帧率。
优化原理:
减小特效渲染的区域,减少GPU计算量。
实施步骤:
调整UI界面结构,通过页面设计适当使用贴图等内容,减少特效刷新区域同时避免页面过于单调。
4.页面帧先用PSRAM缓存
问题原因:
进入特效时,加载多个页面会导致GPU需要读取的图片数据量急剧增加,且GPU 指令链表长度增加。将部分页面预先渲染并缓存到PSRAM,在特效时作为图片使用,将原先一个页面的渲染工作降低为一个图片的渲染工作。
优化原理:
进入特效时将部分页面预先渲染并输出到PSRAM,在特效时直接使用帧缓存的图片,在进入特效时帧率可能降低,但完成缓存后特效帧率会有提升。
实施步骤:
a.按照原来流程创建页面的GPU任务链;
b.使用jlgpu_task_list_dump_to_psram()将页面的任务链渲染,并转储到 PSRAM;
c.使用 jlgpu_create_task_list_by_psram_img()为PSRAM中渲染好的图片创建GPU任务链;
d.使用步骤 c 中接口返回的任务链添加到特效任务链中;
e.释放步骤 c 中创建的GPU任务链;
f.按照原来的特效逻辑处理特效渲染;
g.参考 3D 立方体特效中接口调用(注意:示例代码默认 #if 0 屏蔽了)。注意事项:
a.步骤 b 中渲染到PSRAM中的图片会宽高做8字节对齐,步骤 c 中创建图片任务时会将补齐像素裁剪;
b.步骤 b 中转储到PSRAM 时,会调用 texture_line_to_tile_base 接口将行排列的数据转为块排列存放到PSRAM 中,加速后续GPU特效处理速度。
c.步骤 c 中创建图片任务时图片资源地址需转为nocache地址,adr_mode 需设置为0。
接口说明:
/* ------------------------------------------------------------------------------------*/
/**
- @brief jlgpu_task_list_dump_to_psram GPU任务链合成并转储到PSRAM块排列缓存*
- @Params head 待合成的GPU任务链
- @Params w 页面宽度
- @Params h 页面高度
- @Params disp_buf LCD配置的显存buf,用显存作为 GPU合成输出缓存,加快合成速度
- @Params disp_buf_size LCD配置的显存buf大小
- @return 转储到PSRAM后的帧buf地址*/
/* ------------------------------------------------------------------------------------*/
void jlgpu_task_list_dump_to_psram(pJLGPUTaskHead_t head, int w, int h, void disp_buf, int disp_buf_size);
/ ------------------------------------------------------------------------------------/
/** - @brief jlgpu_create_task_list_by_psram_img 将PSRAM中缓存的帧buf作为图片创建 GPU指令链表
- @Params psram_img PSRAM中缓存的图片地址
- @Params format PSRAM中缓存的图片数据格式,一般为RGB565格式
- @Params img_w PSRAM中缓存的帧数据宽度(页面原来的宽度)
- @Params img_h PSRAM中欢度的帧数据高度(页面原来的高度)
- @return GPU任务链
/
/ ------------------------------------------------------------------------------------/
pJLGPUTaskHead_tjlgpu_create_task_list_by_psram_img(void psram_img, int format, int img_w, int img_h);
/ ------------------------------------------------------------------------------------/
/** - @brief texture_line_to_tile_base 纹理行排列转为块排列*
- @Params dst 纹理输出(注意对齐)
- @Params src 纹理输入
- @Params src_w 纹理输入宽度
- @Params src_h 纹理输入高度
- @Params format 纹理格式,参考 GPU_format_t /
/ ------------------------------------------------------------------------------------*/
void texture_line_to_tile_base(void *dst, void *src, int src_w, int src_h, int format);
5.纹理输入数据用PSRAM缓存
问题原因:
707内封的PSRAM工作时钟144MHz, norflash工作时钟96MHz, GPU从 PSRAM取数据速度略快于从norflash取数据。
优化原理:
将部分高频访问的纹理数据先缓存到PSRAM 中,减少GPU直接从flash读取的数据量。且仅在页面初始化时缓存当前页面高频访问的纹理数据或较大数据量的纹理,不会占用过多PSRAM,同时对GPU读数据速度有一定优化作用。
实施步骤:
a.使用gpu_input_stream_cache_init 初始化GPU输入缓存模块,设置读数据回调、释放缓存回调;
b.使用 gpu_input_stream_cache_add 添加纹理数据到缓存模块缓存,并使用返回地址作为GPU纹理地址创建GPU任务;
c.使用 gpu_input_stream_cache_check 检查指定校验值的纹理是否已被缓存,如果不同GPU任务使用同一个校验值的纹理,本接口返回值可以直接使用;
d.使用 gpu_input_stream_cache_del 删除指定缓存的地址,如果需要删除指定校验值的缓存,先用步骤 c 接口获取缓存地址,再用本接口释放对应缓存空间;
e.使用 gpu_input_stream_cache_reset 清空所有缓存的数据,一般页面创建时缓存当前页面高频使用的纹理数据,页面释放时释放掉当前页面所缓存的所有数据即可。
注意事项:
避免PSRAM碎片化,优先缓存数据量大的纹理数据。
公版默认使用PSRAM和NANDFLASH宏包住本功能,默认不开,大屏需使用时参考ui_platform.c逻辑使用即可。
接口说明:

/* ------------------------------------------------------------------------------------*/
/**
- @brief gpu_input_stream_cache_init GPU 输入缓存到PSRAM模块初始化*
6 / 9
- @Params read_cb 读数据到PSRAM回调
- @Params free_cache 释放PSRAM缓存buf回调*//* ------------------------------------------------------------------------------------*/ void gpu_input_stream_cache_init(void (*read_cb)(void *priv, void dst, void src, int len), int (free_cache)(void cache));
/ ------------------------------------------------------------------------------------/
/ - @brief gpu_input_stream_cache_free GPU 输入缓存模块释放*/
/* ------------------------------------------------------------------------------------/
void gpu_input_stream_cache_free();
/ ------------------------------------------------------------------------------------*/
/** - @brief gpu_input_stream_cache_add 添加GPU输入数据缓存到PSRAM *
- @Params priv 回调参数,在调用读数据回调时的第一个参数
- @Params data 待缓存的数据地址
- @Params len 待缓存的数据长度
- @Params check 缓存的数据校验值,查找缓存中是否有数据时通过校验值查找
- @Params mmu_tb 数据分块存储时的mmu tab表,数据连续时传NULL
- @Params mmu_size 数据分块存储时的mmu tab表大小, mmu_tb不为NUL时有效*
- @return 数据缓存到PSRAM中的地址*/
/* ------------------------------------------------------------------------------------*/
void *gpu_input_stream_cache_add(void *priv, void *data, int len, u32 check, void *mmu_tb, int mmu_size);
| * @brief gpu_input_stream_cache_del 删除PSRAM中缓存的指定数据* * @Params cache_addr PSRAM中缓存的数据地址 |
|---|
/* ------------------------------------------------------------------------------------*/
/**
*
7 / 9
| * @return 0 删除成功, -1 模块中没找到这个地址的缓存 | ||
|---|---|---|
| */ |
/* ------------------------------------------------------------------------------------/
int gpu_input_stream_cache_del(void cache_addr);
/ ------------------------------------------------------------------------------------/
/**
- @brief gpu_input_stream_cache_check 检查指定校验值的数据是否在缓存中*
- @Params check 数据校验值
- @return NULL 指定校验值的数据没在缓存模块中,其它 指定校验值的数据在PSRAM中缓存的地址
/
/ ------------------------------------------------------------------------------------/
void gpu_input_stream_cache_check(u32 check);
/ ------------------------------------------------------------------------------------/
/** - @brief gpu_input_stream_cache_reset 清空GPU输入缓存模块中缓存的所有数据*
- @return 0 清空成功, -1 没有缓存的数据*/
/* ------------------------------------------------------------------------------------*/
int gpu_input_stream_cache_reset();
6.输出缓存介质优先级选择
问题原因:
GPU输出到不同的介质中速度不同,且需要经过不同的阶段也会导致GPU完成指定工作的时间不同。
优化原理:
选择GPU写入速度快的存储介质作为GPU输出的显存,加速GPU渲染速度。GPU 写速度比较:静态BUF > SRAM(malloc) > 分块PSRAM(每块24K以内) > 整帧 PSRAM
实施步骤:
优先使用静态BUF作为显存,参考app_config. h 中 CONFIG_LCD_BUF_STATIC_RAM_LEN配置显存buf长度,注意该长度要与LCD驱动中配置的分块长度一致,否则会断言。
