Gambaran Umum Realisasi Geometri
Topik ini menjelaskan cara menggunakan realisasi geometri Direct2D untuk meningkatkan performa penyajian geometri aplikasi Anda dalam skenario tertentu.
Hal ini berisi bagian-bagian berikut:
- Apa itu realisasi geometri?
- Mengapa menggunakan realisasi geometri?
- Kapan menggunakan realisasi geometri
- Membuat realisasi geometri
- Menggambar realisasi geometri
- Menskalakan realisasi geometri
- Topik terkait
Apa itu realisasi geometri?
Realisasi geometri, yang diperkenalkan di Windows 8.1, adalah jenis gambar primitif baru yang memudahkan aplikasi Direct2D untuk meningkatkan performa penyajian geometri dalam kasus tertentu. Realisasi geometri diwakili oleh antarmuka ID2D1GeometryRealization .
Mengapa menggunakan realisasi geometri?
Ketika Direct2D merender objek ID2D1Geometry , itu harus mengonversi geometri itu ke bentuk yang dipahami perangkat keras grafis melalui proses yang disebut tessellation. Biasanya, Direct2D harus tessellate geometri setiap bingkai yang digambar, bahkan jika geometri tidak berubah. Jika aplikasi Anda merender geometri yang sama setiap bingkai, maka re-tessellation berulang mewakili upaya komputasi yang terbuang sia-sia. Lebih efisien secara komputasi untuk menyimpan tessellation, atau bahkan rasterisasi penuh, geometri, dan untuk menggambar representasi cache yang setiap bingkai alih-alih berulang kali melakukan tessellating ulang.
Cara umum yang digunakan pengembang untuk menyelesaikan masalah ini adalah dengan menyimpan cache rasterisasi penuh geometri. Secara khusus, adalah umum untuk membuat bitmap baru, rasterisasi geometri ke bitmap itu, dan kemudian gambar bitmap tersebut ke adegan sesuai kebutuhan. (Pendekatan ini dijelaskan di bagian Penyajian geometri dari Meningkatkan performa aplikasi Direct2D.) Meskipun pendekatan ini 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 nyata. Mengurangi artefak ini dengan algoritma penskalaan berkualitas tinggi bisa mahal secara komputasi.
- Bitmap yang di-cache mengonsumsi sejumlah besar memori, terutama jika dirasterisasi pada resolusi tinggi.
Realisasi geometri menyediakan cara alternatif untuk melakukan cache geometri yang menghindari kelemahan di atas. Realisasi geometri diwakili bukan oleh piksel (seperti halnya dengan rasterisasi penuh) tetapi sebaliknya dengan titik-titik pada bidang matematika. Untuk alasan ini mereka kurang sensitif daripada rasterisasi penuh terhadap 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 berubah tetapi mungkin dapat mengubah transformasi.
Misalnya, pertimbangkan aplikasi pemetaan yang menunjukkan peta statis tetapi yang memungkinkan pengguna untuk memperbesar dan memperkecil. Aplikasi ini dapat memperoleh manfaat dari penggunaan realisasi geometri. Karena geometri yang dirender tetap statis, berguna untuk menyimpan pekerjaan tessellation. Tetapi karena peta diskalakan ketika pengguna memperbesar tampilan, penembolokan rasterisasi penuh tidak ideal, karena artefak penskalaan. Realisasi geometri penembolokan akan memungkinkan aplikasi untuk menghindari pekerjaan tessellasi ulang sambil mempertahankan kualitas visual yang tinggi selama penskalaan.
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 bingkai ke bingkai, tidak berguna untuk menyimpan tessellation mereka. Pendekatan terbaik untuk aplikasi ini adalah menggambar objek ID2D1Geometry secara langsung.
Membuat realisasi geometri
Objek ID2D1GeometryRealization harus dibuat dari objek ID2D1Geometry yang ada. Untuk membuat realisasi geometri, panggil metode CreateFilledGeometryRealization atau metode CreateStrokedGeometryRealization dan berikan 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 ke metode pembuatan—ini menentukan jarak maksimum, dalam piksel independen perangkat (DIP), antara kurva sejati geometri dan perkiraan poligonalnya. Semakin rendah toleransi perataan yang Anda berikan, semakin tinggi keakuratan objek realisasi geometri yang dihasilkan. Demikian pula, memberikan toleransi perataan yang lebih tinggi menghasilkan realisasi geometri fidelitas yang lebih rendah. Perhatikan bahwa realisasi geometri dengan keakuratan yang lebih tinggi lebih mahal untuk digambar daripada yang lebih rendah keakuratannya, tetapi dapat diskalakan lebih lanjut sebelum memperkenalkan artefak yang terlihat. Untuk panduan tentang menggunakan toleransi perataan, lihat Menskalakan realisasi geometri di bawah ini.
Catatan
Objek realisasi geometri dikaitkan dengan perangkat grafis tertentu: objek tersebut adalah sumber daya yang bergantung pada perangkat.
Menggambar realisasi geometri
Menggambar realisasi geometri mirip dengan menggambar primitif Direct2D lainnya, seperti bitmap. Untuk melakukannya, panggil metode DrawGeometryRealization dan berikan objek realisasi geometri yang akan digambar dan 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 primitif Direct2D lainnya, menghormati 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 untuk realisasi geometri apa pun dapat mengungkapkan perkiraan poligonal dari kurva yang sebenarnya. Gambar di sini menunjukkan sepasang realisasi geometri elips (isi dan goresan) yang telah ditingkatkan 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 di aplikasi yang tidak menskalakan
Jika aplikasi Anda tidak melakukan penskalaan pada realisasi geometri, maka aman untuk membuat realisasi hanya sekali, menggunakan toleransi perataan tunggal. (Transformasi non-penskalaan tidak memengaruhi kualitas visual realisasi geometri yang dirender.) Gunakan fungsi ComputeFlatteningTolerance untuk menghitung toleransi flattening 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 menskalakan realisasi geometri hanya dengan jumlah kecil (misalnya, hingga 2x atau 3x), maka mungkin tepat hanya untuk membuat realisasi geometri sekali, dengan toleransi perataan yang proporsional lebih rendah daripada default. Ini menciptakan realisasi keakuratan yang lebih tinggi yang dapat ditingkatkan secara signifikan sebelum menimbulkan artefak penskalaan; trade-off adalah bahwa menggambar realisasi keakuratan yang lebih tinggi membutuhkan lebih banyak pekerjaan.
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 fungsi ComputeFlatteningTolerance untuk menghitung toleransi flattening 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 diskalakan 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 disarankan adalah membuat ulang realisasi geometri pada toleransi perataan yang semakin rendah saat adegan ditingkatkan skalanya, untuk menjaga keakuratan visual dan menghindari penskalaan artefak. Demikian pula, ketika adegan diturunkan skalanya, aplikasi harus membuat ulang realisasi geometri pada toleransi perataan yang semakin tinggi, untuk menghindari detail rendering yang tidak terlihat dengan sia-sia. Aplikasi tidak boleh membuat ulang realisasi geometri setiap kali skala berubah, karena melakukannya mengalahkan tujuan penembolokan pekerjaan tessellation. Sebaliknya, aplikasi harus membuat ulang realisasi geometri lebih jarang: misalnya, setelah setiap 2x peningkatan atau penurunan skala.
Setiap kali skala berubah 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 flattening yang sesuai untuk skala baru, dan m_lastScale diperbarui ke skala baru.
Selain itu, aplikasi selalu menciptakan realisasi menggunakan toleransi yang lebih kecil daripada yang biasanya digunakan untuk skala baru, dengan meneruskan nilai 2 sebagai parameter maxZoomFactor ke ComputeFlatteningTolerance. Ini memungkinkan realisasi geometri baru ditingkatkan skalanya dengan faktor tambahan 2 tanpa menimbulkan artefak penskalaan.
Catatan
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 yang berlebihan 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