Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Topik ini menjelaskan cara menggunakan realisasi geometri Direct2D untuk meningkatkan performa penyajian geometri aplikasi Anda dalam skenario tertentu.
Ini berisi bagian berikut:
- Apa itu realisasi geometri?
- Mengapa menggunakan realisasi geometri?
- Kapan menggunakan realisasi geometri
- Membuat realisasi geometri
- Gambar realisasi geometri
- Penskalaan realisasi geometri
- Topik terkait
Apa itu realisasi geometri?
Realisasi geometri, yang diperkenalkan di Windows 8.1, adalah jenis primitif gambar baru yang memudahkan aplikasi Direct2D untuk meningkatkan performa penyajian geometri dalam kasus tertentu. Realisasi geometri diwakili oleh antarmukaID2D1GeometryRealization.
Mengapa menggunakan realisasi geometri?
Ketika Direct2D merender objek ID2D1Geometry, geometri tersebut harus dikonversi menjadi bentuk yang dapat dipahami oleh perangkat keras grafis melalui proses yang disebut tessellation. Biasanya, Direct2D harus menguraikan geometri setiap frame yang digambar, bahkan jika geometri tersebut tidak berubah. Jika aplikasi Anda merender geometri yang sama setiap frame, maka penyusunan ulang berulang menghasilkan upaya komputasi yang terbuang. Lebih efisien secara komputasi untuk menyimpan tesselasi, atau bahkan rasterisasi penuh, dari geometri, dan menggambar representasi cache-nya setiap frame alih-alih melakukan pengulangan tessellating.
Cara umum yang digunakan pengembang untuk menyelesaikan masalah ini adalah dengan meng-cache rasterisasi penuh geometri. Khususnya, biasanya dibuat bitmap baru, kemudian merasterisasi geometri ke bitmap tersebut, dan setelah itu menggambar bitmap tersebut ke dalam adegan sesuai kebutuhan. (Pendekatan ini dijelaskan di bagian rendering Geometri dari Meningkatkan kinerja aplikasi Direct2D.) Meskipun sangat efisien secara komputasi, pendekatan ini memiliki beberapa kelemahan:
- Bitmap yang di-cache sensitif terhadap perubahan dalam transformasi yang diterapkan ke adegan. Misalnya, penskalaan rasterisasi dapat menghasilkan artefak penskalaan yang terlihat. Mengurangi artefak ini dengan algoritma penskalaan berkualitas tinggi bisa memerlukan banyak sumber daya komputasi.
- Bitmap yang di-cache mengonsumsi sejumlah besar memori, terutama jika dirasterisasi pada resolusi tinggi.
Realisasi geometri memberikan cara alternatif untuk menyimpan geometri yang menghindari kelemahan di atas. Realisasi geometri tidak diwakili oleh piksel (seperti halnya dengan rasterisasi penuh) tetapi sebaliknya dengan poin pada bidang matematika. Untuk alasan ini mereka kurang sensitif daripada rasterisasi penuh untuk penskalaan dan manipulasi lainnya, dan mereka mengonsumsi memori yang jauh lebih sedikit.
Kapan menggunakan realisasi geometri
Pertimbangkan untuk menggunakan realisasi geometri saat aplikasi Anda merender geometri kompleks yang bentuknya jarang sekali berubah tetapi transformasinya mungkin berubah.
Misalnya, pertimbangkan aplikasi pemetaan yang menunjukkan peta statis tetapi yang memungkinkan pengguna untuk memperbesar dan memperkecil. Aplikasi ini dapat memperoleh manfaat dari menggunakan realisasi geometri. Karena geometri yang dirender tetap statis, berguna untuk meng-cache mereka agar menghemat proses tessellation. Tetapi karena peta diskalakan ketika pengguna memperbesar tampilan, penggunaan cache rasterisasi secara penuh tidak ideal, karena artefak penskalaan. Pemuatan geometri dengan penyimpanan sementara akan memungkinkan aplikasi menghindari proses retesselasi sambil mempertahankan kualitas visual yang tinggi selama pembesaran atau pengecilan.
Di sisi lain, pertimbangkan aplikasi kaleidoscope dengan geometri animasi yang terus berubah. Aplikasi ini mungkin tidak akan mendapat manfaat dari penggunaan realisasi geometri. Karena bentuk itu sendiri berubah dari satu bingkai ke bingkai berikutnya, tidak berguna untuk menyimpan penyusunan mozaik mereka. Pendekatan terbaik untuk aplikasi ini adalah menggambar objek ID2D1Geometry secara langsung.
Membuat realisasi geometri
ObjekID2D1GeometryRealization harus dibuat dari objekID2D1Geometryyang ada. Untuk membuat realisasi geometri, panggil metode CreateFilledGeometryRealization atau metode CreateStrokedGeometryRealization dan masukkan ID2D1Geometry untuk direalisasikan.
- CreateFilledGeometryRealization menciptakan realisasi interior bentuk: wilayah yang akan digambar dengan memanggil FillGeometry.
- CreateStrokedGeometryRealization menciptakan realisasi goresan bentuk: wilayah yang akan digambar dengan memanggil DrawGeometry.
Kedua jenis realisasi geometri diwakili oleh antarmuka ID2D1GeometryRealization.
Saat membuat realisasi geometri, Direct2D harus meratakan kurva apa pun dalam geometri yang disediakan ke perkiraan poligonal. Anda harus memberikan parameter toleransi perataan kepada metode pembuatan—ini menentukan jarak maksimum, dalam piksel independen perangkat (DIP), antara kurva sejati geometri dan perkiraan poligonalnya. Semakin rendah toleransi merata yang Anda berikan, semakin tinggi keakuratan objek realisasi geometri yang dihasilkan. Demikian pula, memberikan toleransi perataan yang lebih tinggi menghasilkan realisasi geometri dengan keakuratan yang lebih rendah. Perhatikan bahwa realisasi geometri dengan keakuratan yang lebih tinggi lebih mahal untuk digambar daripada realisasi keakuratan yang lebih rendah, tetapi dapat diskalakan lebih lanjut sebelum memperkenalkan artefak yang terlihat. Untuk panduan tentang menggunakan toleransi perataan, lihat Realisasi geometri penskalaan di bawah ini.
Nota
Objek realisasi geometri dikaitkan dengan perangkat grafis tertentu: objek tersebut adalah sumber daya yang bergantung pada perangkat.
Menggambar realisasi geometri
Menggambar representasi geometri mirip dengan menggambar primitif Direct2D lainnya, seperti bitmap. Untuk melakukannya, panggil metode DrawGeometryRealization dan serahkan objek realisasi geometri yang akan digambar serta kuas yang akan digunakan. Seperti metode gambar Direct2D lainnya, Anda harus memanggil DrawGeometryRealization antara panggilan ke BeginDraw dan EndDraw.
Menskalakan realisasi geometri
Realisasi geometri, seperti Direct2D primitif lainnya, mengikuti transformasi yang ditetapkan pada konteks perangkat. Meskipun transformasi terjemahan dan rotasi tidak berpengaruh pada kualitas visual realisasi geometri, transformasi skala dapat menghasilkan artefak visual.
Secara khusus, menerapkan skala yang cukup besar ke realisasi geometri apa pun dapat mengungkapkan perkiraan poligonal kurva yang sebenarnya. Gambar di sini menunjukkan dua bentuk geometri elips (isi dan goresan) yang telah diperbesar terlalu jauh. Artefak yang meratakan kurva terlihat.
Aplikasi yang sensitif terhadap kualitas visual harus mengambil langkah-langkah untuk memastikan hal ini tidak terjadi. Cara Anda menangani penskalaan tergantung pada kebutuhan aplikasi Anda. Berikut ini adalah beberapa pendekatan yang direkomendasikan untuk beberapa jenis aplikasi yang berbeda.
Menggunakan realisasi geometri dalam aplikasi yang tidak menskalakan
Jika aplikasi Anda tidak melakukan penskalaan apa pun pada realisasi geometri, maka aman untuk membuat realisasi hanya sekali, menggunakan toleransi meratakan tunggal. (Transformasi non-penskalaan tidak memengaruhi kualitas visual realisasi geometri yang dirender.) Gunakan fungsi ComputeFlatteningTolerance untuk menghitung toleransi perataan yang sesuai untuk DPI.
float dpiX, dpiY;
deviceContext->GetDpi(&dpiX, &dpiY);
float flatteningTolerance = D2D1::ComputeFlatteningTolerance(
D2D1::Matrix3x2F::Identity(), // apply no additional scaling transform
dpiX, // horizontal DPI
dpiY // vertical DPI
);
Menggunakan realisasi geometri dalam aplikasi yang menskalakan dengan jumlah kecil
Jika aplikasi Anda dapat memperbesar realisasi geometri hanya dengan jumlah kecil (misalnya, hingga 2x atau 3x), maka mungkin lebih tepat untuk hanya membuat realisasi geometri sekali, dengan toleransi perataan yang lebih rendah secara proporsional daripada default. Ini menciptakan realisasi dengan ketelitian lebih tinggi yang dapat ditingkatkan secara signifikan sebelum menimbulkan artefak penskalaan; kompromi adalah bahwa pembuatan realisasi dengan ketelitian lebih tinggi membutuhkan pekerjaan lebih banyak.
Misalnya, Anda tahu bahwa aplikasi Anda tidak akan pernah menskalakan realisasi geometri lebih dari 2x. Aplikasi Anda dapat membuat realisasi geometri menggunakan toleransi perataan yang setengah dari nilai default dan cukup skalakan realisasi sesuai kebutuhan, hingga 2x. Gunakan fungsiComputeFlatteningTolerance untuk menghitung toleransi meratakan yang sesuai dengan meneruskan 2,0 sebagai parameter maxZoomFactor:
float dpiX, dpiY;
deviceContext->GetDpi(&dpiX, &dpiY);
float flatteningTolerance = D2D1::ComputeFlatteningTolerance(
D2D1::Matrix3x2F::Identity(), // apply no additional scaling transform
dpiX, // horizontal DPI
dpiY, // vertical DPI
2.0f // realization can be scaled by an additional 2x
);
Menggunakan realisasi geometri dalam aplikasi yang menskalakan dengan jumlah besar
Jika aplikasi Anda dapat menskalakan realisasi geometri ke atas atau ke bawah dengan jumlah besar (misalnya, sebesar 10x atau lebih), maka menangani penskalaan dengan tepat lebih rumit.
Untuk sebagian besar aplikasi ini, pendekatan yang direkomendasikan adalah membuat ulang realisasi geometri pada toleransi perataan yang semakin rendah saat adegan ditingkatkan skalanya, untuk mempertahankan keakuratan visual dan menghindari penskalaan artefak. Demikian pula, karena adegan dikecilkan skalanya, aplikasi harus membuat ulang realisasi geometri pada tingkat toleransi perataan yang semakin tinggi, untuk menghindari pemborosan dengan menyajikan detail yang tidak terlihat. Aplikasi tidak boleh membuat ulang representasi geometri setiap kali skala berubah, karena melakukannya mengalahkan tujuan penyimpanan sementara pekerjaan tessellation. Sebagai gantinya, aplikasi sebaiknya merealisasikan kembali geometri lebih jarang: misalnya, setelah setiap peningkatan atau penurunan skala dua kali lipat.
Setiap kali perubahan skala dalam aplikasi sebagai respons terhadap interaksi pengguna, aplikasi dapat membandingkan skala baru dengan skala di mana realisasi geometri terakhir dibuat (disimpan, misalnya, dalam anggota m_lastScale). Jika kedua nilai tersebut dekat (dalam hal ini, dalam faktor 2), maka tidak ada tindakan lebih lanjut yang diambil. Tetapi jika kedua nilai tidak dekat, maka realisasi geometri dibuat kembali. Fungsi computeFlatteningTolerance digunakan untuk menghitung toleransi perratakan yang sesuai untuk skala baru, dan m_lastScale diperbarui ke skala baru.
Selain itu, aplikasi selalu menciptakan realisasi menggunakan toleransi yang lebih kecil daripada apa yang biasanya digunakan untuk skala baru, dengan meneruskan nilai 2 sebagai parameter maxZoomFactor untuk ComputeFlatteningTolerance. Ini memungkinkan realisasi geometri baru ditingkatkan skalanya dengan faktor tambahan 2 tanpa menimbulkan artefak penskalaan.
Nota
Pendekatan yang dijelaskan di sini mungkin tidak sesuai untuk semua aplikasi. Misalnya, jika aplikasi Anda memungkinkan adegan diskalakan oleh faktor yang sangat besar dengan sangat cepat (misalnya, jika berisi penggeser "zoom" yang dapat dipindahkan dari 100% ke 1.000.000% dalam rentang beberapa bingkai) maka pendekatan ini dapat mengakibatkan pekerjaan berlebih dengan membuat ulang realisasi geometri setiap bingkai. Pendekatan alternatif adalah membuat ulang realisasi geometri hanya setelah setiap manipulasi skala adegan selesai (misalnya, setelah pengguna menyelesaikan gerakan mencubit).
Topik terkait
Meningkatkan performa aplikasi Direct2D