Ich erstelle eine Obj-Datei-Leser, die Zeile für Zeile mit einem gepufferten Leser lesen, muss ich überprüfen, jede Zeile, wenn es ein Scheitelpunkt ist, fügen Sie es zu Vertices ArrayList
und wenn es ist ein Gesicht Ich erstelle ein Face
Objekt, das get(i)
die Scheitelpunkte ArrayList
und weitere 2 Listen "Normal und UVs" dann in die Gesichter Liste hinzufügen. Dies ist der CodeAndroid Geschwindigkeit BufferedReader lesen Zeile und ArrayList hinzufügen und erhalten
public final void ctreateObject() {
float now = System.nanoTime();
BufferedReader bufferReader = new BufferedReader(inputStreamReader);
String line;
try {
while ((line = bufferReader.readLine()) != null) {
if (line.startsWith("f")) {
processFLine(line);
} else if (line.startsWith("vn")) {
processVNLine(line);
} else if (line.startsWith("vt")) {
processVTLine(line);
} else if (line.startsWith("v")) {
processVLine(line);
} else if (line.startsWith("usemtl")) {
mtlName = line.split("[ ]+", 2)[1];
} else if (line.startsWith("mtllib")) {
mtllib = line.split("[ ]+")[1];
} else if (line.startsWith("g") || line.startsWith("o")) {
if (faces.size() > 0) {
List<Face> theFaces = new ArrayList<Face>();
theFaces.addAll(faces);
Model model = new Model(id, theFaces, mtlName);
SharedData.models.add(model);
faces.clear();
}
}
Log.i("line", line);
ln++;
}
if (faces.size() > 0) {
List<Face> theFaces = new ArrayList<Face>();
theFaces.addAll(faces);
Model model = new Model(id, theFaces, mtlName);
SharedData.models.add(model);
faces.clear();
vertices.clear();
normals.clear();
uvs.clear();
}
inputStreamReader.close();
bufferReader.close();
} catch (IOException e) {
e.printStackTrace();
}
Log.i("Line", String.valueOf(ln));
Log.i("time", String.valueOf((System.nanoTime() - now)/1000000000));
}
private void processVLine(String line) {
String[] tokens = line.split("[ ]+");
vertices.add(new float[] { Float.parseFloat(tokens[1]), Float.parseFloat(tokens[2]), Float.parseFloat(tokens[3]) });
}
private void processVNLine(String line) {
String[] tokens = line.split("[ ]+");
normals.add(new float[] { Float.parseFloat(tokens[1]), Float.parseFloat(tokens[2]), Float.parseFloat(tokens[3]) });
}
private void processVTLine(String line) {
String[] tokens = line.split("[ ]+");
uvs.add(new float[] { Float.parseFloat(tokens[1]), Float.parseFloat(tokens[2]) });
}
private void processFLine(String line) {
String[] tokens = line.split("[ ]+");
if (tokens.length == 4) {
makeFace3(tokens);
}
}
private void makeFace3(String[] tokens) {
if (tokens[1].matches("[0-9]+")) {// f: v
Face face = new Face(vertices.get(Integer.parseInt(tokens[1]) - 1), vertices.get(Integer.parseInt(tokens[2]) - 1), vertices.get(Integer.parseInt(tokens[1]) - 1));
if (normals.size() > 0) {
face.setAn(normals.get(Integer.parseInt(tokens[1]) - 1));
face.setBn(normals.get(Integer.parseInt(tokens[2]) - 1));
face.setCn(normals.get(Integer.parseInt(tokens[3]) - 1));
}
if (uvs.size() > 0) {
face.setAuv(uvs.get(Integer.parseInt(tokens[1]) - 1));
face.setBuv(uvs.get(Integer.parseInt(tokens[2]) - 1));
face.setCuv(uvs.get(Integer.parseInt(tokens[3]) - 1));
}
faces.add(face);
}
if (tokens[1].matches("[0-9]+/[0-9]+")) {
Face face = new Face(vertices.get(Integer.parseInt(tokens[1].split("/")[0]) - 1), vertices.get(Integer.parseInt(tokens[2].split("/")[0]) - 1), vertices.get(Integer.parseInt(tokens[3].split("/")[0]) - 1));
if (normals.size() > 0) {
face.setAn(normals.get(Integer.parseInt(tokens[1].split("/")[0]) - 1));
face.setBn(normals.get(Integer.parseInt(tokens[2].split("/")[0]) - 1));
face.setCn(normals.get(Integer.parseInt(tokens[3].split("/")[0]) - 1));
}
if (uvs.size() > 0) {
face.setAuv(uvs.get(Integer.parseInt(tokens[1].split("/")[1]) - 1));
face.setBuv(uvs.get(Integer.parseInt(tokens[2].split("/")[1]) - 1));
face.setCuv(uvs.get(Integer.parseInt(tokens[3].split("/")[1]) - 1));
}
faces.add(face);
}
if (tokens[1].matches("[0-9]+//[0-9]+")) {// f: v//vn
Face face = new Face(vertices.get(Integer.parseInt(tokens[1].split("/")[0]) - 1), vertices.get(Integer.parseInt(tokens[2].split("/")[0]) - 1), vertices.get(Integer.parseInt(tokens[3].split("/")[0]) - 1));
if (uvs.size() > 0) {
face.setAuv(uvs.get(Integer.parseInt(tokens[1].split("/")[0]) - 1));
face.setBuv(uvs.get(Integer.parseInt(tokens[2].split("/")[0]) - 1));
face.setCuv(uvs.get(Integer.parseInt(tokens[3].split("/")[0]) - 1));
}
if (normals.size() > 0) {
face.setAn(normals.get(Integer.parseInt(tokens[1].split("/")[2]) - 1));
face.setBn(normals.get(Integer.parseInt(tokens[2].split("/")[2]) - 1));
face.setCn(normals.get(Integer.parseInt(tokens[3].split("/")[2]) - 1));
}
faces.add(face);
}
if (tokens[1].matches("[0-9]+/[0-9]+/[0-9]+")) {
Face face = new Face(vertices.get(Integer.parseInt(tokens[1].split("/")[0]) - 1), vertices.get(Integer.parseInt(tokens[2].split("/")[0]) - 1), vertices.get(Integer.parseInt(tokens[3].split("/")[0]) - 1));
if (uvs.size() > 0) {
face.setAuv(uvs.get(Integer.parseInt(tokens[1].split("/")[1]) - 1));
face.setBuv(uvs.get(Integer.parseInt(tokens[2].split("/")[1]) - 1));
face.setCuv(uvs.get(Integer.parseInt(tokens[3].split("/")[1]) - 1));
}
if (normals.size() > 0) {
face.setAn(normals.get(Integer.parseInt(tokens[1].split("/")[2]) - 1));
face.setBn(normals.get(Integer.parseInt(tokens[2].split("/")[2]) - 1));
face.setCn(normals.get(Integer.parseInt(tokens[3].split("/")[2]) - 1));
}
faces.add(face);
}
}
das Problem in der Leistung ist, ist es die Datei enthält etwa 120.000 Zeilen dieser Prozess etwa 90 Sekunden in Anspruch nimmt, die zu lang ist, weil ich Liest viele Modelle wie das will, wenn die Datei komplizierter und hat 850.000 Linie der Prozess dauert etwa 280 Sekunden, die nicht akzeptiert wird, kann die BufferReader
die Linien sehr sehr schnell scannen aber die ArrayList
Verarbeitung verursacht die langsam, ich testete die LinkedList
aber das Ergebnis war schrecklich "5 mal langsamer", so ist da Eine Methode oder eine andere Lösung kann ich verwenden, um dies zu tun? später iteriere ich die Flächen ArrayList
, um den Puffer zu erstellen und übergebe ihn an OpenGL
.
bearbeiten I Vector
mit den gleichen Linien 120,000 verwendete Datei das Ergebnis ist 109 Sekunden (20 Sekunden als ArrayList
Erhöhung)
Sie können Millionen von Zeilen pro Sekunde mit 'BufferedReader.readLine()' lesen. Die Leistung von 'ArrayList' ist im Javadoc definiert. Ihr Problem ist mit ziemlicher Sicherheit die sieben "if" Bedingungen. Unklar, was du verlangst. – EJP
Ja, ich weiß, dass das Problem nicht im BufferedReader ist, ich lese die Datei und drucke jede Zeile, es ist wirklich sehr schnell, ich frage, wie bekomme ich eine Sammlung von Face s mit diesen Bedingungen schneller als die Arraylist oder einen Hinweis darauf Führen Sie meinen Code aus, möglicherweise verwende ich etwas in der falschen Weise – Mohamed
So wissen Sie, dass das Problem nicht die gepufferte Anzeige ist, aber Sie erwähnen es in Ihrem Titel, in Ihrer Frage und in Ihren Umbauten. Warum? Haben Sie darüber nachgedacht, Ihren Titel, Ihre Frage und Ihre Tags auf das zu reduzieren, was tatsächlich relevant ist? – EJP