如何在Android的零对象分配实时游戏中绘制字符串?

如何在Android的零对象分配实时游戏中绘制字符串?,android,real-time,Android,Real Time,我正在用Android编写实时游戏,我不想在主循环中分配任何对象。问题是分数的String值 我有一个类,它实现了CharSequence,并使用StringBuilder: public class MyString implements CharSequence { protected String prefix; protected StringBuilder stringBuilder; public MyString(String prefix) {

我正在用Android编写实时游戏,我不想在主循环中分配任何对象。问题是分数的
String

我有一个类,它实现了
CharSequence
,并使用
StringBuilder

public class MyString implements CharSequence {

    protected String prefix;
    protected StringBuilder stringBuilder;

    public MyString(String prefix) {
        this.prefix = prefix;
        stringBuilder = new StringBuilder(prefix);
    }

    public void setValue(int value) {
        removeValue();
        stringBuilder.append(value);
    }

    public void setValue(float value) {
        removeValue();
        stringBuilder.append(value);
    }

    private void removeValue() {
        if (prefix == null) {
            stringBuilder.setLength(0);
        } else {
            stringBuilder.setLength(prefix.length());
        }
    }

    @Override
    public char charAt(int index) {
        return stringBuilder.charAt(index);
    }

    @Override
    public int length() {
        return stringBuilder.length();
    }

    @Override
    public CharSequence subSequence(int start, int end) {
        return null; // not necessary
    }

}
此类的用途是:

Paint paint = new Paint();
MyString myString = new MyString("Your score: ");

// Main loop
while(true) {
    myString.setValue(Game.score);
    canvas.drawText(myString, 0, myString.length(), 0, 0, paint);
}
问题是,
StringBuilder.append(int)
在每次迭代中创建
String
对象(通过
String.valueOf(int)

你怎么解决这样的问题

我的下一个想法是将
int
float
转换为字符数组,
setValue()
方法将把这个数组添加到
StringBuilder
中。该数组将存储在
MyString
类中,只创建一次,然后重新使用。但我找不到方法,如何将
float
正确地转换为字符数组。
int
没有问题


谢谢你的帮助

您可以尝试一种闪电方式: 将您的“您的分数:”预先渲染为可绘制的。 然后为每个数字0-9制作drable。 在主循环中,您可以通过向另一个drawble绘制所需的数字来构建分数字段。
我不确定这是否会更快,但您将不需要创建任何新对象。

您可以尝试一种blitting方法: 将您的“您的分数:”预先渲染为可绘制的。 然后为每个数字0-9制作drable。 在主循环中,您可以通过向另一个drawble绘制所需的数字来构建分数字段。 我不确定这是否会更快,但您将不需要创建任何新对象。

以下是我为此编写的一些C#代码。将其转换为Java应该非常简单。
minDigits
参数会导致左侧出现零填充——如果愿意,可以跳过该选项

// drawInteger doesn't allocate like string.Format()
int[] digitBuff = new int[10];
string[] digits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };

void drawInteger(SpriteFont font, int i, int minDigits, Vector2 pos, Color colour) {
    Debug.Assert(i >= 0 && minDigits > 0 && minDigits <= digitBuff.Length);
    int index = 0;
    while (i > 0 || index < minDigits) {
        digitBuff[index] = i % 10;
        i /= 10;
        ++index;
    }
    while (index > 0) {
        --index;
        string digit = digits[digitBuff[index]];
        sb.DrawString(font, digit, pos, colour);
        pos.X += font.MeasureString(digit).X;
    }
}
//drawInteger与string.Format()分配不一样
int[]digitBuff=新int[10];
字符串[]位={“0”、“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”};
void drawInteger(SpriteFont字体、int i、int minDigits、Vector2位置、颜色){
Assert(i>=0&&minDigits>0&&minDigits 0 | | index0){
--指数;
字符串数字=数字[digitBuff[索引];
sb.抽绳(字体、数字、位置、颜色);
位置X+=字体测量(数字).X;
}
}
以下是一些我正是为了这个目的而编写的C#代码。将其转换为Java应该非常简单。
minDigits
参数会导致左侧出现零填充——如果愿意,可以跳过该选项

// drawInteger doesn't allocate like string.Format()
int[] digitBuff = new int[10];
string[] digits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };

void drawInteger(SpriteFont font, int i, int minDigits, Vector2 pos, Color colour) {
    Debug.Assert(i >= 0 && minDigits > 0 && minDigits <= digitBuff.Length);
    int index = 0;
    while (i > 0 || index < minDigits) {
        digitBuff[index] = i % 10;
        i /= 10;
        ++index;
    }
    while (index > 0) {
        --index;
        string digit = digits[digitBuff[index]];
        sb.DrawString(font, digit, pos, colour);
        pos.X += font.MeasureString(digit).X;
    }
}
//drawInteger与string.Format()分配不一样
int[]digitBuff=新int[10];
字符串[]位={“0”、“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”};
void drawInteger(SpriteFont字体、int i、int minDigits、Vector2位置、颜色){
Assert(i>=0&&minDigits>0&&minDigits 0 | | index0){
--指数;
字符串数字=数字[digitBuff[索引];
sb.抽绳(字体、数字、位置、颜色);
位置X+=字体测量(数字).X;
}
}

谢谢您的回答。但您的方法只是将绘图方式从绘制
String
更改为绘制可绘图项。它可以更快(我没有测试),但问题仍然存在。我如何知道,我应该使用哪些抽签(0-9)来抽签分数?我只知道分数是
int
float
,可能是2341。谢谢你的回答。但您的方法只是将绘图方式从绘制
String
更改为绘制可绘图项。它可以更快(我没有测试),但问题仍然存在。我如何知道,我应该使用哪些抽签(0-9)来抽签分数?我只知道分数是
int
float
,可能是2341。谢谢,我认为这个答案可以接受。我编写了类似的函数来将
int
转换为
char[]
。但是,你知道一种画
float
number的方法吗?我使用
float
的精度很差
Double
可以。对于浮点数,我建议乘以pow(10,精度),四舍五入为整数,然后执行相同的过程,在适当的位置绘制小数点。minDigits参数在这里很有用,因为它至少需要精度+1才能处理小于1的数字。你可以通过在-N后面画“-”来处理负N,我的方法和你建议的一样。但有些数字的结果不好。没关系,
double
可以。谢谢,我认为这个答案可以接受。我编写了类似的函数来将
int
转换为
char[]
。但是,你知道一种画
float
number的方法吗?我使用
float
的精度很差
Double
可以。对于浮点数,我建议乘以pow(10,精度),四舍五入为整数,然后执行相同的过程,在适当的位置绘制小数点。minDigits参数在这里很有用,因为它至少需要精度+1才能处理小于1的数字。你可以通过在-N后面画“-”来处理负N,我的方法和你建议的一样。但有些数字的结果不好。没关系,
double
可以。