Hier ist, was ich in der Vergangenheit gemacht habe. Dies beseitigt String-Allokationen.
Ich erstelle ein char[], das mindestens so groß ist wie die maximale Anzahl von Zeichen, die Sie auf dem Bildschirm anzeigen müssen. Das bedeutet, dass Sie einen maximalen Highscore auswählen sollten, der im Spiel erreichbar ist. Auf die aktuelle Weise können Sie einen Score anzeigen, der so hoch ist wie 2^31-1, was wahnsinnig groß ist und im Hinblick auf das Spiel nicht praktisch ist. Denken Sie daran, dass dies Ihr Spiel ist, daher ist es in Ordnung, den Maximalscore in einem vernünftigeren Rahmen im Kontext des Spiels zu begrenzen. Wählen Sie eine Zahl, die virtuell unmöglich zu erreichen ist. Durch Festlegen dieser Grenze müssen Sie dann nicht mehr mit der Konvertierung großer Ganzzahlen in String-Objekte herumhantieren.
Hier ist, was erforderlich ist:
Zunächst müssen Sie in der Lage sein, die Ziffern einer Ganzzahl zu separieren und in Zeichen ohne Erstellung von String-Objekten zu konvertieren. Angenommen, Sie möchten die Ganzzahl 324 in drei separate Zeichen '3','2','4' umwandeln, die im Text char[] platziert werden sollen. Eine Möglichkeit, dies zu tun, besteht darin, den Wert 324 zu nehmen und ein Modulo 10 auszuführen, um die niedrigste Ziffer zu erhalten. Also 324%10 = 4. Teilen Sie dann den Wert durch zehn und führen Sie erneut ein Modulo 10 aus, um die nächste Ziffer zu erhalten. Also (324/10)%10 = 2 und (324/100)%10 = 3.
int score = 324;
int firstPlaceInt = score%10; // firstPlace wird 4 sein
int tensPlaceInt = (score/10)%10; // tensPlace wird 2 sein
int hundresPlaceInt = (score/100)%10; // hundredsPlace wird 3 sein
Sie müssen dies in einer Schleife tun, aber dies drückt die Idee dessen aus, was Sie hier versuchen zu tun.
Dann können Sie diese Ziffern mit einem Zeichenverweis in chars umwandeln. Eine Möglichkeit, dies zu tun, besteht darin, diese Zeichenzuordnung zu erstellen, indem Sie ein char[] der Größe 10 erstellen und die Werte 0 - 9 an den Indizes 0 - 9 platzieren.
char[] charMap = {'0','1','2','3','4','5','6','7','8','9',};
Also dies zu tun:
int score = 324;
char firstPlace = charMap[score%10];
char tenslace = charMap[(score/10)%10];
char hundredsPlace = charMap[(score/100)%10];
Wird die Zeichen erzeugen, die Sie für die 3 Ziffern im Score benötigen.
Nach alledem würde ich den höchsten Score auf sagen wir 99.999 begrenzen (oder was auch immer in Ihrem Spiel sinnvoll ist). Dies bedeutet, dass die größte "Zeichenkette", die ich anzeigen muss, "Score: xx,xxx" ist. Dies erfordert ein char[] (nennen wir es in diesem Beispiel text) der Größe 13. Initialisieren Sie die ersten 7 Zeichen mit "Score: ", diese müssen nie geändert werden.
char[] text = new char[13];
text[0] = 'S';
text[1] = 'c';
text[2] = 'o';
text[3] = 'r';
text[4] = 'e';
text[5] = ':';
text[6] = ' ';
Die nächsten 6 werden je nach Punktzahl variieren. Beachten Sie, dass Sie möglicherweise nicht alle 6 dieser verbleibenden Zeichen ausfüllen müssen. Daher müssen Sie eine int (nennen wir sie in diesem Beispiel scoreCount), die Ihnen anzeigt, wie viele Zeichen im char[] tatsächlich relevant für den aktuellen Punktestand im Spiel sind. Angenommen, ich muss "Score: 324" anzeigen, dies erfordert nur 10 Zeichen aus den 13. Schreiben Sie die 3 Zeichen für den Score von 324 in char[7] bis char[9] und setzen Sie scoreCount auf 10, um die Anzahl der gültigen Zeichen im char[] anzugeben.
int scoreCount = 7;
text[9] = charMap[score%10]; // dies ist firstPlace
text[8] = charMap[(score/10)%10]; // dies ist tensPlace
text[7] = charMap[(score/100)%10]; // dies ist hundredsPlace
scoreCount = 10;
Sie müssen dies wahrscheinlich in einer Schleife tun, aber dies sollte die allgemeine Idee dessen ausdrücken, was Sie hier versuchen zu tun.
Danach können Sie einfach drawText(char[] text, int index, int count, float x, float y, Paint paint) verwenden. index wird 0 sein und count wird scoreCount sein, was anzeigt, wie viele Zeichen in text gezeichnet werden sollen. In dem obigen Beispiel ist es nicht wichtig, was in text[10] bis text[12] steht, es wird als ungültig betrachtet. Sie können text[] weiterhin mit der Zeichenmap aktualisieren, und dies sollte keine Objekte erstellen.
Ich hoffe, das hilft. Der obige Code ist nicht sehr robust, aber ich habe ihn mehr als Ausdruck der Ideen, die ich vermitteln möchte, geschrieben. Sie müssen Ihre eigenen Schleifen erstellen und die Daten innerhalb Ihres Codes ordnungsgemäß verwalten, aber dies umreißt die Mechanik dessen, was getan werden muss, um den Einsatz von Strings/StringBuilder/StringBuffer usw. zu vermeiden.
1 Stimmen
Wenn die GC Verzögerungen verursacht, scheint es, als würden Sie etwas falsch machen. Das Konvertieren einer Ganzzahl in einen String ist ein äußerst triviales Verfahren, und es gibt NICHTS, was Sie dagegen tun können, da es LETZTLICH irgendwo in einen String konvertiert werden muss.
0 Stimmen
DrawText(..) verwendet auch char[]. Verwenden Sie stattdessen - siehe Antwort von @tp0w3rn.
0 Stimmen
@Falmarri: Es sind nicht die Zuweisungen, die das Problem sind, sondern: 1 Zeichenkettenzuweisung x 5 HUD-Elemente x 40 Mal pro Sekunde x 10 Sekunden = ergibt eine Menge Müll, der übrig bleibt. @Peter Knego: Danke, ich habe tp0w3rn's Antwort unten gar nicht bemerkt, bis ich deinen Beitrag wieder gelesen habe.