Bagikan melalui


Praktik terbaik aplikasi OpenXR

Anda dapat melihat contoh praktik terbaik di bawah ini dalam file OpenXRProgram.cpp BasicXrApp. Fungsi Run() di awal menangkap alur kode aplikasi OpenXR khas dari inisialisasi ke perulangan peristiwa dan penyajian.

Praktik terbaik untuk kualitas dan stabilitas visual

Praktik terbaik di bagian ini menjelaskan cara mendapatkan kualitas dan stabilitas visual terbaik di aplikasi OpenXR apa pun.

Untuk rekomendasi performa lebih lanjut khusus untuk HoloLens 2, lihat bagian Praktik terbaik untuk performa pada HoloLens 2 di bawah ini.

Penyajian yang benar Gamma

Perawatan harus dilakukan untuk memastikan bahwa alur penyajian Anda benar gamma. Saat merender ke swapchain, format tampilan target render harus cocok dengan format swapchain. Misalnya, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB untuk format swapchain dan tampilan render-target. Ada pengecualian jika alur penyajian aplikasi melakukan konversi sRGB manual dalam kode shader. Aplikasi harus meminta format swapchain sRGB tetapi menggunakan format linier untuk tampilan render-target. Misalnya, minta DXGI_FORMAT_B8G8R8A8_UNORM_SRGB sebagai format swapchain tetapi gunakan DXGI_FORMAT_B8G8R8A8_UNORM sebagai tampilan render-target untuk mencegah konten dikoreksi dua kali gamma.

Mengirimkan buffer kedalaman untuk lapisan proyeksi

Selalu gunakan XR_KHR_composition_layer_depth ekstensi dan kirimkan buffer kedalaman bersama dengan lapisan proyeksi saat mengirimkan bingkai ke xrEndFrame. Mengaktifkan proyeksi ulang kedalaman perangkat keras pada HoloLens 2 meningkatkan stabilitas hologram.

Pilih rentang kedalaman yang wajar

Lebih suka rentang kedalaman yang lebih sempit untuk mencakup konten virtual untuk membantu stabilitas hologram pada HoloLens. Misalnya, sampel OpenXrProgram.cpp menggunakan 0,1 meter hingga 20 meter. Gunakan reversed-Z untuk resolusi kedalaman yang lebih seragam. Pada HoloLens 2, menggunakan format kedalaman pilihan DXGI_FORMAT_D16_UNORM akan membantu mencapai kecepatan bingkai dan performa yang lebih baik, meskipun buffer kedalaman 16-bit memberikan resolusi kedalaman yang lebih sedikit daripada buffer kedalaman 24-bit. Mengikuti praktik terbaik ini untuk memanfaatkan resolusi kedalaman dengan semaksimal mungkin menjadi lebih penting.

Mempersiapkan mode campuran lingkungan yang berbeda

Jika aplikasi Anda juga akan berjalan pada headset imersif yang sepenuhnya memblokir dunia, pastikan untuk menghitung mode campuran lingkungan yang didukung menggunakan xrEnumerateEnvironmentBlendModes API, dan menyiapkan konten penyajian Anda dengan benar. Misalnya, untuk sistem dengan XR_ENVIRONMENT_BLEND_MODE_ADDITIVE seperti HoloLens, aplikasi harus menggunakan transparan sebagai warna yang jelas, sementara untuk sistem dengan XR_ENVIRONMENT_BLEND_MODE_OPAQUE, aplikasi harus merender beberapa warna buram atau beberapa ruang virtual di latar belakang.

Pilih ruang referensi yang tidak terikat sebagai ruang akar aplikasi

Aplikasi biasanya membangun beberapa ruang koordinat dunia akar untuk menghubungkan tampilan, tindakan, dan hologram bersama-sama. Gunakan XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT saat ekstensi didukung untuk membuat sistem koordinat skala dunia, memungkinkan aplikasi Anda untuk menghindari penyimpangan hologram yang tidak diinginkan saat pengguna bergerak jauh (misalnya, 5 meter jauhnya) dari tempat aplikasi dimulai. Gunakan XR_REFERENCE_SPACE_TYPE_LOCAL sebagai fallback jika ekstensi ruang yang tidak terikat tidak ada.

Mengaitkan hologram dengan jangkar spasial

