awtk/docs/optimation.md

99 lines
3.4 KiB
Markdown
Raw Normal View History

2018-10-21 11:09:55 +08:00
## 优化技巧
2018-03-12 21:24:24 +08:00
### 一、优化提示
2018-10-21 11:09:55 +08:00
* memcpy是最快的贴图方式所以对于不透明的图片尽量保持与Framebuffer一致的格式这样可以直接使用memcpy贴图。
2018-03-12 21:24:24 +08:00
2018-10-21 11:09:55 +08:00
> 比如FrameBuffer的格式是BGR565请定义宏WITH\_BITMAP\_BGR565。
2018-03-12 21:24:24 +08:00
2018-11-13 16:19:06 +08:00
* 背景图片使用JPG格式或者不透明的PNG文件。
* 旋转对于性能影响非常大,除非支持硬件加速旋转,最好不要使用旋转功能。
2018-12-06 09:12:38 +08:00
* 缩放对于性能影响较大,尽量按按原图大小显示。
2018-10-21 11:09:55 +08:00
* 如果支持硬件加速,确保(半)透明的图片解码成硬件支持的格式。
2018-10-17 15:33:26 +08:00
2018-10-21 11:09:55 +08:00
> 比如对于PXP/DMA2D硬件加速请定义宏WITH\_BITMAP\_BGRA。
2018-10-17 15:33:26 +08:00
2018-10-21 11:09:55 +08:00
* memcpy的速度对于AWTK非常重要。如果显示速度不理想请测试一下memcpy的速度。
2018-10-17 15:33:26 +08:00
2018-10-21 11:09:55 +08:00
> 如果memcpy的速度不理想请检查一下GUI使用的内存是否配置正确(如cache等)。
2018-10-22 07:04:22 +08:00
* 在窗口动画中,平移动画是最快的动画。所以请优先采用水平平移、垂直平移、底部弹出和顶部弹出几种动画。在没有硬件加速时,不要使用缩放和淡入的窗口动画。
* 在控件动画中,平移动画和值动画是最快的,淡入/淡出其次缩放和旋转是最慢的。PXP/DMA2D加速不能用于加速缩放和旋转所以除非有GPU否则缩放和旋转动画只适用于少量小图片。
2018-12-06 09:12:38 +08:00
* 在不旋转和缩放的情况下SVG图片比普通图片慢但在旋转和缩放的情况下SVG比普通图片快数倍。在仪表指针等需要旋转场景中使用SVG图片可以显著提高性能。
2018-10-21 11:09:55 +08:00
* 绘制一帧需要的时间是一个重要指标。
> 可以在src/base/window\_manager.c:window\_manager\_paint\_normal中查看wm->last\_paint\_cost的值。
* 排除法有时能快速定位性能瓶颈。
> 1.怀疑字体渲染太慢? 让lcd\_draw\_glyph直接返回看看效果如何。
> 2.怀疑图片渲染太慢? lcd\_draw\_image直接返回看看效果如何。
> 3.怀疑填充颜色太慢? lcd\_fill\_rect直接返回看看效果如何。
> 4.怀疑硬件加速没有效果,用纯软件渲染试试,对比一下渲染一帧需要的时间。
2018-10-21 12:21:53 +08:00
* 使用3个framebuffer可以避免GUI等待和拷贝能够有效提高帧率有条件时尽量启用。
2018-10-21 11:09:55 +08:00
* 猜测往往是错误的请用函数time\_now\_ms去度量你怀疑的地方。
### 二、工具
如果定义全局的宏(在工程中定义)ENABLE\_PERFORMANCE\_PROFILE会使用lcd\_profile对全部绘制函数(图片、文字和填充等等)进行时间统计。当绘制一帧需要的时间超过25ms会打印一些信息:
```
#####################################
src/base/lcd_profile.c:326
-------------------------------------
total_cost=30
draw_image_cost=18 times=1
draw_text_cost=0 times=15
fill_cost=0 times=15
stroke_cost=0 times=15
end_frame_cost=10
-------------------------------------
```
也可以在lcd\_profile\_end\_frame函数里设置一个断点从profile对象上能查看到更详细的统计信息
```
uint32_t total_cost;
uint32_t swap_cost;
uint32_t flush_cost;
uint32_t draw_image_cost;
uint32_t draw_image_times;
uint32_t draw_image_pixels;
uint32_t draw_text_cost;
uint32_t draw_text_times;
uint32_t draw_text_chars;
uint32_t fill_cost;
uint32_t fill_times;
uint32_t fill_pixels;
uint32_t stroke_cost;
uint32_t stroke_times;
uint32_t stroke_pixels;
```
>参考[lcd_profile.c](https://github.com/zlgopen/awtk/blob/master/src/base/lcd_profile.c)