2011-06-12 12 views
5

Bu kodun iOS'ta GPU için neden yavaş olduğunu anlayamıyorum, bu kod sorunsuz bir şekilde Windows'ta sorunsuz çalışıyor.glBufferSubData performansları abysmal?

Temelde ne yaptığımı ben büyük bir dinamik köşe tamponu (GL_STREAM_DRAW) var ve bunun sadece bölümlerini güncellemeyi deneyin, tek bir karede onlar basması neden olmamalıdır böylece üst üste olmamalı bölümlerini ve olmasıdır CPU, GPU'nun bitmesini beklemek zorunda kalmamalı, ancak 10 ile 20 arasındaki üçgenleri çizerken bile bir iPhone 4'e yaklaşık 10 fps ulaştığım açıkça görülmüyor. benim bilgisayarım aynı kodla ...

İzlemede de gördüğünüz gibi, aynı arabayı yeniden kullanıyorum, ancak güncellenen bölümlerin çakışmamasını sağlıyorum ... ne yapabilirim? performansları geliştirmek?

 
Index Trace 
695 glBindBuffer(GL_ARRAY_BUFFER, 1u) 
696 glBufferSubData(GL_ARRAY_BUFFER, 144l, 144l, 0x0453d090) 
697 glBlendFunc(GL_SRC_ALPHA, GL_ZERO) 
698 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 
699 glActiveTexture(GL_TEXTURE0) 
700 glBindTexture(GL_TEXTURE_2D, 12u) 
701 glUseProgram(12ul) 
702 glUniform4fv(uniform_000000001cd24950_12_0, 1, {0.0500000f, 0.0000000f, 0.0000000f, 0.0000000f}) 
703 glUniform4fv(uniform_000000001cd24950_12_1, 1, {0.0000000f, 0.0333333f, 0.0000000f, 0.0000000f}) 
704 glUniform4fv(uniform_000000001cd24950_12_2, 1, {0.0000000f, 0.0000000f, -0.0010010f, 0.0000000f}) 
705 glUniform4fv(uniform_000000001cd24950_12_3, 1, {-0.0000000f, 0.6333333f, -0.0010010f, 1.0000000f}) 
706 glDrawArrays(GL_TRIANGLES, 6, 6) 
707 glBindBuffer(GL_ARRAY_BUFFER, 1u) 
708 glBufferSubData(GL_ARRAY_BUFFER, 288l, 144l, 0x0453d120) 
+0

Burada yeniyseniz, kendinizi accpet ve up-vote özellikleri hakkında bilgilendirmeyi unutmayın. –

cevap

5

iOS sürücü (glBufferSubData olarak) güncellenmiş aralıkları şu anda işlenen olanlarla örtüşmeyen görmek, sadece yeterince akıllı değil sanırım. PC sürücünüzün bunun için yeterince akıllı olup olmadığından bile emin değilim (bilgisayarınızın genel performansı bunu gizleyebilir). Sürücüye nasıl senkronize edilir ve eğer bunu optimize ederse.

Bunun için bir çözüm, sürücüye açık ipuçları veren ARB_map_buffer_range uzantısı olabilir. Ancak, ES'de desteklenip desteklenmediğinden emin değilim. Aksi halde, tamponunuzu birden fazla küçük bölüme ayırmaktan kaçamazsınız.

+1

Evet, sonunda bunun ne olduğunu anladım ... OpenGL, OpenGL'deki köşe tamponlarıyla uğraşmak için her zaman bir acı veren şeyler için DirectX'in yanı sıra, DirectX'in nasıl çalıştığı üzücü. IPhone üzerinde çalışan çözüm, dinamik köşe tampon gereksinimlerim için düz verteks dizilere (No VBOs) dönmek oldu. –

İlgili konular