using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Text;
public class SpeedString {
public string string_base;
public StringBuilder string_builder;
private char[] int_parser = new char[11];
public SpeedString(int capacity){
string_builder = new StringBuilder(capacity,capacity);
string_base = (string)string_builder.GetType().GetField(
"_str",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance).GetValue(string_builder);
}
private int i;
public void Clear(){
string_builder.Length = 0;
for(i=0;i
string_builder.Append(' ');
}
string_builder.Length = 0;
}
public void Draw(ref Text text){
text.cachedTextGenerator.Invalidate();
}
public void Append(string value){
string_builder.Append(value);
}
int count;
public void Append(int value){
if(value >= 0){
count = ToCharArray((uint)value,int_parser,0);
}
else{
int_parser[0] = '-';
count = ToCharArray((uint)-value,int_parser,1)+1;
}
for(i=0;i<count;i++){
string_builder.Append(int_parser[i]);
}
}
private static int ToCharArray(uint value, char[] buffer,int bufferIndex) {
if (value == 0) {
buffer[bufferIndex] = '0';
return 1;
}
int len = 1;
for (uint rem = value/10; rem > 0; rem /= 10) {
len++;
}
for (int i = len-1; i>= 0; i--) {
buffer[bufferIndex+i] = (char)('0'+(value%10));
value /= 10;
}
return len;
}
}
public class Panel_Test : MonoBehaviour {
public Text velocity;
public SpeedString velocity_string = new SpeedString(32);
void Update(){
//Stats
velocity_string.Clear();
velocity_string.Append(last_velocity);
velocity_string.Append(" MPH");
velocity_string.Draw(ref velocity);
}
}
通过反射Type.GetField()获取StringBuilder的属性_str,重复利用该内存达到减少gc的目的。
StringBuilder.Length = 0 之后使用StringBuilder.Append()将从0开始衔接,如果衔接的字符比之前的字符短,之前的字符将会保留,也就是设置Length =0并不会清空StringBuilder,只是重设了衔接的下标
https://forum.unity.com/threads/stringbuilder-problem.122262/
网友评论