Saat menggunakan ruang referensi yang tidak terbatas, hologram yang Anda tempatkan langsung di ruang referensi tersebut dapat melayang saat pengguna berjalan ke ruang yang jauh dan kemudian kembali. Untuk tempat pengguna hologram di lokasi diskrit di dunia, buat jangkar spasial menggunakan xrCreateSpatialAnchorSpaceMSFT fungsi ekstensi dan posisikan hologram di asalnya. Itu akan membuat hologram itu tetap stabil secara independen dari waktu ke waktu.

Mendukung pengambilan realitas campuran

Meskipun tampilan utama HoloLens 2 menggunakan pencampuran lingkungan aditif, ketika pengguna memulai pengambilan realitas campuran, konten penyajian aplikasi akan dicampur alfa dengan aliran video lingkungan. Untuk mencapai kualitas visual terbaik dalam video pengambilan realitas campuran, yang terbaik adalah mengatur XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT di lapisan layerFlagsproyeksi Anda.

Praktik terbaik untuk performa di HoloLens 2

Sebagai perangkat seluler dengan dukungan proyeksi ulang perangkat keras, HoloLens 2 memiliki persyaratan yang lebih ketat untuk performa optimal. Ada sejumlah cara untuk mengirimkan data komposisi, yang menghasilkan pasca-pemrosesan dengan penalti performa yang nyata.

Pilih format swapchain

Selalu hitung format piksel yang didukung menggunakan xrEnumerateSwapchainFormats, dan pilih format piksel warna dan kedalaman pertama dari runtime yang didukung aplikasi, karena itulah yang lebih disukai runtime untuk performa optimal. Perhatikan, pada HoloLens 2, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB dan DXGI_FORMAT_D16_UNORM biasanya merupakan pilihan pertama untuk mencapai performa penyajian yang lebih baik. Preferensi ini dapat berbeda pada headset VR yang berjalan pada PC Desktop, di mana buffer kedalaman 24-bit memiliki dampak performa yang lebih sedikit.

Peringatan Performa: Menggunakan format selain format warna swapchain utama akan mengakibatkan runtime pasca-pemrosesan, yang datang pada penalti performa yang signifikan.

Selalu render dengan tampilan lebar/tinggi konfigurasi yang direkomendasikan (recommendedImageRectWidth dan recommendedImageRectHeight dari XrViewConfigurationView), dan selalu gunakan xrLocateViews API untuk mengkueri pose tampilan yang direkomendasikan, FOV, dan parameter penyajian lainnya sebelum penyajian. Selalu gunakan XrFrameEndInfo.predictedDisplayTime dari panggilan terbaru xrWaitFrame saat mengkueri pose dan tampilan. Ini memungkinkan HoloLens untuk menyesuaikan penyajian dan mengoptimalkan kualitas visual untuk orang yang mengenakan HoloLens.

Menggunakan lapisan proyeksi tunggal

HoloLens 2 memiliki daya GPU terbatas untuk merender konten dan komppositor perangkat keras yang dioptimalkan untuk satu lapisan proyeksi. Selalu menggunakan lapisan proyeksi tunggal dapat membantu framerate aplikasi, stabilitas hologram, dan kualitas visual.

Peringatan Performa: Mengirimkan apa pun kecuali lapisan perlindungan tunggal akan mengakibatkan runtime pasca-pemrosesan, yang datang pada penalti performa yang signifikan.

Render dengan array tekstur dan VPRT

Buat satu xrSwapchain untuk mata kiri dan kanan menggunakan arraySize=2 untuk warna swapchain, dan satu untuk kedalaman. Render mata kiri menjadi ilis 0 dan mata kanan menjadi ilis 1. Gunakan shader dengan VPRT dan panggilan gambar instans untuk penyajian stereoskopis untuk meminimalkan beban GPU. Ini juga memungkinkan pengoptimalan runtime untuk mencapai performa terbaik pada HoloLens 2. Alternatif untuk menggunakan array tekstur, seperti penyajian di seluruh ganda atau swapchain terpisah per mata, akan mengakibatkan runtime pasca-pemrosesan, yang datang pada penalti performa yang signifikan.

Hindari lapisan quad

Daripada mengirimkan lapisan quad sebagai lapisan komposisi dengan XrCompositionLayerQuad, render konten quad langsung ke proyeksi swapchain.

Peringatan Performa: Menyediakan lapisan tambahan di luar lapisan proyeksi tunggal, seperti lapisan quad, akan mengakibatkan runtime pasca-pemrosesan, yang datang pada penalti performa yang signifikan.