# 2D GPU 性能测试

## 测试原理
2D GPU 性能测试主要评估在 2D 图形加速等常用操作中的性能表现，包含位块传输、矩形填充和清除、透明度混合等关键指标。
测试代码逻辑如下：
1. 记录测试起始时间
2. 2D GPU 处理函数循环执行 100 次
3. 记录测试结束时间
4. 根据测试起始、结束时间和执行次数计算 2D GPU 处理函数的平均耗时和帧率
## 测试准备工作

1. BSP 镜像中默认存放了可执行的测试程序 , 可以 `cd` 到如下路径查看 :
	```sh
	cd /app/platform_samples/chip_base_test/10_gpu_2d_test/

	ls
	bin  performance_test.sh
	```
2. 如果是自定义镜像的情况，可以从 BSP 源码目录中的 `app/samples/platform_samples/chip_base_test/10_gpu_2d_test` 目录拷贝到设备中

## 测试方法

1. 执行 `performance_test.sh`
   ```sh
   ./performance_test.sh
   ```
2. 打印如下结果：
```sh
root@buildroot:10_gpu_2d_test# ./performance_test.sh
[Case copy                          ] [Input 1*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1142191   us] [AverageConsume 11421  us] [FPS    87.6]
[Case multi_source_alphablend       ] [Input 4*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 2046196   us] [AverageConsume 20461  us] [FPS    48.9]
[Case resize                        ] [Input 1*1920*1080] [Output 3840*2160] [TestTimes   100] [TotalConsume 1227924   us] [AverageConsume 12279  us] [FPS    81.4]
[Case resize                        ] [Input 1*1920*1080] [Output  960*540 ] [TestTimes   100] [TotalConsume 80673     us] [AverageConsume 806    us] [FPS  1239.6]
[Case stitch                        ] [Input 4*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1357203   us] [AverageConsume 13572  us] [FPS    73.7]
[Case stitch                        ] [Input 2*3840*2160] [Output 3840*1080] [TestTimes   100] [TotalConsume 688650    us] [AverageConsume 6886   us] [FPS   145.2]
[Case alphablend                    ] [Input 1*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1146742   us] [AverageConsume 11467  us] [FPS    87.2]
[Case crop                          ] [Input 1*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1141900   us] [AverageConsume 11419  us] [FPS    87.6]
[Case rectangle_fill                ] [Input 1*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1143476   us] [AverageConsume 11434  us] [FPS    87.5]
```
## 测试指标
针对测试方法章节中的打印结果，分析如下：

| 测试项 | FPS | 说明 |
|--------|-----|------|
|copy|87.2| 使用 2DGPU 完成分辨率为 3840 * 2160 图像的拷贝操作 |
|multi_source_alphablend|48.9| 输入 4 个 3840 * 2160 图像融合成一个3840 *2160 的图像 |
|resize|81.4| 输入 1920*1080 的图像放大 4 倍后输出 3840 * 2160 的图像 |
|resize( 第 2 个 )|1239.6| 输入 1920 * 1080 的图像缩小 4 倍后输出 960 * 540 的图像 |
|stitch| 73.7| 输入 4 个 3840 * 2160的图像拼接成1个 3840 * 2160 的图像（输入图像的宽和高先各缩放 2 倍再拼接） |
|stitch（第 2 个）|145.2| 输入 2 个 3840 * 2160的图像拼接成1个 3840*1080 的图像（输入图像的宽和高先各缩放 2 倍再在水平方向拼接） |
|alphablend|87.2| 输入 2 个 3840 * 2160 的图像，两个图像的背景色是不同的，进行 alphablend 处理后，输出一个3840 * 2160 的图像  |
|crop|87.6| 输入 1 个 3840 * 2160 的图像，从输入图像的起始坐标 (0,0) 裁剪 3840 * 2160 的图像， 输出 3840 * 2160 的图像 （利用裁剪的方式实现图像拷贝）|
|rectangle_fill|87.5| 输入一个 3840 * 2160 的图像背景色是黑色，填充一个和输入图像大小一样的红色矩形框，输出 3840 * 2160 的图像 |

源码见 BSP 源码目录中的 `app/samples/platform_samples/sample_gpu_2d`

## 常见问题
1. 多次执行的结果之间有比较小的差别
- 问题描述：如下两次执行日志，测出的帧率是不同的
  第一次执行日志：
  ```sh
	[Case copy                          ] [Input 1*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1142191   us] [AverageConsume 11421  us] [FPS    87.6]
	[Case multi_source_alphablend       ] [Input 4*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 2046196   us] [AverageConsume 20461  us] [FPS    48.9]
	[Case resize                        ] [Input 1*1920*1080] [Output 3840*2160] [TestTimes   100] [TotalConsume 1227924   us] [AverageConsume 12279  us] [FPS    81.4]
	[Case resize                        ] [Input 1*1920*1080] [Output  960*540 ] [TestTimes   100] [TotalConsume 80673     us] [AverageConsume 806    us] [FPS  1239.6]
	[Case stitch                        ] [Input 4*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1357203   us] [AverageConsume 13572  us] [FPS    73.7]
	[Case stitch                        ] [Input 2*3840*2160] [Output 3840*1080] [TestTimes   100] [TotalConsume 688650    us] [AverageConsume 6886   us] [FPS   145.2]
	[Case alphablend                    ] [Input 1*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1146742   us] [AverageConsume 11467  us] [FPS    87.2]
	[Case crop                          ] [Input 1*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1141900   us] [AverageConsume 11419  us] [FPS    87.6]
	[Case rectangle_fill                ] [Input 1*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1143476   us] [AverageConsume 11434  us] [FPS    87.5]
  ```

  第二次执行日志：
  ```sh
  	[Case copy                          ] [Input 1*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1160530   us] [AverageConsume 11605  us] [FPS    86.2]
	[Case multi_source_alphablend       ] [Input 4*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 2069446   us] [AverageConsume 20694  us] [FPS    48.3]
	[Case resize                        ] [Input 1*1920*1080] [Output 3840*2160] [TestTimes   100] [TotalConsume 1243849   us] [AverageConsume 12438  us] [FPS    80.4]
	[Case resize                        ] [Input 1*1920*1080] [Output  960*540 ] [TestTimes   100] [TotalConsume 80530     us] [AverageConsume 805    us] [FPS  1241.8]
	[Case stitch                        ] [Input 4*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1371815   us] [AverageConsume 13718  us] [FPS    72.9]
	[Case stitch                        ] [Input 2*3840*2160] [Output 3840*1080] [TestTimes   100] [TotalConsume 695384    us] [AverageConsume 6953   us] [FPS   143.8]
	[Case alphablend                    ] [Input 1*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1160516   us] [AverageConsume 11605  us] [FPS    86.2]
	[Case crop                          ] [Input 1*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1160381   us] [AverageConsume 11603  us] [FPS    86.2]
	[Case rectangle_fill                ] [Input 1*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1149800   us] [AverageConsume 11498  us] [FPS    87.0]
  ```
- 问题分析：性能测试的逻辑是执行 100 次，计算的平均时间，所以存在 1 帧左右的偏差
- 解决办法：可以修改测试脚本 `performance_test.sh` 中执行次数（默认是 100 次，为了尽快输出测试结果）
