4

しばらくの間、この問題を修正しようとしてきましたが、なぜそれが起こっているのかわかりません。アプリケーションのデバッグ時ではなく、アプリケーションを「アーカイブ」してデバイスで実行しているときにのみ発生するようです。

私は2つのクラスを持っています:

@interface AppController : NSObject <UIApplicationDelegate>
{
    EAGLView * glView;  // A view for OpenGL ES rendering
}

@interface EAGLView : UIView
{
@public
    GLuint framebuffer;
}

- (id) initWithFrame:(CGRect)frame pixelFormat:(NSString*)fformat depthFormat:(GLuint)depth stencilFormat:(GLuint)stencil preserveBackbuffer:(bool)retained scale:(float)fscale msaaMaxSamples:(GLuint)maxSamples;

そして、私は1つのオブジェクトを次のように初期化しています:

glView = [ EAGLView alloc ];
glView = [ glView initWithFrame:rect pixelFormat:strColourFormat depthFormat:iDepthFormat stencilFormat:iStencilFormat preserveBackbuffer:NO scale:scale msaaMaxSamples:iMSAA ];
NSLog(@"%s:%d &glView %p\n", __FILE__, __LINE__, glView );
NSLog(@"%s:%d &glView->framebuffer %p\n", __FILE__, __LINE__, &glView->framebuffer );

initWithFrame を使用すると、次のようになります。

- (id) initWithFrame:(CGRect)frame
    /* ... */
{
    if( ( self = [super initWithFrame:frame] ) )
    {
        /* ... */
    }
    NSLog(@"%s:%d &self %p\n", __FILE__, __LINE__, self );
    NSLog(@"%s:%d &framebuffer %p\n", __FILE__, __LINE__, &framebuffer );

    return self;
}

ログには次のように表示されます。

EAGLView.mm:399 self 0x134503e90
EAGLView.mm:401 &framebuffer 0x134503f68
AppController.mm:277 glView 0x134503e90
AppController.mm:281 &glView->framebuffer 0x134503f10

それを含むオブジェクトが変更しない場合、このメンバー変数のアドレスはどのように変更できますか?

4

1 に答える 1

1

代わりにポインターを使用しないのはなぜですか? アドレスが同じであることは保証されています。EAGLView を次のように変更します

@interface EAGLView : UIView 
{ 
@public
    GLuint *framebuffer; 
}

のアドレスを次のように出力しますframebuffer

NSLog(@"%s:%d &glView->framebuffer %p\n", __FILE__, __LINE__, glView->framebuffer );

そして、内部initWithFrameで次のようなことを行います:

- (id) initWithFrame:(CGRect)frame
{
    unsigned int fbo= opengl_get_framebuffer();
    framebuffer = &fbo;
    NSLog(@"%s:%d &framebuffer %p\n", __FILE__, __LINE__, framebuffer );
}

フレームバッファのアドレスは同じであるべきです!

于 2013-11-01T17:22:57.023 に答える