Menambahkan Akses Jauh Holografik (HoloLens generasi ke-1)
Jika Anda baru menggunakan Akses Jauh Holografik, Anda mungkin ingin membaca ringkasan kami.
Penting
Dokumen ini menjelaskan pembuatan aplikasi host untuk HoloLens 1. Aplikasi host untuk HoloLens (generasi ke-1) harus menggunakan paket NuGet versi 1.x.x. Ini menyiratkan bahwa aplikasi host yang ditulis untuk HoloLens 1 tidak kompatibel dengan HoloLens 2 dan sebaliknya.
HoloLens 2
Pengembang HoloLens yang menggunakan Akses Jauh Holografik perlu memperbarui aplikasi mereka agar kompatibel dengan HoloLens 2. Ini memerlukan versi baru paket NuGet Jarak Jauh Holografik. Pastikan untuk menggunakan versi 2.0.0.0 atau lebih tinggi dari paket NuGet Jarak Jauh Holografik saat menyambungkan ke Pemutar Jarak Jauh Holografik di HoloLens 2. Jika tidak, koneksi akan gagal.
Catatan
Panduan khusus untuk HoloLens 2 dapat ditemukan di sini.
Menambahkan jarak jauh holografik ke desktop atau aplikasi UWP Anda
Halaman ini menjelaskan cara menambahkan Akses Jauh Holografik ke desktop atau aplikasi UWP.
Jarak jauh holografik memungkinkan aplikasi Anda menargetkan HoloLens dengan konten holografik yang dihosting di PC desktop atau di perangkat UWP seperti Xbox One. Anda juga memiliki akses ke lebih banyak sumber daya sistem, sehingga memungkinkan untuk mengintegrasikan tampilan imersif jarak jauh ke perangkat lunak PC desktop yang ada. Aplikasi host jarak jauh menerima aliran data input dari HoloLens, merender konten dalam tampilan imersif virtual, dan mengalirkan bingkai konten kembali ke HoloLens. Koneksi dibuat menggunakan Wi-Fi standar. Untuk menggunakan jarak jauh, gunakan paket NuGet untuk menambahkan jarak jauh holografik ke desktop atau aplikasi UWP Anda, lalu tulis kode untuk menangani koneksi dan merender tampilan imersif. Pustaka pembantu disertakan dalam sampel kode yang menyederhanakan tugas penanganan koneksi perangkat.
Koneksi jarak jauh yang khas akan memiliki latensi serendah 50 mdtk. Aplikasi pemutar dapat melaporkan latensi secara real time.
Catatan
Cuplikan kode dalam artikel ini saat ini menunjukkan penggunaan C++/CX daripada C++17-compliant C++/WinRT seperti yang digunakan dalam templat proyek holografik C++. Konsepnya setara untuk proyek C++/WinRT, meskipun Anda harus menerjemahkan kode.
Mendapatkan paket NuGet jarak jauh
Ikuti langkah-langkah ini untuk mendapatkan paket NuGet untuk jarak jauh holografik, dan tambahkan referensi dari proyek Anda:
- Buka proyek Anda di Visual Studio.
- Klik kanan pada simpul proyek dan pilih Kelola Paket NuGet...
- Di panel yang muncul, pilih Telusuri lalu cari "Akses Jauh Holografik".
- Pilih Microsoft.Holographic.Remoting dan pilih Instal.
- Jika dialog Pratinjau muncul, pilih OK.
- Pilih Saya Terima saat dialog perjanjian lisensi muncul.
Membuat HolographicStreamerHelpers
Pertama, kita perlu menambahkan instans HolographicStreamerHelpers ke kelas yang akan menangani jarak jauh.
#include <HolographicStreamerHelpers.h>
private:
Microsoft::Holographic::HolographicStreamerHelpers^ m_streamerHelpers;
Anda juga harus melacak status koneksi. Jika Anda ingin merender pratinjau, Anda harus memiliki tekstur untuk menyalinnya. Anda juga memerlukan beberapa hal seperti kunci status koneksi, beberapa cara untuk menyimpan alamat IP HoloLens, dan sebagainya.
private:
Microsoft::Holographic::HolographicStreamerHelpers^ m_streamerHelpers;
Microsoft::WRL::Wrappers::SRWLock m_connectionStateLock;
RemotingHostSample::AppView^ m_appView;
Platform::String^ m_ipAddress;
Microsoft::Holographic::HolographicStreamerHelpers^ m_streamerHelpers;
Microsoft::WRL::Wrappers::CriticalSection m_deviceLock;
Microsoft::WRL::ComPtr<IDXGISwapChain1> m_swapChain;
Microsoft::WRL::ComPtr<ID3D11Texture2D> m_spTexture;
Menginisialisasi HolographicStreamerHelpers dan menyambungkan ke HoloLens
Untuk menyambungkan ke perangkat HoloLens, buat instans HolographicStreamerHelpers dan sambungkan ke alamat IP target. Anda harus mengatur ukuran bingkai video agar sesuai dengan lebar dan tinggi tampilan HoloLens, karena pustaka Jarak Jauh Holografik mengharapkan resolusi encoder dan decoder sama persis.
m_streamerHelpers = ref new HolographicStreamerHelpers();
m_streamerHelpers->CreateStreamer(m_d3dDevice);
// We currently need to stream at 720p because that's the resolution of our remote display.
// There is a check in the holographic streamer that makes sure the remote and local
// resolutions match. The default streamer resolution is 1080p.
m_streamerHelpers->SetVideoFrameSize(1280, 720);
try
{
m_streamerHelpers->Connect(m_ipAddress->Data(), 8001);
}
catch (Platform::Exception^ ex)
{
DebugLog(L"Connect failed with hr = 0x%08X", ex->HResult);
}
Koneksi perangkat tidak sinkron. Aplikasi Anda perlu menyediakan penanganan aktivitas untuk menyambungkan, memutuskan sambungan, dan membingkai peristiwa pengiriman.
Peristiwa OnConnected dapat memperbarui UI, mulai merender, dan sebagainya. Dalam sampel kode desktop kami, kami memperbarui judul jendela dengan pesan "terhubung".
m_streamerHelpers->OnConnected += ref new ConnectedEvent(
[this]()
{
UpdateWindowTitle();
});
Peristiwa OnDisconnected dapat menangani koneksi ulang, pembaruan UI, dan sebagainya. Dalam contoh ini, kita terhubung kembali jika ada kegagalan sementara.
Platform::WeakReference streamerHelpersWeakRef = Platform::WeakReference(m_streamerHelpers);
m_streamerHelpers->OnDisconnected += ref new DisconnectedEvent(
[this, streamerHelpersWeakRef](_In_ HolographicStreamerConnectionFailureReason failureReason)
{
DebugLog(L"Disconnected with reason %d", failureReason);
UpdateWindowTitle();
// Reconnect if this is a transient failure.
if (failureReason == HolographicStreamerConnectionFailureReason::Unreachable ||
failureReason == HolographicStreamerConnectionFailureReason::ConnectionLost)
{
DebugLog(L"Reconnecting...");
try
{
auto helpersResolved = streamerHelpersWeakRef.Resolve<HolographicStreamerHelpers>();
if (helpersResolved)
{
helpersResolved->Connect(m_ipAddress->Data(), 8001);
}
else
{
DebugLog(L"Failed to reconnect because a disconnect has already occurred.\n");
}
}
catch (Platform::Exception^ ex)
{
DebugLog(L"Connect failed with hr = 0x%08X", ex->HResult);
}
}
else
{
DebugLog(L"Disconnected with unrecoverable error, not attempting to reconnect.");
}
});
Saat komponen jarak jauh siap mengirim bingkai, aplikasi Anda diberikan kesempatan untuk membuat salinannya di SendFrameEvent. Di sini, kita menyalin bingkai ke rantai pertukaran sehingga kita dapat menampilkannya di jendela pratinjau.
m_streamerHelpers->OnSendFrame += ref new SendFrameEvent(
[this](_In_ const ComPtr<ID3D11Texture2D>& spTexture, _In_ FrameMetadata metadata)
{
if (m_showPreview)
{
ComPtr<ID3D11Device1> spDevice = m_appView->GetDeviceResources()->GetD3DDevice();
ComPtr<ID3D11DeviceContext> spContext = m_appView->GetDeviceResources()->GetD3DDeviceContext();
ComPtr<ID3D11Texture2D> spBackBuffer;
ThrowIfFailed(m_swapChain->GetBuffer(0, IID_PPV_ARGS(&spBackBuffer)));
spContext->CopySubresourceRegion(
spBackBuffer.Get(), // dest
0, // dest subresource
0, 0, 0, // dest x, y, z
spTexture.Get(), // source
0, // source subresource
nullptr); // source box, null means the entire resource
DXGI_PRESENT_PARAMETERS parameters = { 0 };
ThrowIfFailed(m_swapChain->Present1(1, 0, ¶meters));
}
});
Merender konten holografik
Untuk merender konten menggunakan jarak jauh, Anda menyiapkan IFrameworkView virtual dalam aplikasi desktop atau UWP Anda dan memproses bingkai holografik dari jarak jauh. Semua API Holografik Windows digunakan dengan cara yang sama dengan tampilan ini, tetapi disiapkan sedikit berbeda.
Alih-alih membuatnya sendiri, komponen ruang holografik dan ucapan berasal dari kelas HolographicRemotingHelpers Anda:
m_appView->Initialize(m_streamerHelpers->HolographicSpace, m_streamerHelpers->RemoteSpeech);
Alih-alih menggunakan perulangan pembaruan dalam metode Jalankan, Anda memberikan pembaruan centang dari perulangan utama desktop atau aplikasi UWP Anda. Ini memungkinkan aplikasi desktop atau UWP Anda untuk tetap mengontrol pemrosesan pesan.
void DesktopWindow::Tick()
{
auto lock = m_deviceLock.Lock();
m_appView->Tick();
// display preview, etc.
}
Metode Tick() tampilan aplikasi holografik menyelesaikan satu iterasi pembaruan, gambar, perulangan sajikan.
void AppView::Tick()
{
if (m_main)
{
// When running on Windows Holographic, we can use the holographic rendering system.
HolographicFrame^ holographicFrame = m_main->Update();
if (holographicFrame && m_main->Render(holographicFrame))
{
// The holographic frame has an API that presents the swap chain for each
// holographic camera.
m_deviceResources->Present(holographicFrame);
}
}
}
Pembaruan, render, dan perulangan tampilan aplikasi holografik sama persis dengan saat berjalan di HoloLens - kecuali Anda memiliki akses ke sejumlah besar sumber daya sistem di PC desktop Anda. Anda dapat merender lebih banyak segitiga, memiliki lebih banyak pass gambar, melakukan lebih banyak fisika, dan menggunakan proses x64 untuk memuat konten yang membutuhkan RAM lebih dari 2 GB.
Putuskan sambungan dan akhiri sesi jarak jauh
Untuk memutuskan sambungan - misalnya, ketika pengguna mengklik tombol UI untuk memutuskan sambungan - panggil Putuskan Sambungan() pada HolographicStreamerHelpers, lalu lepaskan objek.
void DesktopWindow::DisconnectFromRemoteDevice()
{
// Disconnecting from the remote device can change the connection state.
auto exclusiveLock = m_connectionStateLock.LockExclusive();
if (m_streamerHelpers != nullptr)
{
m_streamerHelpers->Disconnect();
// Reset state
m_streamerHelpers = nullptr;
}
}
Dapatkan pemutar jarak jauh
Pemutar jarak jauh Holografik Windows ditawarkan di penyimpanan aplikasi Windows sebagai titik akhir untuk menghubungkan aplikasi host jarak jauh. Untuk mendapatkan pemutar remoting Windows Holographic, kunjungi toko aplikasi Windows dari HoloLens Anda, cari Remoting, dan unduh aplikasi. Pemutar remoting menyertakan fitur untuk menampilkan statistik di layar, yang dapat berguna saat menelusuri kesalahan aplikasi host jarak jauh.
Catatan dan sumber daya
Tampilan aplikasi holografik akan memerlukan cara untuk menyediakan perangkat Direct3D kepada aplikasi Anda, yang harus digunakan untuk menginisialisasi ruang holografik. Aplikasi Anda harus menggunakan perangkat Direct3D ini untuk menyalin dan menampilkan bingkai pratinjau.
internal:
const std::shared_ptr<DX::DeviceResources>& GetDeviceResources()
{
return m_deviceResources;
}
Sampel kode:Sampel kode Jarak Jauh Holografik lengkap tersedia, yang mencakup tampilan aplikasi holografik yang kompatibel dengan proyek host jarak jauh dan jarak jauh untuk desktop Win32, UWP DirectX, dan UWP dengan XAML.
Catatan penelusuran kesalahan: Pustaka Jarak Jauh Holografik dapat melemparkan pengecualian kesempatan pertama. Pengecualian ini mungkin terlihat dalam sesi penelusuran kesalahan, tergantung pada pengaturan pengecualian Visual Studio yang aktif pada saat itu. Pengecualian ini ditangkap secara internal oleh pustaka Jarak Jauh Holografik dan dapat diabaikan.