- Mesaj
- 1.536
- Çözümler
- 56
- Beğeni
- 2.923
- Puan
- 1.839
- Ticaret Puanı
- 0
Yıllardır Metin2'nin ilkel text renderinin performansı nasıl etkilediğini, kalabalık yerderde FPS'i nasıl dibe çektiğini gördük.
Bunun birkaç sebebi var:
Bu sadece tek bir yazı için.
Ekranda aynı anda onlarca isim, çeşitli yazı ve UI text’i olduğunu düşünürsek, text sistemi gereksiz şekilde CPU -> GPU submission yükü oluşturuyordu. Sorun fillrate değil, draw call sayısıydı.
Ben de başlangıç noktamı temel alabilmek için bir metrik penceresi yazdım.
Ekranda 135 tane text renderlayan instance ve 1742 harf varken:
FPS: 33.2
Frame Time: 30.1ms
ve tamı tamına 7618 Draw Call!
Page başına 1 draw call’a düştü
Yeni sistemde outline quad’ları da ana batch içine ekleniyor ve aynı submission içinde gönderiliyor.
Yani outline artık draw call sayısını katlamıyor.
Bunun birkaç sebebi var:
- Her harf ayrı vertex set ediliyor
- Her harf ayrı draw call ile çiziliyor
- Outline varsa aynı harf için 4 fazladan draw call atılıyor
- Her harf için sürekli texture seçimi ve state değişimi yapılıyor
Bu sadece tek bir yazı için.
Ekranda aynı anda onlarca isim, çeşitli yazı ve UI text’i olduğunu düşünürsek, text sistemi gereksiz şekilde CPU -> GPU submission yükü oluşturuyordu. Sorun fillrate değil, draw call sayısıydı.
Ben de başlangıç noktamı temel alabilmek için bir metrik penceresi yazdım.
Ekranda 135 tane text renderlayan instance ve 1742 harf varken:
FPS: 33.2
Frame Time: 30.1ms
ve tamı tamına 7618 Draw Call!
İlk iyileştirmelerim:
Per-Instance Batching
Bu, şu demek: Her harfi ayrı ayrı çizmek yerine;- Aynı font texture page’e ait karakterleri tek batch içinde topladım
- Vertex ve index verilerini std::vector içinde biriktirdim
- Texture page değiştiğinde veya text bittiğinde tek seferde DrawIndexedPrimitiveUP çağrısı yaptım.
Page başına 1 draw call’a düştü
Ayrıca Outline Render’ı Batch’e Dahil Ettim
Eski sistemde outline:- Sol
- Sağ
- Üst
- Alt
Yeni sistemde outline quad’ları da ana batch içine ekleniyor ve aynı submission içinde gönderiliyor.
Yani outline artık draw call sayısını katlamıyor.
Texture Page Bazlı Flush Mekanizması
Font sistemi multi-page çalıştığı için:- Texture page değiştiğinde batch flush ediliyor.
- Böylece mevcut davranış korunuyor.
- Multi-page font desteği bozulmadı.
Gereksiz Reallocation’ların önüne geçmek
Batch vector’ları:- reserve() ile önceden kapasite alıyor.
- Destroy sırasında temizleniyor.
- Frame içinde tekrar tekrar heap allocation yapılmıyor.
Sonuç:
| Metrik | Önce | Sonra | Fark |
| FPS | 30 | 36.4 | +21% |
| Frame Time | 32.8ms | 27.4ms | -5.4ms |
| Draw Call | 7618 | 255 | -96% |
| Draw / Harf | 4.48 | 0.15 | -96% |
Geometry tekrar hesaplanmıyor.