From 3359483dfe85014dfb48d3786125a85256b6d092 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=A3=AE2003?= <2384017988@qq.com>
Date: Tue, 4 Aug 2026 18:17:09 +0800
Subject: [PATCH] 1
---
.../aa/UI/Game/GameMainPanel_FishBase.cs | 132 +++++++++++-------
.../aa/UI/Home/Sub/UIHome_BY_SettingPenel.cs | 28 ++--
2 files changed, 97 insertions(+), 63 deletions(-)
diff --git a/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs b/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs
index 7657beb04..a882b3bf8 100644
--- a/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs
+++ b/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs
@@ -818,6 +818,7 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
///
/// 离房卸载流程:进度条到 0.9 后等待 socket 响应,
/// 收到信号后走到 1.0 并切回 home 界面。
+ /// ⭐ 用 try-finally 保证无论中间是否异常,最终一定会关闭 GamePanel 并切回 Home
///
private async void BeginLeaveRoomUnload()
{
@@ -827,64 +828,91 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
return;
}
- JinDuTiao.Show();
-
- JinDuTiao.SetProgress(0.2f);
- await FishResourcesData.UnLoadFishAssetsData();
-
- JinDuTiao.SetProgress(0.4f);
- await AudioResourcesData.UnLoadAudioGame();
-
- JinDuTiao.SetProgress(0.6f);
- await MonsterMoveLine.UnLoadBezier();
-
- JinDuTiao.SetProgress(0.8f);
- await Task.Delay(100);
-
- CreateFishManager.Instance.ExitRoom();
- CreateFishManager.Instance.isResources = false;
- // ⭐ 清空子弹池 + 特效池(鱼池已在 UnLoadFishAssetsData 内清理)
- BulletPool.Instance.ClearAll();
- EffectPool.Instance.ClearAll();
- JinDuTiao.SetProgress(0.9f);
-
- // ⭐ 卡在 0.9 等待 socket 返回 LeaveRoomResult
- // - socket 已早返回(比卸载快) → 在 0.9 再等 1 秒(美观)后变 1
- // - socket 未返回 → 等待 socket,最多 10 秒,超时强制变 1 退出
- if (_leaveRoomResponseTcs != null)
+ try
{
- bool alreadyReceived = _leaveRoomResponseTcs.Task.IsCompleted;
- if (alreadyReceived)
+ if (JinDuTiao != null) JinDuTiao.Show();
+
+ if (JinDuTiao != null) JinDuTiao.SetProgress(0.2f);
+ await FishResourcesData.UnLoadFishAssetsData();
+
+ if (JinDuTiao != null) JinDuTiao.SetProgress(0.4f);
+ await AudioResourcesData.UnLoadAudioGame();
+
+ if (JinDuTiao != null) JinDuTiao.SetProgress(0.6f);
+ await MonsterMoveLine.UnLoadBezier();
+
+ if (JinDuTiao != null) JinDuTiao.SetProgress(0.8f);
+ await Task.Delay(100);
+
+ CreateFishManager.Instance.ExitRoom();
+ CreateFishManager.Instance.isResources = false;
+ // ⭐ 清空子弹池 + 特效池(鱼池已在 UnLoadFishAssetsData 内清理)
+ BulletPool.Instance.ClearAll();
+ EffectPool.Instance.ClearAll();
+ if (JinDuTiao != null) JinDuTiao.SetProgress(0.9f);
+
+ // ⭐ 卡在 0.9 等待 socket 返回 LeaveRoomResult
+ // - socket 已早返回(比卸载快) → 在 0.9 再等 1 秒(美观)后变 1
+ // - socket 未返回 → 等待 socket,最多 10 秒,超时强制变 1 退出
+ if (_leaveRoomResponseTcs != null)
{
- // socket 比卸载早返回 → 0.9 停留 1 秒
- await Task.Delay(1000);
- }
- else
- {
- // socket 未返回 → 等待,最多 10 秒
- var timeoutTask = Task.Delay(10000);
- var done = await Task.WhenAny(_leaveRoomResponseTcs.Task, timeoutTask);
- if (done == timeoutTask)
+ bool alreadyReceived = _leaveRoomResponseTcs.Task.IsCompleted;
+ if (alreadyReceived)
{
- // 超时 10 秒 → 强制退出,不管结算是否返回
-#if UNITY_EDITOR
- Debug.LogWarning("[LeaveRoom] 等待 socket 超时 10 秒,强制退出");
-#endif
+ // socket 比卸载早返回 → 0.9 停留 1 秒
+ await Task.Delay(1000);
+ }
+ else
+ {
+ // socket 未返回 → 等待,最多 10 秒
+ var timeoutTask = Task.Delay(10000);
+ var done = await Task.WhenAny(_leaveRoomResponseTcs.Task, timeoutTask);
+ if (done == timeoutTask)
+ {
+ // 超时 10 秒 → 强制退出,必须执行和 ExitFishingGame 一致的清理
+ // 否则 game socket 不关闭、isGame 不复位,导致无法再次进入游戏
+ Debug.LogWarning("[LeaveRoom] 等待 socket 超时 10 秒,强制退出并清理游戏状态");
+ try
+ {
+ WebSocketManager.Instance.isGame = false;
+ GameManager.LogGoldFlow("ExitRoom", $"超时强制退出 房间={GameManager.Instance.gameData?.currRoomData?.roomId}");
+ WebSocketManager.Instance.Close(SocketType.game);
+ APIRequestList.GetUser((user) =>
+ {
+ GameManager.Instance.UpdataUserData(user);
+ });
+ }
+ catch (Exception cleanEx)
+ {
+ Debug.LogError($"[LeaveRoom] 超时清理异常: {cleanEx}");
+ }
+ }
}
}
+
+ // 标记已卸载,OnHide 跳过重复卸载
+ _resourcesUnloaded = true;
+
+ if (JinDuTiao != null) JinDuTiao.SetProgress(1);
+ await Task.Delay(300);
+ if (JinDuTiao != null) JinDuTiao.Hide();
+ }
+ catch (Exception ex)
+ {
+ Debug.LogError($"[LeaveRoom] 卸载流程异常: {ex}");
+ }
+ finally
+ {
+ // ⭐ 无论中间是否异常,都必须关闭 GamePanel 并切回 Home
+ // 否则 GamePanel 留在 panels 字典里,下次进入游戏时 Get 返回非 null 导致无法创建新面板
+ _leaveRoomResponseTcs = null;
+ if (JinDuTiao != null)
+ {
+ try { JinDuTiao.Hide(); } catch { }
+ }
+ // 进入 home 界面(关闭当前游戏面板)
+ UIManager.Instance.ShowAsync(UIPanel.HomeMainPanel, _leavingGamePanelType);
}
-
- // 标记已卸载,OnHide 跳过重复卸载
- _resourcesUnloaded = true;
-
- JinDuTiao.SetProgress(1);
- await Task.Delay(300);
- JinDuTiao.Hide();
-
- // 进入 home 界面(关闭当前游戏面板)
- UIManager.Instance.ShowAsync(UIPanel.HomeMainPanel, _leavingGamePanelType);
-
- _leaveRoomResponseTcs = null;
}
///
diff --git a/Assets/MyGame/aa/UI/Home/Sub/UIHome_BY_SettingPenel.cs b/Assets/MyGame/aa/UI/Home/Sub/UIHome_BY_SettingPenel.cs
index 8d0ee6c48..54f16329e 100644
--- a/Assets/MyGame/aa/UI/Home/Sub/UIHome_BY_SettingPenel.cs
+++ b/Assets/MyGame/aa/UI/Home/Sub/UIHome_BY_SettingPenel.cs
@@ -4,6 +4,7 @@ using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.Audio;
+using UnityEngine.Serialization;
using UnityEngine.UI;
public class UIHome_BY_SettingPanel : SubUIBase
@@ -20,8 +21,10 @@ public class UIHome_BY_SettingPanel : SubUIBase
[Header("帧率")]
public Toggle toggle_Fps30;
+ [FormerlySerializedAs("toggle_Fps60")]
+ public Toggle toggle_Fps45;
+ [FormerlySerializedAs("toggle_FpsUnlimited")]
public Toggle toggle_Fps60;
- public Toggle toggle_FpsUnlimited;
public ToggleGroup group_Fps;
private Dictionary labelOriginalColors = new Dictionary();
@@ -73,13 +76,13 @@ public class UIHome_BY_SettingPanel : SubUIBase
// 帧率
CacheToggleColor(toggle_Fps30);
+ CacheToggleColor(toggle_Fps45);
CacheToggleColor(toggle_Fps60);
- CacheToggleColor(toggle_FpsUnlimited);
- int fps = PlayerPrefs.GetInt("TargetFps", 1);
+ int fps = PlayerPrefs.GetInt("TargetFps", 2);
ApplyFps(fps);
toggle_Fps30?.onValueChanged.AddListener(a => { if (a) SetFps(0); });
- toggle_Fps60?.onValueChanged.AddListener(a => { if (a) SetFps(1); });
- toggle_FpsUnlimited?.onValueChanged.AddListener(a => { if (a) SetFps(2); });
+ toggle_Fps45?.onValueChanged.AddListener(a => { if (a) SetFps(1); });
+ toggle_Fps60?.onValueChanged.AddListener(a => { if (a) SetFps(2); });
}
protected override void OnShow(object args = null)
{
@@ -130,16 +133,19 @@ public class UIHome_BY_SettingPanel : SubUIBase
private void ApplyFps(int level)
{
if (toggle_Fps30 != null) toggle_Fps30.isOn = (level == 0);
- if (toggle_Fps60 != null) toggle_Fps60.isOn = (level == 1);
- if (toggle_FpsUnlimited != null) toggle_FpsUnlimited.isOn = (level == 2);
+ if (toggle_Fps45 != null) toggle_Fps45.isOn = (level == 1);
+ if (toggle_Fps60 != null) toggle_Fps60.isOn = (level == 2);
UpdateToggleColor(toggle_Fps30, level == 0);
- UpdateToggleColor(toggle_Fps60, level == 1);
- UpdateToggleColor(toggle_FpsUnlimited, level == 2);
+ UpdateToggleColor(toggle_Fps45, level == 1);
+ UpdateToggleColor(toggle_Fps60, level == 2);
+ // 关键:vSyncCount != 0 会让 Application.targetFrameRate 失效(被屏幕刷新率覆盖)。
+ // Balanced/High Fidelity 画质默认 vSyncCount=1,必须强制关闭才能让帧率档位生效。
+ QualitySettings.vSyncCount = 0;
switch (level)
{
case 0: Application.targetFrameRate = 30; break;
- case 1: Application.targetFrameRate = 60; break;
- case 2: Application.targetFrameRate = -1; break;
+ case 1: Application.targetFrameRate = 45; break;
+ case 2: Application.targetFrameRate = 60; break;
}
}
}
\ No newline at end of file