버퍼링 된 판독기를 사용하여 한 줄씩 읽는 Obj 파일 판독기를 만듭니다. 꼭지점 인 경우 각 줄을 확인해야합니다. 꼭지점 ArrayList
에 추가하십시오. 얼굴 나는 Face
객체를 만들고 get(i)
개의 정점 ArrayList
을 만들고 다른 2 개는 "normal and UVs"를 나열하여 얼굴 목록에 추가합니다. 이, 파일이 프로세스가 파일이 더 복잡한 경우 나, 같은 부하가 많은 모델 싶어하기 때문에 너무 긴 약 90 초 정도 걸립니다 약 12 라인을 포함하는 문제는 성능에 코드안드로이드 속도 BufferedReader 읽기 라인 및 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);
}
}
입니다 그리고 850,000 라인을 가지고있는 프로세스는 받아 들여지지 않는 약 280 초가 걸리는데, BufferReader
은 라인을 매우 빠르게 스캔 할 수 있지만 ArrayList
프로세싱은 느려지므로 나는 LinkedList
을 테스트했지만 그 결과는 "5 배 느리다"는 것이 었습니다. 이 방법이나 다른 솔루션을 사용해도됩니까? 나중에 나는 얼굴을 반복하여 ArrayList
으로 만들고 버퍼를 만들고 OpenGL
에 전달합니다. I는 동일한 120,000 라인 Vector
사용
편집 은 (20초이보다 증가 ArrayList
)
'BufferedReader.readLine()'으로 초당 수백만 라인을 읽을 수 있습니다. 'ArrayList'의 성능은 Javadoc에서 정의됩니다. 당신의 문제는 거의 확실하게 7 가지 '조건'입니다. 네가 묻고있는 것이 불분명하다. – EJP
예 BufferedReader에 문제가 없다는 것을 알았습니다. 파일을 읽은 다음 각 행을 인쇄하는 것이 정말 빠릅니다. arraylist 나 힌트보다 빠른 조건으로 Face 컬렉션을 얻는 방법을 묻습니다. 내 코드를 수행하고, 내가 잘못된 방식으로 뭔가를 사용하고있을 수도 있습니다. – Mohamed
문제는 버퍼링 된 리드가 아니지만 제목, 질문 및 태그에서 언급 한 것입니다. 왜? 제목, 질문 및 태그를 실제로 관련성이있는 것으로 줄이는 것이 고려 되었습니까? – EJP