性能优化:MovableTrack

Signed-off-by: TRADER_FOER <lhf190@outlook.com>
This commit is contained in:
2026-07-18 12:32:51 +08:00
parent df4d35942a
commit d331f4d9af
8 changed files with 119 additions and 14 deletions

View File

@@ -213,7 +213,7 @@ Material:
- _Dst: 10
- _DstBlend: 0
- _DstBlendAlpha: 0
- _EdgeValue: 0.83361584
- _EdgeValue: 0.206462
- _EnvironmentReflections: 1
- _FNLfanxiangkaiguan: 0
- _Face: 1
@@ -258,7 +258,7 @@ Material:
- _Mask_scale: 1
- _Metallic: 0
- _OcclusionStrength: 1
- _Opacity: 0.16638416
- _Opacity: 0.793538
- _Parallax: 0.005
- _Pass: 0
- _QueueOffset: 0

View File

@@ -0,0 +1,28 @@
<linker>
<assembly fullname="Unity.Addressables, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" preserve="all">
<type fullname="UnityEngine.AddressableAssets.Addressables" preserve="all" />
</assembly>
<assembly fullname="Unity.Localization, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
<type fullname="UnityEngine.Localization.Locale" preserve="all" />
<type fullname="UnityEngine.Localization.Tables.SharedTableData" preserve="all" />
<type fullname="UnityEngine.Localization.Tables.StringTable" preserve="all" />
<type fullname="UnityEngine.Localization.LocaleIdentifier" preserve="nothing" serialized="true" />
<type fullname="UnityEngine.Localization.Metadata.MetadataCollection" preserve="nothing" serialized="true" />
<type fullname="UnityEngine.Localization.Tables.TableEntryData" preserve="nothing" serialized="true" />
<type fullname="UnityEngine.Localization.Tables.DistributedUIDGenerator" preserve="nothing" serialized="true" />
<type fullname="UnityEngine.Localization.Tables.SharedTableData/SharedTableEntry" preserve="nothing" serialized="true" />
<type fullname="UnityEngine.Localization.Metadata.FallbackLocale" preserve="nothing" serialized="true" />
</assembly>
<assembly fullname="Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" preserve="all">
<type fullname="UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider" preserve="all" />
<type fullname="UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider" preserve="all" />
<type fullname="UnityEngine.ResourceManagement.ResourceProviders.InstanceProvider" preserve="all" />
<type fullname="UnityEngine.ResourceManagement.ResourceProviders.SceneProvider" preserve="all" />
</assembly>
<assembly fullname="UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
<type fullname="UnityEngine.Object" preserve="all" />
</assembly>
<assembly fullname="YarnSpinner.Unity">
<type fullname="Yarn.Unity.UnityLocalization.LineMetadata" preserve="nothing" serialized="true" />
</assembly>
</linker>

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 6ce491c0f528de74dbed99b700a51ea5
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -24,6 +24,7 @@ namespace Ichni.RhythmGame
public bool zWrite;
public Vector2 uvScale;
public Vector2 uvOffset;
private bool requiresMeshRebuild;
#endregion
#region [] Initialization & Defense
@@ -72,17 +73,44 @@ namespace Ichni.RhythmGame
{
if (meshGenerator == null) return;
bool colorChanged = false;
if (meshGenerator.color != color)
{
meshGenerator.color = color;
colorChanged = true;
}
if (forceImmediateRebuild && track.trackTimeSubmodule is not TrackTimeSubmoduleMovable)
if (track.trackTimeSubmodule is TrackTimeSubmoduleMovable)
{
if (colorChanged || forceImmediateRebuild)
{
RequestMeshRebuild();
}
return;
}
if (forceImmediateRebuild)
{
meshGenerator.RebuildImmediate();
}
}
public void RequestMeshRebuild()
{
requiresMeshRebuild = true;
}
public bool ConsumeMeshRebuildRequest()
{
if (!requiresMeshRebuild)
{
return false;
}
requiresMeshRebuild = false;
return true;
}
protected void SetMesh()
{
if (track.trackTimeSubmodule is TrackTimeSubmoduleMovable trackTimeSubmoduleMovable)

View File

@@ -31,6 +31,11 @@ namespace Ichni.RhythmGame
public float trackTotalTime;
public float visibleTrackTimeLength;
public AnimationCurveType animationCurveType;
private const float ClipChangeEpsilon = 0.0001f;
private bool hasClipState;
private float lastClipFrom;
private float lastClipTo;
#endregion
#region [] Initialization
@@ -49,17 +54,54 @@ namespace Ichni.RhythmGame
#region [] Timing Calculation
public void UpdateTrackPart(float songTime)
{
CalculateVisibleClip(songTime, out float newTailPercent, out float newHeadPercent);
headPercent = newHeadPercent;
tailPercent = newTailPercent;
TrackRendererSubmodule rendererSubmodule = track.trackRendererSubmodule;
if (rendererSubmodule == null || rendererSubmodule.meshGenerator == null)
{
return;
}
bool clipChanged = !hasClipState ||
Mathf.Abs(lastClipFrom - tailPercent) > ClipChangeEpsilon ||
Mathf.Abs(lastClipTo - headPercent) > ClipChangeEpsilon;
bool rebuildRequested = rendererSubmodule.ConsumeMeshRebuildRequest();
if (!clipChanged && !rebuildRequested)
{
return;
}
rendererSubmodule.meshGenerator.clipFrom = tailPercent;
rendererSubmodule.meshGenerator.clipTo = headPercent;
rendererSubmodule.meshGenerator.RebuildImmediate();
hasClipState = true;
lastClipFrom = tailPercent;
lastClipTo = headPercent;
//track.trackPathSubmodule.path.Rebuild(true);
}
private void CalculateVisibleClip(float songTime, out float tailPercent, out float headPercent)
{
if (songTime <= trackStartTime)
{
tailPercent = 0f;
headPercent = 0f;
return;
}
if (songTime >= trackEndTime + visibleTrackTimeLength)
{
tailPercent = 1f;
headPercent = 1f;
return;
}
headPercent = GetTrackPercent(songTime);
tailPercent = GetTrackPercent(songTime - visibleTrackTimeLength);
if (track.trackRendererSubmodule != null)
{
track.trackRendererSubmodule.meshGenerator.clipFrom = tailPercent;
track.trackRendererSubmodule.meshGenerator.clipTo = headPercent;
track.trackRendererSubmodule.meshGenerator.RebuildImmediate();
}
//track.trackPathSubmodule.path.Rebuild(true);
}
public float GetTrackPercent(float songTimeInTime)