0

または、このコードはバックグラウンド スレッドで安全に実行できますか?

    CGImageRef cgImage;
    CGContextRef context;
    CGColorSpaceRef colorSpace;

    // Sets the CoreGraphic Image to work on it.
    cgImage = [uiImage CGImage];

    // Sets the image's size.
    _width = CGImageGetWidth(cgImage);
    _height = CGImageGetHeight(cgImage);

    // Extracts the pixel informations and place it into the data.
    colorSpace = CGColorSpaceCreateDeviceRGB();
    _data = malloc(_width * _height * 4);
    context = CGBitmapContextCreate(_data, _width, _height, 8, 4 * _width, colorSpace,
                                    kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    CGColorSpaceRelease(colorSpace);

    // Adjusts position and invert the image.
    // The OpenGL uses the image data upside-down compared commom image files.
    CGContextTranslateCTM(context, 0, _height);
    CGContextScaleCTM(context, 1.0, -1.0);

    // Clears and ReDraw the image into the context.
    CGContextClearRect(context, CGRectMake(0, 0, _width, _height));
    CGContextDrawImage(context, CGRectMake(0, 0, _width, _height), cgImage);

    // Releases the context.
    CGContextRelease(context);

そうでない場合、どうすれば同じ結果を達成できますか?

(私の問題は、このメソッドがバックグラウンドで実行されている場合、このメソッドの出力バッファーに基づいて OpenGL テクスチャを表示できないことです)

4

3 に答える 3

1

このようなGLとは別のスレッドでこのコードを実行すると問題が発生する可能性があると思います。それがうまくいくとしても、半分描かれた画像/テクスチャに遭遇するかもしれません。ダブルバッファを作成することでこれを回避できます。「_data」は1回だけ割り当てられ、2つのrawイメージデータバッファを保持する必要があります。次に、フォアグラウンドバッファーとバックグラウンドバッファーとして定義された2つのポインターを作成します(最初はvoid * fg = _data [0]、void * bg = _data [1])。これで、メソッドがCGImageからbgにデータを収集するときに、ポインターを交換するだけです(次に、void * fg = _data [1]、void * bg = _data [0]、またはその逆)。これで、GLスレッドがテクスチャにデータを入力する必要があります。 fg(描画と同じスレッド)。

また、いくつかのロックメカニズムが必要になる場合があります。

  1. データをテクスチャにプッシュする前に、「バッファスワップ」をロックし、プッシュ後にロックを解除する必要があります。

  2. おそらく、バッファがスワップされているかどうかを知り、そのような場合はfgデータのみをテクスチャにプッシュする必要があります。

また、複数のスレッドでGLメソッドを呼び出すと、ほとんどの場合問題が発生することに注意してください。

于 2012-08-07T08:47:18.377 に答える
0

uiImage_width_heightおよび_dataが別のスレッドから同時に操作されていないと仮定すると、それは私には問題ないように見えます。(iOS 4 以降を使用していると仮定します。)

バックグラウンド スレッドで OpenGL にテクスチャをアップロードしていますか? もしそうなら、おそらくそれが問題です (特定の OpenGL コンテキストは、一度に 1 つのスレッドからのみアクセスする必要があるため)。

于 2012-08-06T18:43:23.800 に答える
0

UIKit (または同様のフレームワーク) に (直接的または間接的に) アクセスしない限り、また複数のスレッドからコード内の変数にアクセスしない限り、問題ありません。

于 2012-08-06T18:48:43.377 に答える