2010-10-14 17 views
11

Konular arasında tek bir bağlamı paylaşmanın kötü haber olduğunu biliyorum. Ana iş parçacığı üzerinde GL ile hiçbir şey olmadığında, ikincil bir iş parçacığında bir offscreen çerçevebuffer ile bir bağlamı güvenli bir şekilde oluşturabileceğimi ve kullanabileceğimi biliyorum.OpenGL konuları, farklı bağlamlarda birden çok konu için güvenli midir?

İki farklı iş parçacığı üzerinde iki bağlamı güvenli bir şekilde oluşturabilir miyim sorusuna kesin bir yanıt bulamadım (örneğin, ekrana ana bir iş parçacığı çizimi, ve ikincil bir iş parçacığı çizimi çizim iş parçacığı)) ve hem eşzamanlı olarak GL fonksiyon çağrıları yapmalarını sağlayın. Başka bir deyişle, bağlamlar farklı olduğu sürece, iki iş parçacığı C API'sini ve dolayısıyla GPU'yu "paylaşır"? Yoksa doğal olarak paylaşılamaz bir şey mi? Yoksa bu uygulamaya özel mi?

iOS'ta OpenGL ES için özel olarak sorun, ancak muhtemelen genel bir GL sorusu.

+0

İlgili: [OpenGL ES oyunumda birden çok ileti kullanmalı mıyım?] (Http://stackoverflow.com/questions/5246189/should-i-use-multiple-threads-within-my-opengl-es-game) – bobobobo

cevap

9

Evet, OpenGL ile kullanmak istediğiniz her iş parçacığı için bir bağlam kullanmanız gerekir, ayrıca bağlamlar arasında nesneleri de paylaşabilirsiniz. Bu şekilde devam edin :)

+5

Tam olarak doğru değil: Her iş parçacığına bir bağlam gerekmiyor, aynı bağlamı aynı anda kullanmıyorsanız, aynı bağlamı birden fazla iş parçacığında kullanabilirsiniz. içeriğe tüm erişimi kilitleyerek ve bu kilitleme bir sisteme ihtiyaç duyan sistemlerde bir bellek engeli içerdiği sürece (genellikle kilitler için her zaman bu durum geçerlidir). – Mecki

+0

@Mecki Bu görüşe bir referans verebilir misiniz? Bir gl fonksiyonunun bir gl context __any__ çağrısının kullanılması mıdır? Örneğin, bir gl dokuda yeni bir Doku nesnesi/çağrı 'glTexImage2D' oluşturabilirken aynı anda başka bir iş parçacığı ile aynı gl bağlamından çizim yapabilir miyim? – bobobobo

+0

@bobobobo Evet, herhangi bir gl * işlev çağrısı, iş parçacığı için geçerli olarak ayarlanmış olan bağlamı kullanır; Aksi halde, her bir gl işlevine istenen bağlamı beslemek gerekir. Geçmişte OpenGL, her işlem için yalnızca bir bağlamı destekleyecekti, sonuç olarak, bağlamlar, iş parçacığına özel yapılmış ve günümüzde bir iş parçacığı için dolaylı olarak ayarlanmıştı. Ve hayır, aynı bağlamı aynı anda iki iş parçacığında kullanamazsınız. Bir içerik, herhangi bir zamanda yalnızca bir iş parçacığı tarafından kullanılabilir. Bir bağlamı yalnızca bağlı olan iş parçacığı arasında geçiş yapabilirsiniz. – Mecki

1

Seçenek 1: Bağlamı aynı anda iki iş parçacığı ile kullanmazsanız, bir bağlam yeterlidir.

Seçenek 2: OpenGL'yi aynı anda birkaç iş parçacığıyla kullanmanız gerekiyorsa, birden çok içeriğe gereksiniminiz vardır. Daha sonra, bağlamlar kendi Sharegroup'u paylaşıyorlarsa, OpenGL içeriklerini doku gibi paylaşırlar. Bu şekilde dokuları yükleyebilir veya arka plan iş parçacığında ağır framebuffer işlemlerini gerçekleştirebilirsiniz.

burada Sharegroups hakkında son bölümde göz at: http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithOpenGLESContexts/WorkingwithOpenGLESContexts.html

Seçenek 3: GLKit örneği asenkron doku yükleme için GLKTextureLoader s - textureWithContentsOfFile yoluyla, bazı yerleşik arka plan işleme sağlar. Tüm seçenekleri bilmiyorum, ancak asenkronize OpenGL kullanımlarının bazılarını kesinlikle basitleştirir.

İlgili konular