2012-04-09 21 views
8

Tôi có GLKViewController để xử lý một số bản vẽ OpenGL. Tôi có phương thức glkView:drawInRectupdate được triển khai và có thuộc tính preferredFramesPerSecond được đặt thành 30 (mặc định).GLKViewControllerĐăng ký bị chặn

Sự cố là các phương thức ủy quyền ngừng kích hoạt khi người dùng tương tác với một phần khác của ứng dụng. Hai trường hợp mà tôi đã thấy điều này xảy ra là khi người dùng cuộn một UITableView hoặc tương tác với một MKMapView.

Có cách nào để đảm bảo các đại biểu này luôn cháy, bất kể phần còn lại của ứng dụng đang hoạt động. Thời gian duy nhất tôi muốn những điều này dừng lại là khi ứng dụng đi vào nền (điều này tự động).

+0

Bạn có thể đăng một số mã không? – prince

+0

Không có bất kỳ mã thực sự nào. Trong 'GLKViewController' init tôi đặt' preferredFramesPerSecond' thành 30. –

Trả lời

15

Lý do cho điều này là khi di chuyển trong chế độ xem bảng hoặc chế độ xem bản đồ, runloop nằm trong UITrackingRunLoopMode có mức độ ưu tiên cao hơn chế độ mặc định. Điều này ngăn một số sự kiện phát sinh để đảm bảo hiệu suất cuộn cao.

Để giải quyết vấn đề của bạn, bạn phải thiết lập vòng lặp hiển thị của riêng bạn thay vì dựa vào số GLKViewController.

  • Đầu tiên thiết lập enableSetNeedsDisplay của GLKView để NO (nên được thiết lập tự động khi sử dụng GLKViewController).
  • thiết preferredFramesPerSecond-0 (hoặc có thể 1) để vô hiệu hóa các vòng cung GLKViewController hoặc không sử dụng ở tất cả các GLKViewController
  • nhập khuôn khổ QuartzCore: #import <QuartzCore/QuartzCore.h>
  • tạo CADisplayLink và sắp xếp nó trong NSRunLoopCommonModes:
 
CADisplayLink* displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(render:)]; 
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; 
  • tùy chọn: thiết lập các frameInterval của DisplayLink đến 2 (= một nửa tốc độ khung hình)
  • render phương pháp:
 
- (void)render:(CADisplayLink*)displayLink { 
    GLKView* view = (GLKView*)self.view; 
    [view display]; 
} 

tôi đã không kiểm tra này, vì vậy cho tôi biết nếu nó hoạt động!

+3

Điều này không hoạt động. Tôi đang tìm một cách mà tôi không phải làm điều này, nhưng tôi nghĩ bạn đúng rằng đây là cách duy nhất để đi. –

+0

Vì lý do nào đó, điều này khiến tốc độ khung hình của tôi giảm xuống còn 2 giây trên mỗi khung hình! –

+0

@JosephHumfrey kiểm tra thuộc tính frameInterval của CADisplayLink (mặc định = 1). Có lẽ bạn đã đặt nó thành 30 do nhầm lẫn? Tốc độ khung hình phải bằng '1/(displayLink.frameInterval * displayLink.duration)' – Felix

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