Skip to content

Commit

Permalink
Merge pull request #326 from techanon/dooly-gc-improvement
Browse files Browse the repository at this point in the history
Minor GC improvement
  • Loading branch information
pema99 authored Dec 17, 2024
2 parents 88a8496 + f0bc47b commit de4e2cf
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 20 deletions.
1 change: 1 addition & 0 deletions AudioLinkSandboxProject/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ ExportedObj/
*.mdb
*.opendb
*.VC.db
.idea/

# Unity3D generated meta files
*.pidb.meta
Expand Down
1 change: 1 addition & 0 deletions AudioLinkSandboxUnityProject/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ ExportedObj/
*.mdb
*.opendb
*.VC.db
.idea/

# Unity3D generated meta files
*.pidb.meta
Expand Down
3 changes: 2 additions & 1 deletion AudioLinkUnityProject/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ ExportedObj/
*.mdb
*.opendb
*.VC.db
.idea/

# Unity3D generated meta files
*.pidb.meta
Expand Down Expand Up @@ -81,4 +82,4 @@ crashlytics-build.properties
/[Aa]ssets/UdonSharp.meta
/[Aa]ssets/AmplifyShaderEditor/
/[Aa]ssets/AmplifyShaderEditor.meta
/[Aa]ssets/SerilizedUdonPrograms/
/[Aa]ssets/SerilizedUdonPrograms/
1 change: 1 addition & 0 deletions AudioLinkWebProject/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ ExportedObj/
*.mdb
*.opendb
*.VC.db
.idea/

# Unity3D generated meta files
*.pidb.meta
Expand Down
45 changes: 26 additions & 19 deletions Packages/com.llealloo.audiolink/Runtime/Scripts/AudioLink.cs
Original file line number Diff line number Diff line change
Expand Up @@ -732,40 +732,47 @@ public override void OnDeserialization()
}
#endif

private const int GlobalStringMaxLength = 32;
private readonly int[] globalStringCodePoints = new int[GlobalStringMaxLength];
private const int GlobalStringPackedVectorsLength = GlobalStringMaxLength / 4;
private readonly Vector4[] globalStringPackedVectors = new Vector4[GlobalStringPackedVectorsLength];

private void UpdateGlobalString(int nameID, string input)
{
InitIDs();
const int maxLength = 32;
if (input.Length > maxLength)
input = input.Substring(0, maxLength);

// Get unicode codepoints
int[] codePoints = new int[input.Length];
int inputLength = input.Length;
// Truncate the input if it exceeds the max length
if (inputLength > GlobalStringMaxLength)
{
input = input.Substring(0, GlobalStringMaxLength);
}
// Get unicode codepoints, clearing previous values to prevent leftover data
Array.Clear(globalStringCodePoints, 0, GlobalStringMaxLength);
int codePointsLength = 0;
for (int i = 0; i < input.Length; i++)

for (int i = 0; i < inputLength; i++)
{
codePoints[codePointsLength++] = Char.ConvertToUtf32(input, i);
if (Char.IsHighSurrogate(input[i]))
globalStringCodePoints[codePointsLength++] = char.ConvertToUtf32(input, i);
if (char.IsHighSurrogate(input[i]))
{
i += 1;
}
}

// Pack them into vectors
Vector4[] vecs = new Vector4[maxLength / 4]; // 4 chars per vector
// Pack them into vectors, clearing previous values in vecs array
Array.Clear(globalStringPackedVectors, 0, GlobalStringPackedVectorsLength);
int j = 0;
for (int i = 0; i < vecs.Length; i++)
for (int i = 0; i < GlobalStringPackedVectorsLength; i++)
{
if (j < codePoints.Length) vecs[i].x = IntToFloatBits24Bit((uint)codePoints[j++]); else break;
if (j < codePoints.Length) vecs[i].y = IntToFloatBits24Bit((uint)codePoints[j++]); else break;
if (j < codePoints.Length) vecs[i].z = IntToFloatBits24Bit((uint)codePoints[j++]); else break;
if (j < codePoints.Length) vecs[i].w = IntToFloatBits24Bit((uint)codePoints[j++]); else break;
if (j < codePointsLength) globalStringPackedVectors[i].x = IntToFloatBits24Bit((uint)globalStringCodePoints[j++]); else break;
if (j < codePointsLength) globalStringPackedVectors[i].y = IntToFloatBits24Bit((uint)globalStringCodePoints[j++]); else break;
if (j < codePointsLength) globalStringPackedVectors[i].z = IntToFloatBits24Bit((uint)globalStringCodePoints[j++]); else break;
if (j < codePointsLength) globalStringPackedVectors[i].w = IntToFloatBits24Bit((uint)globalStringCodePoints[j++]); else break;
}

// Expose the vectors to shader
audioMaterial.SetVectorArray(nameID, vecs);
// Expose the vectors to shader without causing additional allocations
audioMaterial.SetVectorArray(nameID, globalStringPackedVectors);
}

public void ToggleAudioLink()
{
SetAudioLinkState(!_audioLinkEnabled);
Expand Down

0 comments on commit de4e2cf

Please sign in to comment.