|
最近观察到已经合并了Metal的API,所以我更新了下,并将我的项目迁移到Metal 运行发现了以下问题 1. 需要在 vendor.json 的 shaderc SPIRV-Cross 添加 -DDEPLOYMENT_TARGET="13.0"
2. 发现首帧耗时长 https://github.com/0x1306a94/SeatCanvas/tree/feature/0x1306a94_ios_metal |
Replies: 6 comments 12 replies
|
metal现在还在完善中,首帧卡顿是因为shader转换耗时很高,目前还是建议先使用opengl。后续会解决这个问题的。 |
|
@Hparty 关于第一个编译问题我看了下仓库中编译参数相关的。
最简单的解决方案就是直接修改 ios.toolchain.cmake:279 的默认值。 if(IOS)
list(APPEND TGFX_VENDOR_CMAKE_ARGS "-DDEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}")
endif()
message("TGFX_VENDOR_CMAKE_ARGS: ${TGFX_VENDOR_CMAKE_ARGS}")
add_vendor_target(tgfx-vendor STATIC_VENDORS ${TGFX_STATIC_VENDORS} SHARED_VENDORS ${TGFX_SHARED_VENDORS} CMAKE_ARGS ${TGFX_VENDOR_CMAKE_ARGS})不知道这种方式你觉得如何 |
|
目前 Metal 还在试验当中,由于 Metal shader 采用的是 GLSL -> SPIR-V -> MSL 这个转译的方案,实时 shader 编译耗时相对会高一些。 通过 benchmark 测试,Metal 在缓存 shader 后,整体性能相对 OpenGL 高 10% 左右。后续等待更多后端完成后,会开始解决 shader 实时编译的问题。预计方案是拆分 shader,只有在兜底情况下会启用实时编译。 |
|
@Hparty 之前我们分析发现,主要耗时是在那个那个符号表建立。我有个思路,不知道是否有价值采纳 方案一
方案二
|
|
仔细看了下 processors下面,离线化。拆分的工作量应该是很大的 |
|
目前预热可以通过业务侧在空闲时机主动 draw 一个简单的 rect 来实现,这样会触发首次 shader 编译,把符号表建立的开销(约 60ms)提前消化掉,后续每个 shader 编译就只需要 1-3ms 了。 暂时不打算提供专门的预热 API,因为 Metal 后端目前还在试验阶段,后续 shader 拆分方案落地后,shader 会按功能预先准备好,不再依赖实时编译,预热也就不再需要了。如果现在加一个 warm up 接口,等方案调整后这个接口就变成多余的了。 |
目前 Metal 还在试验当中,由于 Metal shader 采用的是 GLSL -> SPIR-V -> MSL 这个转译的方案,实时 shader 编译耗时相对会高一些。
通过 benchmark 测试,Metal 在缓存 shader 后,整体性能相对 OpenGL 高 10% 左右。后续等待更多后端完成后,会开始解决 shader 实时编译的问题。预计方案是拆分 shader,只有在兜底情况下会启用实时编译。