VS2015 Cordova App 运行 WebGL 可以在 VS Android 模拟器中使用吗?
Can A VS2015 Cordova App run WebGL in the VS Android Emulator?
我环顾四周,can't find the answer 到以下内容。我想 运行 跨平台应用程序中的一些 3D 内容。我正在使用 VS2015/Apache Cordova 工具/Three.js/WebGL。当我在桌面 (AnyCPU) 和 iOS 远程设备或 iOS mac 模拟器上调试我的 VS2015 项目时,我的应用程序创建了一个 canvas,获取了一个 WebGL 上下文我要去参加比赛了。当我使用 VS2015 在 VS Android 模拟器中调试我的应用程序时,canvas.getContext 失败并且 Three.js 抛出 "Error creating WebGL context".
我已经下载(到 VS2015)一个使用 Lollipop (5.0) 的 VS Android 仿真器并以独立模式启动它(不是从我的 Cordova 项目)。当我遵循这些 MSDN Android Emulator Set Up Instructions(用当前版本的 Chrome 代替默认的 VS 模拟器浏览器引擎)时,VS 模拟器将正确地托管和显示互联网上可用的 3D WebGL 内容。但是,当我尝试让 VS 模拟器托管我的 Cordova 项目时,它无法创建 WebGL 上下文,这让我很不爽。
所以我的问题是:有没有办法配置我的 VS2015 Cordova 项目以在 VS Android 模拟器中启动和调试并让模拟器托管我的 WebGL 3D 内容?或者是否有其他一些技巧来配置 VS Android 模拟器,以便它可以使用支持 WebGL 的引擎接受和托管我的 WebGL 项目?难倒了。
我已经在 Android 的 VS 仿真器中成功地将我的 VS2015 Cordova 应用程序正确地安装到 运行,但是路径并不直。非常感谢 Morrison Chang 将我指向我的 Cordova 应用程序中的 Crosswalk Project, which is specifically designed to address the deficiencies in the stock Android WebView engine, most importantly, for my App, the stock engine's sketchy implementation of WebGL. The first part of the solution was to install the cordova crosswalk plugin。最初,VS2015 引发了描述不当的版本控制部署错误。解决方案是将我的应用程序版本号从“1.0.0”增加到“1.0.1”,就像在 config.xml 文件中一样:
<widget xmlns:cdv="http://cordova.apache.org/ns/1.0" xmlns:vs="http://schemas.microsoft.com/appx/2014/htmlapps" id="io.cordova.XXXXXXXXXXXX" version="1.0.1" xmlns="http://www.w3.org/ns/widgets" defaultlocale="en-US">
项目部署后,我的应用程序在从 Crosswalk 获取有效的 WebGL 上下文时遇到了很多麻烦。我按如下方式解决了这个问题。我的应用程序目前使用三个 r71,它在 THREE.WebGLRenderer 构造函数中使用以下代码片段创建 WebGL 上下文:
var attributes = {
alpha: _alpha,
depth: _depth,
stencil: _stencil,
antialias: _antialias,
premultipliedAlpha: _premultipliedAlpha,
preserveDrawingBuffer: _preserveDrawingBuffer
};
_gl = _context || _canvas.getContext( 'webgl', attributes ) || _canvas.getContext( 'experimental-webgl', attributes );
Crosswalk 不喜欢 THREE 使用 THREE 的默认 "attributes" 值调用 .getContext()。除非我将 "depth" 属性设置为 "false",否则 Crosswalk 甚至根本不会 return WebGL 上下文。但是通过设置 depth:false,VS 模拟器将以一种在我的应用程序中没有视觉意义的方式显示重叠的网格,因为,等等,没有深度缓冲区。所以我至少可以用 depth:false 获得一个 WebGL 上下文——但它很烂。最终对我有用的是调用 .getContext 完全没有属性,如下所示:
_gl = _context || _canvas.getContext( 'webgl' ) || _canvas.getContext( 'experimental-webgl' );
这对我有用。我将不得不覆盖 THREE.WebGLRenderer 构造函数并解决 Android 平台场景,但至少我现在有一个工作的 WebGL 上下文和一个工作的应用程序。我希望以上内容能让其他人免于遭受我刚刚经历的痛苦。现在让调试器连接到模拟器....
我环顾四周,can't find the answer 到以下内容。我想 运行 跨平台应用程序中的一些 3D 内容。我正在使用 VS2015/Apache Cordova 工具/Three.js/WebGL。当我在桌面 (AnyCPU) 和 iOS 远程设备或 iOS mac 模拟器上调试我的 VS2015 项目时,我的应用程序创建了一个 canvas,获取了一个 WebGL 上下文我要去参加比赛了。当我使用 VS2015 在 VS Android 模拟器中调试我的应用程序时,canvas.getContext 失败并且 Three.js 抛出 "Error creating WebGL context".
我已经下载(到 VS2015)一个使用 Lollipop (5.0) 的 VS Android 仿真器并以独立模式启动它(不是从我的 Cordova 项目)。当我遵循这些 MSDN Android Emulator Set Up Instructions(用当前版本的 Chrome 代替默认的 VS 模拟器浏览器引擎)时,VS 模拟器将正确地托管和显示互联网上可用的 3D WebGL 内容。但是,当我尝试让 VS 模拟器托管我的 Cordova 项目时,它无法创建 WebGL 上下文,这让我很不爽。
所以我的问题是:有没有办法配置我的 VS2015 Cordova 项目以在 VS Android 模拟器中启动和调试并让模拟器托管我的 WebGL 3D 内容?或者是否有其他一些技巧来配置 VS Android 模拟器,以便它可以使用支持 WebGL 的引擎接受和托管我的 WebGL 项目?难倒了。
我已经在 Android 的 VS 仿真器中成功地将我的 VS2015 Cordova 应用程序正确地安装到 运行,但是路径并不直。非常感谢 Morrison Chang 将我指向我的 Cordova 应用程序中的 Crosswalk Project, which is specifically designed to address the deficiencies in the stock Android WebView engine, most importantly, for my App, the stock engine's sketchy implementation of WebGL. The first part of the solution was to install the cordova crosswalk plugin。最初,VS2015 引发了描述不当的版本控制部署错误。解决方案是将我的应用程序版本号从“1.0.0”增加到“1.0.1”,就像在 config.xml 文件中一样:
<widget xmlns:cdv="http://cordova.apache.org/ns/1.0" xmlns:vs="http://schemas.microsoft.com/appx/2014/htmlapps" id="io.cordova.XXXXXXXXXXXX" version="1.0.1" xmlns="http://www.w3.org/ns/widgets" defaultlocale="en-US">
项目部署后,我的应用程序在从 Crosswalk 获取有效的 WebGL 上下文时遇到了很多麻烦。我按如下方式解决了这个问题。我的应用程序目前使用三个 r71,它在 THREE.WebGLRenderer 构造函数中使用以下代码片段创建 WebGL 上下文:
var attributes = {
alpha: _alpha,
depth: _depth,
stencil: _stencil,
antialias: _antialias,
premultipliedAlpha: _premultipliedAlpha,
preserveDrawingBuffer: _preserveDrawingBuffer
};
_gl = _context || _canvas.getContext( 'webgl', attributes ) || _canvas.getContext( 'experimental-webgl', attributes );
Crosswalk 不喜欢 THREE 使用 THREE 的默认 "attributes" 值调用 .getContext()。除非我将 "depth" 属性设置为 "false",否则 Crosswalk 甚至根本不会 return WebGL 上下文。但是通过设置 depth:false,VS 模拟器将以一种在我的应用程序中没有视觉意义的方式显示重叠的网格,因为,等等,没有深度缓冲区。所以我至少可以用 depth:false 获得一个 WebGL 上下文——但它很烂。最终对我有用的是调用 .getContext 完全没有属性,如下所示:
_gl = _context || _canvas.getContext( 'webgl' ) || _canvas.getContext( 'experimental-webgl' );
这对我有用。我将不得不覆盖 THREE.WebGLRenderer 构造函数并解决 Android 平台场景,但至少我现在有一个工作的 WebGL 上下文和一个工作的应用程序。我希望以上内容能让其他人免于遭受我刚刚经历的痛苦。现在让调试器连接到模拟器....