-
Notifications
You must be signed in to change notification settings - Fork 73
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
疑似绘图效率偏低 #381
Comments
看了一下代码,初步的判断的原因是构造的用例比较特殊,你可以把Paint里的描边参数都去掉,改成填充Rect的方式再和Skia进行对比一下看看,应该会看到性能出现非常明显的变化。 解释一下原因:TGFX 本身也还在快速迭代开发中,很多的优化都是已知的但是需要有个优先级,我们的策略是优先优化更加接近实际业务场景下会普遍出现的调用方式。目前上层的业务场景要么是大规模简单图形的填充,要么是涉及描边的图形都会合并成一个Path并进行缓存,比较少遇到大规模简单图形的随机描边,这种还是偏向在测试场景下刻意去构造才会遇到,相比其他场景优先级就没那么高。所以目前简单图形的描边这块优化还没启动。目前描边都是直接转发给了复杂Path的绘制分支,这样也会导致无法进行draw call的合并。但这并不是最终的性能表现,后续如果加上简单图形描边的直绘能力,性能表现会和现在的简单图形填充接近,理论上像素更少可能还会更好一些。我们会在后续的排期里补上描边的优化。目前建议暂时可以先用简单图形的填充和Skia进行性能对比,这块的参考意义更大一些。如果填充这块还有差距我们会继续分析原因,至少优化到比Skia更好为止。 另外注意检查一下构造的Skia的用例是否是基于ANGLE运行的。TGFX目前在win平台是只能跑在ANGLE模拟的OpenGL上,也把Skia配置为使用ANGLE渲染对比就能确保是相同的测试条件了。 因为我们支持的平台特别的多,Windows平台优先级相比其他平台一直也偏低,最近已经排期开始会补上Windows平台原生的WGL后端支持。 |
目前main分支的编译问题已经解决,建议还是使用最新的main分支进行测试。另外关于MSVC的问题,tgfx在Windows上只有用MSVC编译,并没有提供clang编译选项,第三方库编译也是只有msvc。这块不太一样的地方是tgfx设计为了纯GPU渲染架构,并没有Skia的CPU渲染模块,所以理论上用哪个编译器对tgfx的性能影响也并不明显。 |
您提到 “目前建议暂时可以先用简单图形的填充和Skia进行性能对比”,看来你认为代码中 另外,您提到的Clang的编译,那是因为Skia针对Clang有特殊的优化;TGFX因为不清楚是否也有,所以也进行Clang的编译测试的。 最后,Skia的测试,我也有编译为WASM、采用WebGL的方式,10000个Rect动态刷新也能达到80FPS。 |
你说的那个还是显示为填充的是个Bug,用main分支最新的代码进行测试就行,2.1版本是有这个问题。 所以建议你把skia的具体测试项目也上传上来吧。我们分析一下你对Skia具体是怎么构造测试的。可能还是两边demo有部分测试条件没有完全对齐,这个要一起发出来才好对比。 |
"根据你的描述Skia的Web版本比它原生的性能还高,这个是非常违反常识的" 。其实,我针对Skia的测试,两者几乎是一样的。 而是直接把原生(桌面版)的代码,直接编译进入了CanvasKit中。这种情况下,Skia的Web版(CanvasKit)与原生的几乎是一样的,都是10000个Rect接近80FPS,8000个Rect接近100PFS。 demo.zip 原生Skia的编译参数如下: Skia版本:m132 |
收到,我们分析一下看看 |
你的这个 Skia demo 好像没有处理窗口的 pixelRatio,就是 main.cpp 里的 DPIAware() 相关设置,开启这个会适配窗口按照屏幕的高分辨率模式渲染。不确定你测试的设备屏幕缩放系数是多少,我本地的Windows设备这个系数是 2.5,也就说适配之后渲染的像素面积是原来的 6.25 倍,压力也是原来的 6 倍多。你可以检查一下两边 demo 测试的实际渲染分辨率是否一致,断点看一下最终传入给CreateWindow 那边的像素宽高具体是多少。这块要确保测试的时候渲染分辨率完全一致,以及测试用的矩形也不能是完全随机的尺寸,或者要随机到一致的结果。 我们已经把你最初的代码修改了一下适配了 main 分支最新的代码。可以直接检出 另外还有一个不同点,你给的这个Skia的测试demo跑的就是WGL的后端,而不是ANGLE。这里可能也会有明显的性能差别。我们正在构造一个mac平台下的tgfx和skia的相同对比测试,确保这些测试条件都是完全一致的,有结轮会同步出来,到时候把构建的测试代码也发出来。 |
我们在 Mac 平台构造的测试 demo 和结果已经出来了,TGFX 和 Skia 两个 demo 都是根据你原版的测试用例还原的,并确保了OpenGL 后端和分辨率都完全一致(每次运行的矩形尺寸还是有一定随机性,但在量级非常大从概率分布来说基本可以忽略了),这次的测试结果参考性会比较准确了。源代码在这里:tests.zip 运行截图
测试环境
Fill 模式
Stroke 模式
测试结论
后续优化我们近期会排期加上对简单图形描边的优化,采用跟填充一样的绘制方式实现,并开始在 Windows 平台适配原生的 WGL 的渲染后端。之所以前面在 Windows 平台测试的结论和 Mac 平台有出入,主要的原因可能是测试条件不一致,TGFX 是跑在了模拟 OpenGL 的 ANGLE 后端上,而 Skia 采用了原生的 WGL,加上两个测试的渲染分辨率可能也不一致。这块可以等我们适配完 WGL 之后重新对 Windows 平台进行测试。目前 Mac 平台没有这些问题,两个引擎都是在最佳性能状态下进行的测试,结果是比较能准确反应两个引擎的渲染效率的。 另外我们也会开启构建一个开源的 benchmark 项目,专注用于对比 TGFX 和 Skia 在各个性能维度和其他接口的全面对性能对比,每个用例都会同时提供 TGFX 和 Skia 的等价版本方便大家自己进行测试。这个 benchmark 项目后面也会作为 TGFX 优化性能的基准线。也欢迎大家能贡献更多接近真实使用场景的性能测试案例给我们。 |
感谢大佬的解惑,之前的确没注意分辨率、屏幕缩放方面。WGL与ANGEL对比,的确也有差异。 |
又看了一遍您的留言,晚点我再测一下。 |
也感谢你构造的测试用例,我们会收录到之后的benchmark项目里去。后续还有好的建议或优化欢迎反馈。 |
src.zip
修改了Hello2D的代码进行FPS的测试,代码详见上述src.zip附件。
TGFX版本: 1.2.1
操作系统:Windows11 Home,23H2
上述代码测试500个Rect进行不间断移动,FPS只有30多。
类似的代码,使用Skia可以进行8000(甚至更多)Rect的测试,FPS可以达到100左右。
以上两者测试,都使用clang v19.1.3进行编译,均为Release设置;
TGFX的渲染效率与MSVC进行编译 没有差别,Skia用MSVC编译效率会显著降低。
水平有限,以及TGFX不够熟悉,不排除我的测试代码有问题,
The text was updated successfully, but these errors were encountered: