2010-08-12 21 views
6

Tôi cần tải họa tiết trong chuỗi nền trong OpenGL ES. Nhưng glGenTextures luôn trả về số không khi được gọi trong chuỗi nền.glGenTextures trả về số không trong chủ đề nền

-(void) someMethodInMainThread { 
    [self performSelectorInBackground:@selector(load) withObject:nil]; 
} 

-(void) load { 
    GLuint textureID = 0; 
    glGenTextures(1, &textureID);   
} 

textureID bằng không. Nếu tôi thay đổi mã thành [self performSelector: @selector (tmp) withObject: nil]; nó sẽ hoạt động chính xác và trả về 1. Tôi nên tải họa tiết trong chủ đề nền như thế nào?

Trả lời

9

Đây là lỗi phổ biến, mỗi ngữ cảnh OpenGL có thể hoạt động (hiện tại) chỉ trong một chuỗi, vì vậy khi bạn tạo một chuỗi mới, nó không có bất kỳ ngữ cảnh OpenGL nào và tất cả các cuộc gọi GL đều thất bại.

Giải pháp: Tạo ngữ cảnh OpenGL khác, làm cho nó hiện tại trong chuỗi nền của bạn. Để tải họa tiết, bạn cũng muốn chia sẻ tên OpenGL (id kết cấu, v.v.) với ngữ cảnh chính.

+0

Tôi phải sử dụng EAGLSharegroup? – Division

+0

Có vẻ như nó, tôi không phải là một chuyên gia iPhone, nhưng bởi googling tôi thấy đó là xử lý để chia sẻ tài nguyên giữa các bối cảnh GL. –

-1

Sử dụng [EAGLContext setCurrentContext:] trong chuỗi nền của bạn trước khi thực hiện cuộc gọi tới OpenGL.

Một EAGLCtext chỉ có thể là ngữ cảnh hiện tại trong một chuỗi. Tất cả các cuộc gọi OpenGL yêu cầu ngữ cảnh hiện tại, do đó, điều này cần phải được đặt từ chuỗi nền trước khi gọi bất kỳ hàm OpenGL nào.

Lưu ý rằng EAGLContexts là không phải là an toàn chỉ.

Từ doc Apple:

Bạn nên tránh đưa ra những bối cảnh tương tự hiện hành về nhiều chủ đề. OpenGL ES không cung cấp an toàn luồng, vì vậy nếu bạn muốn sử dụng cùng một bối cảnh trên nhiều luồng, bạn phải sử dụng một số hình thức đồng bộ hóa luồng để ngăn truy cập đồng thời vào cùng một ngữ cảnh từ nhiều luồng.

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