Skip to content

Commit 140791b

Browse files
authored
Merge pull request #233 from HodgsonSDAS/FpsTextMeshUpdateMaster
Updated FpsDisplay Optimizations
2 parents 6674ea7 + 89e0ca7 commit 140791b

File tree

2 files changed

+194
-108
lines changed

2 files changed

+194
-108
lines changed

Assets/HoloToolkit/Utilities/Prefabs/FPSDisplay.prefab

Lines changed: 114 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,18 @@ Prefab:
1111
m_ParentPrefab: {fileID: 0}
1212
m_RootGameObject: {fileID: 1000011443254168}
1313
m_IsPrefabParent: 1
14-
--- !u!1 &1000010074048822
14+
--- !u!1 &1000010077501532
1515
GameObject:
1616
m_ObjectHideFlags: 0
1717
m_PrefabParentObject: {fileID: 0}
1818
m_PrefabInternal: {fileID: 100100000}
1919
serializedVersion: 4
2020
m_Component:
21-
- 224: {fileID: 224000013902176168}
22-
- 222: {fileID: 222000010574571132}
23-
- 114: {fileID: 114000010290203136}
24-
- 223: {fileID: 223000012962034640}
25-
m_Layer: 5
21+
- 4: {fileID: 4000012084356042}
22+
- 23: {fileID: 23000012140561766}
23+
- 102: {fileID: 102000012390400920}
24+
- 114: {fileID: 114000014126132184}
25+
m_Layer: 0
2626
m_Name: FPSText
2727
m_TagString: Untagged
2828
m_Icon: {fileID: 0}
@@ -37,89 +37,136 @@ GameObject:
3737
serializedVersion: 4
3838
m_Component:
3939
- 4: {fileID: 4000012520274942}
40-
- 114: {fileID: 114000011616777814}
4140
- 65: {fileID: 65000012561365858}
4241
- 114: {fileID: 114000013985069792}
4342
- 114: {fileID: 114000012205069828}
4443
- 114: {fileID: 114000014245746336}
44+
- 23: {fileID: 23000011797597042}
4545
m_Layer: 0
4646
m_Name: FPSDisplay
4747
m_TagString: Untagged
4848
m_Icon: {fileID: 0}
4949
m_NavMeshLayer: 0
5050
m_StaticEditorFlags: 0
5151
m_IsActive: 1
52+
--- !u!4 &4000012084356042
53+
Transform:
54+
m_ObjectHideFlags: 1
55+
m_PrefabParentObject: {fileID: 0}
56+
m_PrefabInternal: {fileID: 100100000}
57+
m_GameObject: {fileID: 1000010077501532}
58+
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
59+
m_LocalPosition: {x: 0, y: 0.11, z: 0}
60+
m_LocalScale: {x: 0.01, y: 0.01, z: 0.01}
61+
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
62+
m_Children: []
63+
m_Father: {fileID: 4000012520274942}
64+
m_RootOrder: 0
5265
--- !u!4 &4000012520274942
5366
Transform:
5467
m_ObjectHideFlags: 1
5568
m_PrefabParentObject: {fileID: 0}
5669
m_PrefabInternal: {fileID: 100100000}
5770
m_GameObject: {fileID: 1000011443254168}
58-
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
59-
m_LocalPosition: {x: -0.5, y: 0, z: 2}
60-
m_LocalScale: {x: 0.0005, y: 0.0005, z: 0.0005}
71+
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
72+
m_LocalPosition: {x: 0, y: 0, z: 0.85}
73+
m_LocalScale: {x: 1, y: 1, z: 1}
6174
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
6275
m_Children:
63-
- {fileID: 224000013902176168}
76+
- {fileID: 4000012084356042}
6477
m_Father: {fileID: 0}
6578
m_RootOrder: 0
66-
--- !u!65 &65000012561365858
67-
BoxCollider:
79+
--- !u!23 &23000011797597042
80+
MeshRenderer:
6881
m_ObjectHideFlags: 1
6982
m_PrefabParentObject: {fileID: 0}
7083
m_PrefabInternal: {fileID: 100100000}
7184
m_GameObject: {fileID: 1000011443254168}
72-
m_Material: {fileID: 0}
73-
m_IsTrigger: 0
7485
m_Enabled: 1
75-
serializedVersion: 2
76-
m_Size: {x: 1, y: 1, z: 1}
77-
m_Center: {x: 0, y: 0, z: 0}
78-
--- !u!114 &114000010290203136
79-
MonoBehaviour:
86+
m_CastShadows: 1
87+
m_ReceiveShadows: 1
88+
m_MotionVectors: 1
89+
m_LightProbeUsage: 1
90+
m_ReflectionProbeUsage: 1
91+
m_Materials:
92+
- {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0}
93+
m_SubsetIndices:
94+
m_StaticBatchRoot: {fileID: 0}
95+
m_ProbeAnchor: {fileID: 0}
96+
m_LightProbeVolumeOverride: {fileID: 0}
97+
m_ScaleInLightmap: 1
98+
m_PreserveUVs: 0
99+
m_IgnoreNormalsForChartDetection: 0
100+
m_ImportantGI: 0
101+
m_SelectedWireframeHidden: 0
102+
m_MinimumChartSize: 4
103+
m_AutoUVMaxDistance: 0.5
104+
m_AutoUVMaxAngle: 89
105+
m_LightmapParameters: {fileID: 0}
106+
m_SortingLayerID: 0
107+
m_SortingOrder: 0
108+
--- !u!23 &23000012140561766
109+
MeshRenderer:
80110
m_ObjectHideFlags: 1
81111
m_PrefabParentObject: {fileID: 0}
82112
m_PrefabInternal: {fileID: 100100000}
83-
m_GameObject: {fileID: 1000010074048822}
113+
m_GameObject: {fileID: 1000010077501532}
84114
m_Enabled: 1
85-
m_EditorHideFlags: 0
86-
m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
87-
m_Name:
88-
m_EditorClassIdentifier:
89-
m_Material: {fileID: 0}
90-
m_Color: {r: 0.105882354, g: 0.5764706, b: 0.85882354, a: 1}
91-
m_RaycastTarget: 0
92-
m_OnCullStateChanged:
93-
m_PersistentCalls:
94-
m_Calls: []
95-
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
96-
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
97-
m_FontData:
98-
m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
99-
m_FontSize: 72
100-
m_FontStyle: 0
101-
m_BestFit: 1
102-
m_MinSize: 20
103-
m_MaxSize: 144
104-
m_Alignment: 0
105-
m_AlignByGeometry: 0
106-
m_RichText: 1
107-
m_HorizontalOverflow: 0
108-
m_VerticalOverflow: 0
109-
m_LineSpacing: 1
110-
m_Text: 'FPS: '
111-
--- !u!114 &114000011616777814
112-
MonoBehaviour:
115+
m_CastShadows: 1
116+
m_ReceiveShadows: 1
117+
m_MotionVectors: 1
118+
m_LightProbeUsage: 1
119+
m_ReflectionProbeUsage: 1
120+
m_Materials:
121+
- {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0}
122+
m_SubsetIndices:
123+
m_StaticBatchRoot: {fileID: 0}
124+
m_ProbeAnchor: {fileID: 0}
125+
m_LightProbeVolumeOverride: {fileID: 0}
126+
m_ScaleInLightmap: 1
127+
m_PreserveUVs: 0
128+
m_IgnoreNormalsForChartDetection: 0
129+
m_ImportantGI: 0
130+
m_SelectedWireframeHidden: 0
131+
m_MinimumChartSize: 4
132+
m_AutoUVMaxDistance: 0.5
133+
m_AutoUVMaxAngle: 89
134+
m_LightmapParameters: {fileID: 0}
135+
m_SortingLayerID: 0
136+
m_SortingOrder: 0
137+
--- !u!65 &65000012561365858
138+
BoxCollider:
113139
m_ObjectHideFlags: 1
114140
m_PrefabParentObject: {fileID: 0}
115141
m_PrefabInternal: {fileID: 100100000}
116142
m_GameObject: {fileID: 1000011443254168}
143+
m_Material: {fileID: 0}
144+
m_IsTrigger: 0
117145
m_Enabled: 1
118-
m_EditorHideFlags: 0
119-
m_Script: {fileID: 11500000, guid: 782849a517cd6b445bf06b38c442ccf3, type: 3}
120-
m_Name:
121-
m_EditorClassIdentifier:
122-
Text: {fileID: 114000010290203136}
146+
serializedVersion: 2
147+
m_Size: {x: 0.0005, y: 0.0005, z: 0.0005}
148+
m_Center: {x: 0, y: 0, z: 0}
149+
--- !u!102 &102000012390400920
150+
TextMesh:
151+
serializedVersion: 3
152+
m_ObjectHideFlags: 1
153+
m_PrefabParentObject: {fileID: 0}
154+
m_PrefabInternal: {fileID: 100100000}
155+
m_GameObject: {fileID: 1000010077501532}
156+
m_Text: FPS
157+
m_OffsetZ: 0
158+
m_CharacterSize: 1
159+
m_LineSpacing: 1
160+
m_Anchor: 4
161+
m_Alignment: 1
162+
m_TabSize: 4
163+
m_FontSize: 0
164+
m_FontStyle: 0
165+
m_RichText: 1
166+
m_Font: {fileID: 0}
167+
m_Color:
168+
serializedVersion: 2
169+
rgba: 4294967295
123170
--- !u!114 &114000012205069828
124171
MonoBehaviour:
125172
m_ObjectHideFlags: 1
@@ -155,58 +202,28 @@ MonoBehaviour:
155202
SmoothPositionLerpRatio: 0.5
156203
SmoothRotationLerpRatio: 0.5
157204
SmoothScaleLerpRatio: 0.5
158-
--- !u!114 &114000014245746336
205+
--- !u!114 &114000014126132184
159206
MonoBehaviour:
160207
m_ObjectHideFlags: 1
161208
m_PrefabParentObject: {fileID: 0}
162209
m_PrefabInternal: {fileID: 100100000}
163-
m_GameObject: {fileID: 1000011443254168}
210+
m_GameObject: {fileID: 1000010077501532}
164211
m_Enabled: 1
165212
m_EditorHideFlags: 0
166-
m_Script: {fileID: 11500000, guid: ac8d5b128a1d8204fb76c86f47b75912, type: 3}
213+
m_Script: {fileID: 11500000, guid: 782849a517cd6b445bf06b38c442ccf3, type: 3}
167214
m_Name:
168215
m_EditorClassIdentifier:
169-
PivotAxis: 2
170-
--- !u!222 &222000010574571132
171-
CanvasRenderer:
172-
m_ObjectHideFlags: 1
173-
m_PrefabParentObject: {fileID: 0}
174-
m_PrefabInternal: {fileID: 100100000}
175-
m_GameObject: {fileID: 1000010074048822}
176-
--- !u!223 &223000012962034640
177-
Canvas:
216+
textMesh: {fileID: 102000012390400920}
217+
frameRange: 60
218+
--- !u!114 &114000014245746336
219+
MonoBehaviour:
178220
m_ObjectHideFlags: 1
179221
m_PrefabParentObject: {fileID: 0}
180222
m_PrefabInternal: {fileID: 100100000}
181-
m_GameObject: {fileID: 1000010074048822}
223+
m_GameObject: {fileID: 1000011443254168}
182224
m_Enabled: 1
183-
serializedVersion: 2
184-
m_RenderMode: 2
185-
m_Camera: {fileID: 0}
186-
m_PlaneDistance: 100
187-
m_PixelPerfect: 0
188-
m_ReceivesEvents: 1
189-
m_OverrideSorting: 0
190-
m_OverridePixelPerfect: 0
191-
m_SortingBucketNormalizedSize: 0
192-
m_SortingLayerID: 0
193-
m_SortingOrder: 0
194-
m_TargetDisplay: 0
195-
--- !u!224 &224000013902176168
196-
RectTransform:
197-
m_ObjectHideFlags: 1
198-
m_PrefabParentObject: {fileID: 0}
199-
m_PrefabInternal: {fileID: 100100000}
200-
m_GameObject: {fileID: 1000010074048822}
201-
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
202-
m_LocalPosition: {x: 0, y: 0, z: 0}
203-
m_LocalScale: {x: 1, y: 1, z: 1}
204-
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
205-
m_Children: []
206-
m_Father: {fileID: 4000012520274942}
207-
m_RootOrder: 0
208-
m_AnchorMin: {x: 0.5, y: 0.5}
209-
m_AnchorMax: {x: 0.5, y: 0.5}
210-
m_AnchoredPosition: {x: 0.15, y: 0}
211-
m_SizeDelta: {x: 500, y: 100}
212-
m_Pivot: {x: 0.5, y: 0.5}
225+
m_EditorHideFlags: 0
226+
m_Script: {fileID: 11500000, guid: ac8d5b128a1d8204fb76c86f47b75912, type: 3}
227+
m_Name:
228+
m_EditorClassIdentifier:
229+
PivotAxis: 2
Lines changed: 80 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,95 @@
1-
using UnityEngine;
2-
using UnityEngine.UI;
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License. See LICENSE in the project root for license information.
3+
4+
using UnityEngine;
35

