3D项目智能手机端触屏控制物体沿X轴移动的平滑优化问询
3D项目单指触屏控制X轴移动的卡顿修复方案
现存代码的卡顿核心原因
- 运行周期错配:将触屏输入逻辑写在
FixedUpdate中,该方法按固定物理频率执行(默认每0.02s触发一次),远低于智能手机的触屏采样频率、屏幕渲染帧率(通常60Hz以上),导致触屏位移增量的感知存在延迟,视觉上出现跳变、卡顿。 - 冗余逻辑消耗:原代码每帧无论是否触发触屏操作,都会两次执行全量
Vector3位置赋值,不仅会产生无意义的临时对象增加GC压力,还存在逻辑覆盖风险——末尾的Z轴更新逻辑会读取上一次的transform值,容易抵消触屏修改的X轴位移效果。 - 无帧率适配的位移计算:直接将触屏的
deltaPosition.x乘灵敏度系数,没有对增量做时间归一化处理,在触屏采样频率波动时会出现位移速度忽快忽慢的抖动。
适配流畅移动的修改代码
调整核心逻辑为:将触屏输入的感知计算放到Update中,匹配屏幕刷新和触屏采样频率;将实际的物理位移更新放到FixedUpdate中,和运动逻辑对齐;通过目标值插值进一步消除位移跳变。
[SerializeField] private float xMoveSensitivity = 0.02f; // 横向移动灵敏度,根据实际手感调整 [SerializeField] private float forwardSpeed = 5f; // Z轴自动前进速度 [SerializeField] private float xMoveSmoothness = 10f; // X轴移动的平滑系数 [SerializeField] private float maxXRange = 3f; // X轴移动的边界范围,防止物体移出屏幕 private Touch currentTouch; private float targetXOffset; // 存储触屏计算得到的X轴目标偏移值 void Update() { // 单指触屏的横向位移感知逻辑,匹配设备触屏采样、屏幕渲染的刷新频率 if (Input.touchCount == 1) { currentTouch = Input.GetTouch(0); if (currentTouch.phase == TouchPhase.Moved) { // 累积计算目标X轴偏移,添加边界限制避免物体越界 targetXOffset += currentTouch.deltaPosition.x * xMoveSensitivity; targetXOffset = Mathf.Clamp(targetXOffset, -maxXRange, maxXRange); } } } void FixedUpdate() { // 物理帧仅负责执行实际位置更新,保证运动逻辑稳定 // 更新Z轴自动前进的位移 transform.position += new Vector3(0, 0, forwardSpeed * Time.fixedDeltaTime); // 平滑插值到目标X轴位置,消除跳变感 float smoothedX = Mathf.Lerp( transform.position.x, targetXOffset, Time.fixedDeltaTime * xMoveSmoothness ); // 仅更新变化的X轴分量,减少冗余计算 transform.position = new Vector3(smoothedX, transform.position.y, transform.position.z); }
进一步优化的操作建议
- 避免在触屏相位判断中直接修改
transform.position,先将输入值换算为目标偏移量,再通过插值完成实际位移,从根源上解决输入采样和位置更新不同步的问题。 - 针对高刷新率(120Hz/144Hz)设备,将触屏增量除以当前帧的真实时间间隔,做全局速度归一化,保证不同设备上的移动手感一致。
- 移除代码中无意义的重复位置赋值逻辑,减少临时
Vector3对象的构造,降低GC触发频率,进一步消除偶发卡顿。
内容的提问来源于stack exchange,提问作者SOS video
相关产品推荐
相关产品推荐

