Biasanya, utilitas yang berfungsi tidak memerlukan UI yang waras, dengan tombol, daftar, jendela, dukungan mouse, dan hal-hal kecil lainnya, sebagian besar Daftar Keinginan yang berfungsi dapat dikemas dalam skrip dan terkadang menjalankannya dengan parameter --help, dan ini bahkan akan lebih benar dari sudut pandang konfigurasi. dan scaling. Semuanya menjadi lebih buruk ketika tidak hanya tim pengembangan, tetapi juga pihak ketiga mulai menggunakan alat. Dan mereka tidak selalu siap untuk menyelidiki pemikiran harmonis yang ditetapkan dalam baris kode. Dan kemudian Anda harus membuat keributan dari UI, dan para pengembang biasanya membuatnya sederhana, persegi, fungsional, dan benar-benar membosankan. Beberapa waktu yang lalu, saya sedang mengerjakan sistem kontrol ventilasi / pemanas / kamera kecil dan juga "apa yang akan dihasilkan oleh paman dengan helm kuning" untuk parkir mobil bawah tanah.

(Berikut adalah gambar dari sistem UI, tetapi pengembang meminta untuk menghapusnya. Jika Anda tidak ingin membaca tentang jalan-jalan di bidang rake, maka tautkan ke github di akhir artikel)
Sistem ini dibangun di atas SoC non-nama Cina, di mana pabrikan memutuskan untuk port kerangka SDL dari versi pertama. Alat internal dan skrip diselesaikan sedemikian rupa sehingga mereka berubah menjadi tata letak yang berat dan "indah" dengan tab, daftar, popup, bayangan, gradien, transparansi, dan barang lainnya.
Untuk mewujudkan semua keindahan, nanogui dipilih, sederhana dan bersahaja, dan pada saat yang sama "kuat" semua yang dibutuhkan. Itu persis di atas kertas, tetapi
jurang lupa tentang OpenGL. Sistem kontrol UI yang hampir sepenuhnya diimplementasikan mulai berjalan pada perangkat keras, dan ada layar hitam, semua inisialisasi OpenGL3 berjalan tanpa kesalahan, buffer diatur, dan shader akan mengkompilasi, tetapi tidak ada ... layar hitam, pada sudut apa tidak terlihat.
Pada awalnya mereka berdosa di tangan saya yang bengkok, kemudian di tangan pengembang Antokha yang bertanggung jawab atas driver dan perangkat keras, kemudian mereka meluncurkan contoh uji render segitiga dari SoC SDK, dan lagi-lagi layar hitam, dokumentasi dan contoh biasanya dibaca terakhir.
Kolega saya dan saya berpikir ada sesuatu yang salah dan pergi dulu ke forum China, dan tidak menemukan jawaban yang jelas kepada pengembang di sana, jawabannya mengecewakan, tidak ada implementasi terbuka, dan kemungkinan besar tidak akan, karena saluran sedang dihentikan.
- Tapi bagaimana dengan kerangka kerja SDL? - kami bertanya
- Kami menarik piksel demi piksel ke dalam memori video. - Teman-teman Cina kami menjawab kami.
Hari itu saya melihat mata sedih seorang programmer yang menghitung berapa banyak LoC yang akan ia kirim ke / dev / null. Tapi melempar solusi yang sudah jadi sangat mengecewakan,
(di internet ada segalanya) ternyata Anda bisa hidup tanpa OpenGL di nanogui pada render software.
Hanya hidup ternyata sangat lambat, pada PC besar beberapa detik per frame, dalam keajaiban teknik Cina, sudah sekitar 20-25 detik untuk menggambar. Kemudian mereka memutuskan untuk tidak merender seluruh UI sekaligus, tetapi hanya bagian yang diperlukan (diubah) dari widget, tetapi bahkan dalam mode ini, dengan semua peretasan dan optimisasi, butuh lebih dari 10 detik per frame, tidak layak ...
Setelah merokok beberapa contoh SDK, kami menemukan bahwa menyalin tekstur yang sudah jadi ke memori video adalah "instan" (dibandingkan dengan 10 detik tentunya), dan dibutuhkan sekitar 1 ms hingga 512x512 tanpa transparansi dan 2 ms untuk hal yang sama dengan transparansi, jika Anda menyalin beberapa tekstur ini satu demi satu, maka waktu tumbuh secara nonlinier secara dahsyat, ini ternyata disebabkan oleh jumlah buffer memori video yang terbatas, melimpah yang menyebabkan pembilasan buffer dan merender apa yang ada di layar (bukan milikku, sudah ada di sana), yaitu. untuk antarmuka yang tidak terlalu mati, kita dapat menyalin tidak lebih dari 50-100 tekstur per bingkai dan tidak segera, tetapi hanya setelah menunggu driver video untuk mengumpulkan data dari buffer.
Iterasi berikutnya adalah rendering widget ke teksturnya sendiri di dalam stream, dan pada saat tekstur dibuat, widget digambar kira-kira mirip dengan hasil akhir, hanya dengan cara persegi, untuk menggambar segala macam garis, bentuk bisa langsung di memori video secara gratis.
Hampir mengalahkan keajaiban pemikiran China βtanpaβ GPU, Anda masih tidak dapat menyebut 20 FPS hasil yang layak, dan setelah hampir menyelesaikan proyek, saya meminta izin kepada pelanggan untuk mengambil beberapa pengalaman di open source. SDL pertama tidak terlalu modis sekarang, jadi diputuskan untuk menggunakan render nanogui dalam mode perangkat lunak pada SDL2 dan meletakkannya di github. Mungkin seseorang akan membutuhkan :)
Setelah membaca artikel sampai akhir,% habruiser% memiliki hak untuk bertanya mengapa perlu memblokir sekelompok kode ini
untuk sudut dan bayangan membulat? Pertama, indah (s), kedua, "bahwa paman dengan helm kuning" sudah membayar untuk pengembangan sistem dan sudut-sudut bulat di sana, sayangnya (atau untungnya) berakhir di daftar tugas, masih membuat mereka dengan gradien dan menambahkan beberapa bayangan.
Ini adalah musim panas asli 2017 di Sochi yang cerah.
Ini adalah bagaimana OpenGL merenderIni adalah bagaimana perangkat lunak ditampilkan di PCReferensi :
Wjakob / nanogui asliRender perangkat lunak NanoVGPembuatan perangkat lunak NanoGUI + SDL +PS Jangan percaya pengembang
Cina berbicara tentang keberadaan OpenGL dalam sistem, periksa kinerja semua komponen, Anda akan tahu caranya :)