バッファ付きリーダーを使用して1行ずつ読み込むObjファイルリーダーを作成します。各行を頂点にする必要があります。頂点に追加します。ArrayList
面IはFace
オブジェクトを作成し、get(i)
頂点ArrayList
を作成し、別の2は "normal and UVs"をリストしてfacesリストに追加します。 これはコードAndroidのスピードBufferedReaderのreadラインとArrayListの追加と取得
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);
}
}
問題はパフォーマンスであり、それはファイルが約120,000行を含むファイルが複雑であれば、このプロセスは、私はそのような多くのモデルをロードしたいので、長すぎる約90秒かかりますです850,000行の処理には約280秒がかかりますが、BufferReader
は非常に高速にスキャンすることができますが、ArrayList
処理では遅く処理されますが、私はLinkedList
をテストしましたが、結果は恐ろしい "5倍遅く"でしたこれを行うためにメソッドや別の解決策を使用できますか?後で、顔を反復してArrayList
にバッファを作成し、OpenGL
に渡します。私は同じ12万線でVector
を使用
編集は、(20秒ArrayList
より増加)
'BufferedReader.readLine()'を使用すると、毎秒何百万行も読むことができます。 'ArrayList'の性能はJavadocで定義されています。あなたの問題はほぼ確実に7つの「条件」です。あなたが何を求めているのか不明です。 – EJP
はい、私は問題がBufferedReaderにないことを知っています。私はファイルを読み込んでテストし、各行を実際に非常に高速で印刷しています。私はこれらの条件でarraylistやヒントよりも早くFaceのコレクションを取得できますか?私のコードを実行する、私は間違った方法で何かを使用するかもしれない – Mohamed
あなたは問題がバッファリングされたリードではないが、あなたのタイトル、あなたの質問、およびあなたのタグにそれを言及することを知っている。どうして?あなたのタイトル、あなたの質問、あなたのタグを実際に何が関係があるものにすることを考えましたか? – EJP