c# - WebView.CapturePreviewToStreamAsync() 失败,但仅在具有 Unity3D 的 HoloLens 上
问题描述
目前,我们正在尝试在一个应用程序中结合使用 Unity3D 全息图和 HTML 渲染。这个想法的工作原理如下:
1) 启动一个 XAML 应用程序,其主窗口包含一个 WebView 组件(使用 XAML 应用程序模板)
2) 切换到全息 (DirectX) 模式(基本上从全息应用程序模板复制代码)
3) WebView 仍然在后台运行
4) 我们可以调用该WebView.Navigate()
方法5) 通过API
将 WebView 的内容渲染为位图
6) 将位图转换为纹理并在 DirectX 端显示 - 从而使用全息图进行 HTML 渲染CapturePreviewToStreamAsync()
到目前为止,我们的实验适用于:
1) C++/CX
2) C#
但是,如果我们尝试用 Unity3D 做同样的事情,我们就会遇到问题。以下是我们所做的:
1) 我们创建一个支持混合现实的 Unity3D 项目
2) 我们导出 Unity 项目,并将“UWP 构建类型”设置为“XAML”(而不是 D3D)。该应用程序在 MSVS 2017 中构建,并作为 XAML 应用程序启动,该应用程序自动切换到全息空间,正确显示 Unity 中定义的场景。
3) 我们进一步编辑主 XAML 页面以包含 WebView 元素(指向网页)。
现在,如果我们调用CapturePreviewToStreamAsync()
WebView 组件的 API,则会引发 System.Exception,并显示以下消息: Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))
如果我们同时使用 Hololens 眼镜和模拟器,错误是 100% 可重现的。
有什么建议可能是导致该行为的原因吗?似乎 Unity 以不同的方式创建应用程序 XAML 部分的主窗口,但我们无权访问它,因为窗口创建主要发生在重新编译的 Unity 模块中。
谢谢!马丁
解决方案
虽然我们找不到异常的原因,但我们找到了一种解决方法,按照 Jonathan Antoine 的这篇博客文章中的说明进行操作:
从 2D #XAML 应用程序启动 3D(全息图)应用程序并返回它
使事情起作用的方法是:
1. 从上面为 Unity3D 生成的应用程序创建一个新的 XAML 页面(我们将其命名为 WebViewPage,其中包含我们的 WebView 组件)
2. 修改 Unity 生成的 XAML 应用程序以在启动时导航到 WebViewPage到 MainPage
3. 当需要切换到全息空间时,只需按通常的方式导航到 MainPage:
var frame = new Frame();
Window.Current.Content = frame;
frame.Navigate(typeof(MainPage));
4.您可能还需要将appCallbacks
对象从生成的应用程序从App
类移动到MainPage
类
这解决了问题。现在CapturePreviewToStreamAsync()
调用工作并返回数据。
注意:我们注意到应用程序离开 HoloLens 模拟器 (10.0.14393.1358) 处于某种状态,这不允许应用程序在不重新启动模拟器的情况下再次启动。但是这个问题并没有出现在真实的设备上
希望能帮助某人
马丁
推荐阅读
- android - 房间数据库的非仪器测试
- android - 当没有显示错误但结果出乎意料时如何调试 ConstraintSet 错误
- wso2 - 如何更改 wso2 api 管理器上的生产端点端口?
- jestjs - 如何监视组件外部的功能?
- ruby - 检查字符串是否匹配
- python - 如何解码列表中作为字节 b'string' 的任何字符串字段
- visual-studio-2017 - Service Fabric 无状态服务项目类型中缺少文件嵌套选项
- arrays - 比较两个二维数组以匹配字符串
- react-native - 我不知道是什么导致了这个错误,require 没有定义
- css - Material-ui Grid 项目高度超过其容器的高度