要测试 XRender(X11 的渲染扩展)性能,可以从基准测试、实际渲染场景、工具分析、代码级测试几个层面来做。下面给你一套比较完整、可操作的方案。
先确认你的程序或系统是否真的在用 XRender:
xdpyinfo | grep RENDER
如果输出包含 RENDER,说明 X Server 支持 XRender。
查看应用是否使用 XRender:
ldd your_app | grep Xrender
或:
xtrace your_app 2>&1 | grep Render
x11perf 可以测试 XRender 相关操作性能。
安装(示例):
sudo apt install x11-apps
测试 XRender 性能示例:
x11perf -renderrect
x11perf -rendercomp
x11perf -rendersrc
x11perf -rendercomppix
常用测试项:
| 测试项 | 含义 |
|---|---|
-renderrect |
纯矩形渲染 |
-rendercomp |
合成操作 |
-rendersrc |
源图像渲染 |
-rendercomppix |
图像合成 |
对比测试:
x11perf -renderrect -time 5
很多 GUI 程序通过 Cairo → XRender。
cairo-perf-trace
可测试:
XRender 性能受 合成器(compositor) 影响很大。
| 合成器 | 后端 |
|---|---|
xcompmgr |
XRender |
compton / picom |
XRender / GLX |
mutter |
XRender / GL |
kwin |
XRender / OpenGL |
测试方式:
# 关闭合成
killall picom
# 启用 XRender 合成
picom --backend xrender
然后用:
glxgears(对比)x11perf观察帧率、延迟、CPU 占用。
PictureXRenderComposite#include <X11/Xlib.h>
#include <X11/extensions/Xrender.h>
#include <stdio.h>
#include <time.h>
int main() {
Display *d = XOpenDisplay(NULL);
int screen = DefaultScreen(d);
Window root = RootWindow(d, screen);
Window win = XCreateSimpleWindow(d, root, 0, 0, 800, 600, 0, 0, 0);
XMapWindow(d, win);
XRenderPictFormat *fmt = XRenderFindVisualFormat(d, DefaultVisual(d, screen));
Picture picture = XRenderCreatePicture(d, win, fmt, 0, NULL);
XRenderColor color = {0xffff, 0x0000, 0x0000, 0xffff};
Picture fill = XRenderCreateSolidFill(d, &color);
clock_t start = clock();
for (int i = 0; i < 10000; i++) {
XRenderComposite(d, PictOpOver, fill, None, picture,
0, 0, 0, 0, 0, 0, 800, 600);
}
clock_t end = clock();
printf("Time: %f sec\n", (double)(end - start) / CLOCKS_PER_SEC);
XCloseDisplay(d);
return 0;
}
编译:
gcc test_xrender.c -o test_xrender -lX11 -lXrender
top
htop
perf top
xtrace your_app
或:
strace -c your_app
perf record -g your_app
perf report
测试时重点关注:
| 问题 | 说明 |
|---|---|
| 频繁创建 Picture | 很耗 |
| 软件回退 | XRender 回退到 CPU |
| 大区域重绘 | 性能下降 |
| 未使用合成缓存 | 重复合成 |
| 与 OpenGL 混用 | 上下文切换慢 |
如果你愿意,可以告诉我:
我可以给你更针对性的测试方案和代码模板。