46
namespace HoloToolkit.Unity
57
{
68
/// <summary>
7-
/// Simple Behaviour which calculates the frames per second and shows the FPS in a referenced Text control.
9+
/// Simple Behaviour which calculates the average frames per second over a number of frames and shows the FPS in a referenced Text control.
810
/// </summary>
11+
[RequireComponent(typeof(TextMesh))]
912
public class FpsDisplay : MonoBehaviour
1013
{
1114
[Tooltip("Reference to Text UI control where the FPS should be displayed.")]
12-
public Text Text;
15+
[SerializeField]
16+
private TextMesh textMesh;
17+
18+
[Tooltip("How many frames should we consider into our average calculation?")]
19+
[SerializeField]
20+
private int frameRange = 60;
21+
22+
private int averageFps { get; set; }
1323

14-
private float deltaTime;
24+
private int[] fpsBuffer;
25+
private int fpsBufferIndex;
26+
27+
private static readonly string[] StringsFrom00To99 =
28+
{
29+
"00", "01", "02", "03", "04", "05", "06", "07", "08", "09",
30+
"10", "11", "12", "13", "14", "15", "16", "17", "18", "19",
31+
"20", "21", "22", "23", "24", "25", "26", "27", "28", "29",
32+
"30", "31", "32", "33", "34", "35", "36", "37", "38", "39",
33+
"40", "41", "42", "43", "44", "45", "46", "47", "48", "49",
34+
"50", "51", "52", "53", "54", "55", "56", "57", "58", "59",
35+
"60", "61", "62", "63", "64", "65", "66", "67", "68", "69",
36+
"70", "71", "72", "73", "74", "75", "76", "77", "78", "79",
37+
"80", "81", "82", "83", "84", "85", "86", "87", "88", "89",
38+
"90", "91", "92", "93", "94", "95", "96", "97", "98", "99"
39+
};
1540

1641
private void Update()
1742
{
18-
deltaTime += (Time.deltaTime - deltaTime) * 0.1f;
19-
var msec = deltaTime * 1000.0f;
20-
var fps = 1.0f / deltaTime;
21-
var text = string.Format("{0:0.0} ms ({1:0.} fps)", msec, fps);
22-
Text.text = text;
23-
// Debug.Log(text);
43+
if (fpsBuffer == null || fpsBuffer.Length != frameRange || textMesh == null)
44+
{
45+
InitBuffer();
46+
}
47+
48+
UpdateFrameBuffer();
49+
CalculateFps();
50+
51+
UpdateTextDisplay(textMesh, averageFps);
52+
}
53+
54+
private void InitBuffer()
55+
{
56+
textMesh = GetComponent<TextMesh>();
57+
58+
if(frameRange <= 0)
59+
{
60+
frameRange = 1;
61+
}
62+
63+
fpsBuffer = new int[frameRange];
64+
fpsBufferIndex = 0;
65+
}
66+
67+
private void UpdateTextDisplay(TextMesh text, int fps)
68+
{
69+
text.text = StringsFrom00To99[Mathf.Clamp(fps, 0, 99)];
70+
}
71+
72+
private void UpdateFrameBuffer()
73+
{
74+
fpsBuffer[fpsBufferIndex++] = (int)(1f/Time.unscaledDeltaTime);
75+
76+
if(fpsBufferIndex >= frameRange)
77+
{
78+
fpsBufferIndex = 0;
79+
}
80+
}
81+
82+
private void CalculateFps()
83+
{
84+
int sum = 0;
85+
86+
for(int i = 0; i < frameRange; i++)
87+
{
88+
int fps = fpsBuffer[i];
89+
sum += fps;
90+
}
91+
92+
averageFps = sum / frameRange;
2493
}
2594
}
2695
}

0 commit comments

Comments
 (0)