# 横竖屏切换卡顿

#### 问题现象

静态页面或视频播放页面在平板横竖屏切换时卡顿，不够流畅。

#### 背景知识

横竖屏切换：横竖屏切换功能实现应用内既支持竖屏显示也支持横屏显示的效果。在窗口旋转时，屏幕尺寸变化会导致界面重新布局。为提高横竖屏切换的流畅度，需进行性能优化。

#### 问题定位

1.  检查是否有页面监听了窗口旋转事件，在接收到事件后触发状态变量的更新，并且该页面没有在aboutToDisappear页面销毁时注销监听事件。
2.  检查是否对文字使用零宽字符，如果该页面上的文字使用了零宽字符，会导致每个字符被转成图片，会带来额外的绘制负载。
3.  检查图片是否使用autoResize属性，当前旋转页面存在一些图片，未经合理的裁剪，图片过大会导致旋转卡顿。
4.  排查当前页面是否存在一些冗余的OnAreaChange事件、模糊或者一些线性变化linearGradient的属性，这些都比较耗时。
5.  检查是否调用window.getLastWindow的方式获取窗口实例出现延迟。

#### 分析结论

*   页面在旋转的页面以外存在其他页面监听了窗口变化等事件，会接收到事件并触发状态变量的更新和组件刷新，导致旋转卡顿。
*   在旋转过程绘制中，由于生成文字缓存非常耗时，所以会把文字转成图片，但是如果该页面上的文字使用了零宽字符，会导致每个字符被转成图片，会带来额外的绘制负载，导致旋转卡顿。
*   当前旋转页面存在一些图片，未经合理的裁剪，图片过大，导致旋转时重绘这些图片耗时过大，出现卡顿现象。
*   当前页面存在一些冗余的OnAreaChange事件、模糊或者一些线性变化linearGradient的属性或者其他耗时操作，这些操作在旋转页面时会重建，导致旋转卡顿。
*   由于getLastWindow底层原因，需要经过查找获取实例，一定程度上会有性能损耗，可能会出现已经发生横屏或者竖屏切换的情况下，状态栏还没切换的情况。

#### 修改建议

*   如果在旋转的页面以外存在其他页面没有被销毁，并且监听了窗口变化等事件，会接收到事件并触发状态变量的更新和组件刷新。此时需要使用ArkUI的冻结能力，将页面配置冻结属性，使其在在页面不可见状态下不触发其子组件状态变量的更新。
*   在旋转过程绘制中，由于生成文字缓存非常耗时，所以会把文字转成图片，但是如果该页面上的文字使用了零宽字符，会导致每个字符被转成图片，会带来额外的绘制负载。该场景可以使用wordBreak属性替代。
*   如果当前旋转页面存在一些图片，未经合理的裁剪，图片过大，可以对图片设置autoResize属性，使图片裁剪到合适的大小进行绘制。
*   排查当前页面的耗时操作，根据是否必须使用来决定进行适当优化，推荐采用多线程并发，可参考多线程并发概述。
*   调用window.getLastWindow的方式获取窗口实例出现延迟，此类场景的同步要求较高情况下，可以使用windowStage.getMainWindowSync的同步方式获取窗口实例。