2012-05-16 53 views
10

Tôi gặp sự cố nhỏ về ứng dụng iOS của mình. Khi tôi đang sử dụng ứng dụng iOS 5.1 5.1/iphone, ứng dụng đang hoạt động, nhưng khi tôi sử dụng thiết bị iOS thực (cả iPad và iPhone 5.1),Lỗi OpenGL ES trên nền di chuyển, iOS 5.1

ứng dụng bị treo khi di chuyển trên nền sau khi nhấp vào nút trang chủ. .. với lỗi này:

libGPUSupportMercury.dylib`gpus_ReturnNotPermittedKillClient: 
0x33240094: trap 
0x33240096: nop 

tôi phát hiện ra rằng nó là OpenGL ES mà vẫn tính toán và làm cho sự sụp đổ của ứng dụng và thấy chức năng này: glFinish();

Nhưng điều đó vẫn không làm việc ở đây một mẫu mã của tôi:

- (void)applicationDidBecomeActive:(UIApplication *)application { 
    [[CCDirector sharedDirector] resume]; 
} 

- (void)applicationWillResignActive:(UIApplication *)application { 
    glFinish(); 
    [[CCDirector sharedDirector] pause]; 
} 

Tôi nghĩ vấn đề chỉ là ở đây Có ai đó có một ý tưởng về vấn đề của tôi? Cảm ơn

EDIT:

Giải quyết vấn đề với điều đó:

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
[[CCDirector sharedDirector] stopAnimation]; 
} 
- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
[[CCDirector sharedDirector] startAnimation]; 
} 

có lẽ có thể giúp một người nào đó x)

+0

Nếu bạn không cần phải lưu bất kỳ cài đặt khi xuất cảnh, điều này cũng sẽ hoạt động: http://stackoverflow.com/questions/12878604/how-do-i-shut-down-opengl-tasks-in-applicationwillresignactive – Jeanne

Trả lời

12

Trong iOS 5.1 nó được thi hành mà bạn không thể thực hiện cuộc gọi đến OpenGL sau bạn đã được yêu cầu từ chức hoạt động.

- (void)applicationWillResignActive:(UIApplication *)application 

là nơi để dừng lại tất cả mọi thứ, cho dù đó là một CADisplayLink hoặc một [[CCDirector sharedDirector] stopAnimation]

+0

có cảm ơn, tôi đã chỉnh sửa khi tôi thấy rằng tôi đã quên ngừng hoạt ảnh x) –

+0

Tài liệu được tham chiếu bởi @sup (http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/ImplementingaMultitasking-awareOpenGLESApplication/ImplementingaMultitasking-awareOpenGLESApplication.html) nói rằng OpenG L cuộc gọi có thể (và trong một số trường hợp nên) được thực hiện từ applicationDidEnterBackground - mà thực hiện sau khi applicationWillResignActive. Vui lòng liên kết với các tài liệu không đồng ý với tài liệu của sup, nếu không vui lòng cập nhật. – janoside

+0

Lưu ý rằng nếu bạn gọi OpenGL ES asyn từ nền nó vẫn sẽ sụp đổ theo thời gian vì khối tiếp tục gọi opengl ngay cả sau khi bạn nói với liên kết hiển thị hoặc hẹn giờ để dừng lại. http://stackoverflow.com/questions/19215554/how-to-stop-opengl-drawing-when-calling-opengl-from-background – openfrog

1

Về mặt kỹ thuật, phương pháp cuối cùng bạn có thể làm cho OpenGL cuộc gọi từ này là một trong:

- (void)applicationDidEnterBackground:(UIApplication *)application 

Mặc dù thường là một ý tưởng tốt để tạm ngừng vẽ sau khi ứng dụngWillResignActive, đây chỉ là đề xuất và một số ứng dụng có yêu cầu vượt quá điều này. Thực tế là được thực thi là bạn không thể thực hiện bất kỳ cuộc gọi OpenGL nào sau khi ứng dụng của bạn chuyển sang nền.

Từ docs:

Once your application exits its applicationDidEnterBackground: method, it must not make any new OpenGL ES calls. If your application makes an OpenGL ES call, it is terminated by iOS.

Ngoài ra, hãy nhớ bao gồm glFinish() như gọi GL cuối cùng của bạn.

0

Kiểm tra xem bạn có nút FPS trên màn hình, nó có thể được render ..

* chỉnh sửa - và kiểm tra âm thanh chơi

Các vấn đề liên quan