From b54de1e162c5614147a0168899f0109c734379aa Mon Sep 17 00:00:00 2001 From: "ALIENJACK\\alien" Date: Tue, 19 Nov 2024 13:09:53 +0800 Subject: [PATCH] =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=A0=8F=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E5=B8=A7=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Assets/Plugins/AxiReplay/NetReplay.cs | 2 +- .../Resources/UIPrefabs/XMBTopGroup.prefab | 87 ++++++++++++++++++- .../Assets/Script/IEmuCore.cs | 1 + .../Assets/Script/Manager/AppEmu.cs | 5 ++ .../Assets/Script/NesEmulator/NesEmulator.cs | 2 + .../Script/UI/XMBTopGroupUI/XMBTopGroup.cs | 20 +++++ 6 files changed, 113 insertions(+), 4 deletions(-) diff --git a/AxibugEmuOnline.Client/Assets/Plugins/AxiReplay/NetReplay.cs b/AxibugEmuOnline.Client/Assets/Plugins/AxiReplay/NetReplay.cs index 4d80fed..0db022f 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/AxiReplay/NetReplay.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/AxiReplay/NetReplay.cs @@ -114,7 +114,7 @@ namespace AxiReplay if (frameGap > 10000) return 0; int skip = 0; - + if (frameGap <= 2) skip = 0; if (frameGap > 2 && frameGap < 6) skip = 1 + 1; else if (frameGap > 7 && frameGap < 12) skip = 2 + 1; diff --git a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/XMBTopGroup.prefab b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/XMBTopGroup.prefab index 8cdad0a..9baf683 100644 --- a/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/XMBTopGroup.prefab +++ b/AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/XMBTopGroup.prefab @@ -265,6 +265,7 @@ RectTransform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: + - {fileID: 4541943946029862829} - {fileID: 2005113594707322973} - {fileID: 4195056312044822544} - {fileID: 1746243318642131728} @@ -320,6 +321,7 @@ MonoBehaviour: imgPower2: {fileID: 7232861150095392420} imgPower3: {fileID: 6694955234077232327} DelayValue: {fileID: 6486398873987280650} + FPS: {fileID: 2545793518460288919} --- !u!1 &5629957813601835122 GameObject: m_ObjectHideFlags: 0 @@ -352,7 +354,7 @@ RectTransform: m_Children: - {fileID: 1735688216191931001} m_Father: {fileID: 5353336693430589123} - m_RootOrder: 2 + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -417,6 +419,85 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 +--- !u!1 &5634255875545658264 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4541943946029862829} + - component: {fileID: 3282993275160308839} + - component: {fileID: 2545793518460288919} + m_Layer: 5 + m_Name: FPS + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4541943946029862829 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5634255875545658264} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 5353336693430589123} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 53} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3282993275160308839 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5634255875545658264} + m_CullTransparentMesh: 1 +--- !u!114 &2545793518460288919 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5634255875545658264} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 3 + m_MaxSize: 55 + m_Alignment: 5 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: FPS:60 --- !u!1 &6140890295709974557 GameObject: m_ObjectHideFlags: 0 @@ -523,7 +604,7 @@ RectTransform: - {fileID: 1777012203952456443} - {fileID: 7158194035478552859} m_Father: {fileID: 5353336693430589123} - m_RootOrder: 0 + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -586,7 +667,7 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 5353336693430589123} - m_RootOrder: 1 + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} diff --git a/AxibugEmuOnline.Client/Assets/Script/IEmuCore.cs b/AxibugEmuOnline.Client/Assets/Script/IEmuCore.cs index 1a8d20e..68a5df8 100644 --- a/AxibugEmuOnline.Client/Assets/Script/IEmuCore.cs +++ b/AxibugEmuOnline.Client/Assets/Script/IEmuCore.cs @@ -15,6 +15,7 @@ namespace AxibugEmuOnline.Client void SetupScheme(); void StartGame(RomFile romFile); void DoReset(); + uint Frame { get; } } public static class IEnumCoreTool diff --git a/AxibugEmuOnline.Client/Assets/Script/Manager/AppEmu.cs b/AxibugEmuOnline.Client/Assets/Script/Manager/AppEmu.cs index 3a7df7d..b16b04f 100644 --- a/AxibugEmuOnline.Client/Assets/Script/Manager/AppEmu.cs +++ b/AxibugEmuOnline.Client/Assets/Script/Manager/AppEmu.cs @@ -13,6 +13,11 @@ namespace AxibugEmuOnline.Client.Manager /// 但是Equals方法可以,所以,这个接口判断为空请使用Equals /// private IEmuCore m_emuCore; + /// + /// unity的c#实现有bug,以接口类型保存的monobehaviour引用,!=和==运算符没有调用到monobehaviour重写过的运算符 + /// 但是Equals方法可以,所以,这个接口判断为空请使用Equals + /// + public IEmuCore Core => m_emuCore; public AppEmu() { diff --git a/AxibugEmuOnline.Client/Assets/Script/NesEmulator/NesEmulator.cs b/AxibugEmuOnline.Client/Assets/Script/NesEmulator/NesEmulator.cs index 1b15bff..a61075f 100644 --- a/AxibugEmuOnline.Client/Assets/Script/NesEmulator/NesEmulator.cs +++ b/AxibugEmuOnline.Client/Assets/Script/NesEmulator/NesEmulator.cs @@ -169,5 +169,7 @@ namespace AxibugEmuOnline.Client UnityEditor.EditorUtility.SetDirty(db); UnityEditor.AssetDatabase.SaveAssets(); } + + public uint Frame => NesCore.FrameCount; } } diff --git a/AxibugEmuOnline.Client/Assets/Script/UI/XMBTopGroupUI/XMBTopGroup.cs b/AxibugEmuOnline.Client/Assets/Script/UI/XMBTopGroupUI/XMBTopGroup.cs index 2076b6d..811a23d 100644 --- a/AxibugEmuOnline.Client/Assets/Script/UI/XMBTopGroupUI/XMBTopGroup.cs +++ b/AxibugEmuOnline.Client/Assets/Script/UI/XMBTopGroupUI/XMBTopGroup.cs @@ -12,6 +12,7 @@ public class XMBTopGroup : MonoBehaviour public Image imgPower2; public Image imgPower3; public Text DelayValue; + public Text FPS; void OnEnable() { @@ -29,6 +30,25 @@ public class XMBTopGroup : MonoBehaviour RefreshTime(); RefreshPower(); RefreshDelay(); + RefreshFps(); + } + + (uint lastFrame, float lastTime) m_lastFrameInfo; + private void RefreshFps() + { + if (App.emu.Core.IsNull()) + FPS.gameObject.SetActiveEx(false); + else + { + FPS.gameObject.SetActiveEx(true); + var gap = App.emu.Core.Frame - m_lastFrameInfo.lastFrame; + var time = Time.realtimeSinceStartup - m_lastFrameInfo.lastTime; + var fps = gap / time; + FPS.text = $"FPS:{fps:.#}"; + + m_lastFrameInfo.lastFrame = App.emu.Core.Frame; + m_lastFrameInfo.lastTime = Time.realtimeSinceStartup; + } } private void RefreshDelay()