VS2015 Cordova应用程序可以在VS Android模拟器中运行WebGL吗?

时间:2016-02-24 22:13:19

标签: android cordova android-emulator webgl visual-studio-cordova

我环顾四周,我can't find the answer以下。我想在跨平台应用程序中运行一些3D内容。我正在使用VS2015 / Tools for Apache Cordova / Three.js / WebGL。当我在桌面(AnyCPU)和iOS远程设备或iOS mac模拟器上调试我的VS2015项目时,我的应用程序创建了一个画布,获取了WebGL上下文,我即将参加比赛。当我使用VS2015在VS Android模拟器中调试我的应用程序时,canvas.getContext失败并且Three.js抛出“创建WebGL上下文时出错”。

我已经使用Lollipop(5.0)下载(到VS2015)一个VS Android模拟器,并以独立模式启动它(不是来自我的Cordova项目)。当我按照这些MSDN Android Emulator Set Up Instructions(用当前版本的Chrome替代默认的VS Emulator浏览器引擎)时,VS Emulator将正确托管并显示互联网上可用的3D WebGL内容。但是当我试图让VS Emulator托管我的Cordova项目时,它无法构建WebGL上下文而且对我不屑一顾。

所以我的问题是:有没有办法配置我的VS2015 Cordova项目在VS Android模拟器中启动和调试,并让模拟器托管我的WebGL 3D内容?或者是否有其他一些技巧来配置VS Android模拟器,以便它将使用支持WebGL的引擎接受和托管我的WebGL项目?难住了。

1 个答案:

答案 0 :(得分:2)

我已成功让我的VS2015 Cordova应用程序在Android模拟器中正确运行,但路径不直。 Morrison Chang非常感谢你指点Crosswalk Project,这是专为解决Android WebView引擎缺陷而设计的,最重要的是,我的应用程序,即股票引擎的WebGL粗略实现。解决方案的第一部分是在我的Cordova应用程序中安装cordova crosswalk plugin。最初,VS2015抛出了描述不当的版本控制部署错误。对此的解决方案只是将我的App版本号从“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上下文时遇到了很多麻烦。我解决了这个问题如下。我的应用程序目前使用THREE 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的默认“属性”值调用.getContext()。除非我将“depth”属性设置为“false”,否则Crosswalk甚至根本不会返回WebGL上下文。但是通过设置depth:false,VS模拟器将以我的应用程序中没有视觉感知的方式显示重叠网格,因为等待它,没有深度缓冲区。所以我至少可以获得一个深度的WebGL上下文:false - 但它很糟糕。最终对我有用的是调用完全没有属性的.getContext,如下所示:

    _gl = _context || _canvas.getContext( 'webgl' ) || _canvas.getContext( 'experimental-webgl' );

这对我有用。我将不得不重写THREE.WebGLRenderer构造函数并将Android平台场景排除在外,但至少我现在有一个可用的WebGL上下文和一个正在运行的应用程序。我希望上面的事情让别人感到痛苦。现在让调试器连接到模拟器....