java - 如何使用 Java + LibGDX 有效地读取 float 的文本文件?

标签 java android file input libgdx

我正在使用 Java/LibGDX 编写一个小型科学数据可视化应用程序。该应用程序首先读取一个描述 4 维数组的文本文件:

188 225 3 6 0.001 -0.023 1.345 2.475 ... 4.327

前四个整数指定数组的维度:188 x 255 x 3 x 6,后面是 188 x 255 x 3 x 6 ~= 760000 个数字。文本文件总共占用大约 5MB 的空间。

4D 阵列表示一个“增强”图像,高 188 像素,宽 255 像素,具有 3 个颜色 channel (RGB)。每个像素 channel 有 6 个“参数”,而不是常规 RGB 图像中的一个。

我使用了下面从官方文档中复制的方式将空格分隔的列表读入内存:

FileHandle ptmFile = Gdx.files.internal(filename);
String ptmText= ptmFile.readString();

然后我创建了一个简单的包装器类 AugPixel,它实际上是每个像素的 6 元素数组的包装器。我使用扫描仪从字符串中读取和解析每个数字(请原谅我的半伪代码):

Scanner scan = new Scanner(ptmText);
int nRows = scan.nextInt();
int nCols = scan.nextInt();
int nColors = scan.nextInt();
int nParams = scan.nextInt();


AugPixel[][][] im = new AugPixel[nRows][nCols][nColors];

for (i = 1~nRows)
  for (j = 1~nCols)
    for (k = 1~nColors)
      im[i][j][k] = new AugPixel(nParams);
      for (m = 1~nParams) 
        im[i][j][k].addParam(scan.nextFloat());

此方法适用于桌面版本。加载文件和构建所有 AugPixel 对象大约需要 5 秒。但是,当我将应用程序移动到实际的 android 设备(Nexus 7 32G(第 2 代))时,加载过程需要 5 分钟!

所以我的问题是:有什么方法可以加快加载过程吗?我可以自由地重新定义我认为合适的文件组织。

谢谢!

最佳答案

如果从文件读取数据是主要瓶颈,您可以尝试使用某种形式的异步 IO,以便您可以在加载其余部分的同时处理部分字符串。

如果主要瓶颈是解析字符串,您可以尝试多线程处理或切换到二进制文件格式。如果您愿意放弃文本格式,最好的解决方案可能是切换到二进制文件格式,这应该会大大减少处理时间和可能的文件大小。

关于java - 如何使用 Java + LibGDX 有效地读取 float 的文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31714021/

相关文章:

java - HttpURLConnection getInputStream 太慢

java - JPanel - 更改 JPanel 的背景颜色时出错

android - Coverflow android 一次可显示 3 个 View

java - 如何从客户端的 Controller 下载 zip 文件? Spring Boot

java.util.Logger 打包在不同操作系统中时的行为有所不同

java - Mockito 异常 : Missing method invocation while trying to test an if conditon

java - 在内部使用共享类库,但在发布的 SDK 中不提供对它们的访问

android - 改变android对话框的颜色

c# - 如何处理数字文件c#

java - 在java中移动大文件