Я закодировал ObjectLoader, который принимает файл .obj, и он дает мне то, что я хочу.
Моя проблема в том, что при обработке больших файлов (даже не таких больших, около 80 КБ) я в конечном итоге
в конечном итоге не получает всю информацию, потому что он перестает читать через некоторое время.
Я получаю это в своем LogCat до того, как я закончу, и отладчик просто переходит к следующему методу:
DEBUG / dalvikvm (25743): GC_FOR_MALLOC освободил 2076 объектов / 124280 байт за 50 мс
DEBUG / dalvikvm (25743): GC_FOR_MALLOC освободил 4 объекта / 232 байта за 52 мс
DEBUG / dalvikvm (25743): GC_FOR_MALLOC освободил 142 объекта / 46728 байт за 49 мс
DEBUG / dalvikvm (25743): GC_FOR_MALLOC освободил 0 объектов / 0 байт за 53 мс
DEBUG / dalvikvm (25743): GC_FOR_MALLOC освободил 533 объекта / 63504 байта за 39 мс
DEBUG / dalvikvm (25743): GC_FOR_MALLOC освободил 4 объекта / 216 байт за 50 мс
DEBUG / dalvikvm (25743): GC_EXTERNAL_ALLOC освободил 132 объекта / 26768 байт за 40 мс
Другими словами, много сборщика мусора, я думаю. Это просто потому, что я выделяю много памяти в своем коде? И если да, есть ли какие-то основы, которые мне нужно прочитать, или у вас есть другие предложения? Я использую 4 вектора, каждый из которых содержит около 2K-3K объектов.
Изменить: На самом деле есть 7 векторов, 3 дополнительных для переноса индексов, но все же я не думаю, что это так много.
private void readObj(InputStreamReader in) throws IOException
{
BufferedReader reader = null;
String line = null;
reader = new BufferedReader(in);
while ((line = reader.readLine()) != null)
{
Log.v(TAG, line);
if (line.startsWith("f"))
{
faces++;
processFLine(line);
} else if (line.startsWith("vn"))
{
normals++;
processVNLine(line);
} else if (line.startsWith("vt"))
{
UVCoords++;
processVTLine(line);
} else if (line.startsWith("v"))
{
vertices++;
processVLine(line);
}
}
}
private void processVNLine(String line)
{
String[] tokens = line.split("[ ]+");
int c = tokens.length;
for (int i = 1; i < c; i++)
{
_vn.add(Float.valueOf(tokens[i]));
}
}
private void processFLine(String line)
{
String[] tokens = line.split("[ ]+");
int c = tokens.length;
if (tokens[1].matches("[0-9]+"))
{
caseFEqOne(tokens, c);
}
if (tokens[1].matches("[0-9]+/[0-9]+"))
{
caseFEqTwo(tokens, c);
}
if (tokens[1].matches("[0-9]+//[0-9]+"))
{
caseFEqOneAndThree(tokens, c);
}
if (tokens[1].matches("[0-9]+/[0-9]+/[0-9]+"))
{
caseFEqThree(tokens, c);
}
}
private void caseFEqThree(String[] tokens, int c)
{
for (int i = 1; i < c; i++)
{
Short s = Short.valueOf(tokens[i].split("/")[0]);
s--;
_vPointer.add(s);
s = Short.valueOf(tokens[i].split("/")[1]);
s--;
_vtPointer.add(s);
s = Short.valueOf(tokens[i].split("/")[2]);
s--;
_vnPointer.add(s);
}
}