2013-01-17 11 views
5

üzerinde çalışıyorum iPhone/iPad için küçük bir proje için bazı testler yaparken, gl_Lrawer ile glDrawElements kullanarak wireframes çizimde büyük bir CPU performans cezası olduğunu gözlemledim . glDrawElements gleRunVertexSubmitARM'ı zorlar mı? (veya: Neden wireframes çizim iOS üzerinde yavaş?)

Bu

senaryodur:

  • 640 köşenin (pozisyon için 4 toplar, normaller için 3 yüzer, 4 bayt üzerinde hiçbir hizalama sorunları ... tüm sınırlar)
  • 3840 indeksleri (işaretsiz kısa) bir manken
  • iki tepe noktaları ve indeksler VBOS (bir VAO)
  • GL_TRIANGLES ile glDrawElements ile çizilen yukarıdaki model ince
çalışır kullanımı 63.210 Sonra

: GL_LINES ile glDrawElements ile çizilen 640 köşelerden

  • 2560 indeksleri
  • VBOS ve hiçbir VAO
  • ile

    • aynı modeli sürekli gleRunVertexSubmitARM çağrıları, CPU kullanımı gökyüzü roketleri tetikler ...
    • beklendiği gibi modeller bakmak her iki durumda ve çevresinde hiçbir glErrors ise

    ...

    Sorun, cihaz bağımlı görünüyor. IPad 2'de veya simülatörlerde değil, iPhone 3GS ve iPhone 4'te deneyimliyorum. Bir iPad'de 2 frame-time CPU = 1ms ve gleRunVertexSubmitARM'e çağrı yok, bir iPhone 4 frame-time CPU = 12ms ve sürekli gleRunVertexSubmitARM çağrıları.

    Bu davranışı açıklayabilir veya hangi hataları yaptığımı belirtebilir miyim?

    Herhangi bir fikir çok takdir edilmektedir. peşin sayesinde

    Francesco

  • cevap

    0

    değil söyleyebilirim bir kolay değil soruya kolay bir cevap. Her neyse, aynı "aile" nin iki aygıtının farklı şekillerde davrandığının nedeni birçok faktöre bağlı olabilir. Her şeyden

    Birincisi, farklı GPU'ları montaj (Zaten bildiğin çok eminim çok açık ifade etmek o kadar üzgünüm) şu farkları getiren:

    • Iphone 4 ve Iphone 3GS aynı GPU'yu monte , PowerVR SGX535
    • iPad 2 tüm

    ilk ikinci çok farklı bir verim ve daha yeni mimari ile birinci bir evrim, PowerVR SGX543MP2 kullanır.Tek başına

    Zaten bu her şeyi, onun GPU'larda PowerVR tarafından gerçekleştirilen OpenGL sürücüsü uygulanmasına açıklanabilir gleRunVertexSubmitARM çok fazla arama fark nedenini açıklamıyor, büyük olasılıkla SGX535 GPU sürücüsü aşırı gerektiren işlemleri gerçekleştirir Bu işlevde kanca.

    Son olarak, ama en azından, performans açısından, GL_LINES çizim çeşitli nedenlerle çoğu zaman çok verimsiz:

    • itlaf bir yüzü gerçekleştirmez herhangi bir gizli geometri algılama gerçekleştirmez
    • GL_LINE_WIDTH veya GL_LINE_SMOOTH kullanarak (yaklaşık 2-3 yıl önce kendi deneyimim hakkında), sürücünün herhangi bir HW hızlandırma kullanmadan "yazılım" işlemi gerçekleştirmesine neden oluyor. Bu, GPU'ya ve OpenGL sürücü uygulamasına bağlıdır.
    • Doldurulmuş bir çokgen oluşturulduğunda, sürücü işlemleri "Hiyerarşik Derinlik Tamponu" ile optimize edebilir, GL_LINES ile bunu yapamaz (yine, bu sürücüye çok bağlıdır ancak bu Çok yaygın bir özellik)
    • Bazı sürücüler, GL_LINES mesh'inizi oluşturulduğu anda üçgenler halinde çevirir. Bu ispatlayamadığım bir şey ama geçmiş oyun motorları geliştiricileri arkadaşları ile çok yaygın bir konu.

    Umarım bir şekilde size yardımcı olmuş olurum.

    Ciao Maurizio

    0

    Ben PC'de, ama ben bu alakalı olduğunu düşünüyoruz. Ben tel kafes modunda kare hızı fark: glPolygonMode (GL_FRONT_AND_BACK, GL_LINE) ...

    glEnable (GL_LINE_SMOOTH) eğer 10x yavaştı;

    Bu komutla devre dışı bırakabilirsiniz: glDisable (GL_LINE_SMOOTH);