3

異なるプラットフォームでのファイル IO の違いについて経験のある人はいますか? 100 MB 以上の TIFF ファイルをストリーミングする LWJGL プログラムを作成しました。ストリーミングは、複数の Mac および Linux コンピューターでかなり高速に行われますが、私の 64 ビット Windows 7 デスクトップでは、マップの各タイルの読み込みに数秒かかるようです。

基本的に、Tile クラスのインスタンスの 2D 配列を作成します。各タイルは TIFF ファイルの 512x512 MB の領域であり、render メソッドは、メモリ内のタイルの領域が読み込まれているかどうかをチェックします。読み込まれていない場合、読み込みは ThreadPoolExecutor でキューに入れられます。キューに入れられている場合は何も起こりません。ロードされている場合は、描かれた。TIFF へのアクセスは、RandomAccessFile インスタンスでファイルを読み取る TIFF クラスによって処理されます。これは、TIFF からタイルを読み取るために使用する関数です。

public BufferedImage getRasterTile(Rectangle area) {
    BufferedImage image = new BufferedImage(area.width, area.height,
            BufferedImage.TYPE_INT_RGB);
    try {
        long[] bytesPerSample = new long[bitsPerSample.length];
        for (int i = 0; i < bytesPerSample.length; i++) {
            bytesPerSample[i] += bitsPerSample[i] / 8 + bitsPerSample[i]
                    % 8 == 0 ? 0 : 1;
        }
        long bytesPerPixel = 0;
        for (long bits : bitsPerSample) {
            bytesPerPixel += bits / 8 + bits % 8 == 0 ? 0 : 1;
        }
        long bytesPerRow = bytesPerPixel * imageWidth;
        int strip, color;
        byte red, green, blue;
        for (int i = area.x; i < area.x + area.width; i++) {
            for (int u = area.y; u < area.y + area.height; u++) {
                if (i > 0 && u > 0 && i < imageWidth && u < imageLength) {
                    switch (planarConfiguration) {
                    case Chunky:
                        strip = (int) (u / rowsPerStrip);
                        seek(stripOffsets[strip]
                                + (u - strip * rowsPerStrip)
                                * bytesPerRow + i * bytesPerPixel);
                        red = readByte();
                        green = readByte();
                        blue = readByte();

                        color = (red & 0x0ff) << 16 | (green & 0x0ff) << 8
                                | (blue & 0x0ff);
                        image.setRGB(i - area.x, u - area.y, color);
                        break;
                    case Planar:
                        strip = (u / (int) rowsPerStrip);
                        seek(stripOffsets[strip] + i);
                        red = readByte();
                        seek(stripOffsets[strip + (int) imageLength] + i);
                        green = readByte();
                        seek(stripOffsets[strip + 2 * (int) imageLength]
                                + i);
                        blue = readByte();
                        color = (red & 0x0ff) << 16 | (green & 0x0ff) << 8
                                | (blue & 0x0ff);
                        image.setRGB(i - area.x, u - area.y, color);
                        break;
                    }
                } else {
                    image.setRGB(i - area.x, u - area.y, 0);
                }
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
    return image;
}
4

1 に答える 1

0

ファイルの読み取り方法に関係していると思われます。readByte()とという名前のメソッドを繰り返し呼び出していることに気付きましたseek。これらのメソッドがバッファリングされていないストリーム (またはRandomAccessFileインスタンス) で呼び出しを行っている場合、おそらく膨大な数のシステム コールを行っているため、メソッドが非常に遅くなります。

これが原因である場合は、おそらくイメージ ファイル全体を に読み込み、byte[]配列インデックスを使用して必要なバイトを特定する必要があります。画像ファイルが大きすぎてそれを実行できない場合は、コードを再構築してシークを減らし、一度に多くのバイトを読み取る必要があります。

于 2012-04-28T16:24:23.213 に答える