如何在Android的零对象分配实时游戏中绘制字符串?
我正在用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) {
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
可以。