【问题标题】:Deploy WebGL applications as native iOS or Android applications?将 WebGL 应用程序部署为原生 iOS 或 Android 应用程序?
【发布时间】:2011-06-11 02:56:40
【问题描述】:

有谁知道可以将 WebGL 应用程序部署为原生 iOS 或 Android 应用程序的方法吗?商业中间件是可以接受的,但最好是开放项目。谢谢。

【问题讨论】:

  • 我真的很想启用 WebGL + PhoneGap。那会很酷。我认为可以采用 Android 当前的 WebView 代码并将 WebGL 添加到其中,并创建一个替代 WebGL WebView 以与 PhoneGap 一起使用。不过我不确定 iPhone,因为不幸的是它们不是开源的。 :/ ... 在他们决定包含 WebGL 之前只是时间问题(这将是迟早的,以免减少他们 iStore 中应用程序的销售)。

标签: android ios mobile webgl


【解决方案1】:

作为 Joris 答案的扩展(似乎基于 work of Nathan de Vries),以下是我在 iOS 5.0 SDK 中启用 WebGL 所需的代码:

视图控制器实现顶部附近的某处:

@interface UIWebView()
- (void)_setWebGLEnabled:(BOOL)newValue;
@end

以编程方式创建 UIWebView 并启用 WebGL:

UIWebView *webDetailView = [[UIWebView alloc] initWithFrame:mainScreenFrame];

id webDocumentView = [webDetailView performSelector:@selector(_browserView)];
id backingWebView = [webDocumentView performSelector:@selector(webView)];
[backingWebView _setWebGLEnabled:YES];

created a sample application 演示了在 iPhone / iPad 全屏 UIWebView 中运行的 WebGL,使用 WebGL 暂存器站点 http://glsl.heroku.com 作为目标。请注意,其中一些示例甚至会使 iPad 2 停止运行,从而可能导致硬重启。那里的性能似乎表明了为什么 WebGL 在移动 WebKit 中仍处于官方不受支持的状态。

当然,如前所述,这不能保证在未来的 iOS 版本上有效,并且会导致您的应用程序被 App Store 拒绝。这仅对业余爱好和内部测试真正有用。

在我的 iPad 2 上运行的 WebGL 示例:

【讨论】:

  • 这似乎根本不起作用。该项目根本无法在我的设备上运行。
  • @ItayLevin - 这适用于较旧的 iOS 版本。自 iOS 8 以来,UIWebView 已正式支持 WebGL(尽管您可能希望使用 WKWebView 来提高性能)。这是一个 hack,可以让它在旧的 iOS 版本上运行,以防人们需要。
【解决方案2】:

iOS 上的 WebKit 实际上支持 WebGL,从 4.x 开始(不确定哪个 .x 版本)。它在 iAd 框架使用的 webview 中启用,WebKit 的所有其他用途(Safari 和 UIWebView)都禁用了 WebGL。

可以使用私有 API 启用 WebGL(这不会通过提交过程)。在您的 webview 子类中:

- (void)setWebGLEnabled:(BOOL)enableWebGL {
    UIWebDocumentView* webDocumentView = [self _browserView];
    WebView* backingWebView = [webDocumentView webView];
    [backingWebView _setWebGLEnabled:enableWebGL];
}

(via)

这至少可以让您开始在 iOS 上尝试 WebGL。

不确定 Android 是否支持 WebGL。 Android 追踪器中的 recent comments on the issue 表明它尚不可用。

(移动)浏览器中的 WebGL 支持表:When can I use WebGL

目前最好的方法似乎是将您自己的支持 WebGL 的 WebKit 版本包含在适用于 iOS 和 Android 的应用程序包装器中。

【讨论】:

  • WebGL 似乎可以在 Android 设备(至少部分)上与 Firefox 移动浏览器一起运行:learningwebgl.com/blog/?p=4379
  • 您可能会使用一些 KVC 来简化此操作。 ;)
【解决方案3】:

由于 iOS 版本的 WebKit 本身不支持 WebGL,我认为您有两种选择:

  • 自己在 WebView 的 JavaScript 上下文中实现 WebGL API,方法是通过 iframe RPC 左右将调用转发到本机 OpenGL。不幸的是,在 iOS 上没有一种从 JavaScript 调用(Objective-)C 函数的干净方法。性能可能是个问题。

  • AOT-在第三方运行时编译或解释 JavaScript,然后从那里实现 WebGL。 iOS 上不允许使用 JIT 编译器,因此 V8 之类的东西将无法工作。据我所知,Appcelerator Titanium 静态编译 JavaScript,并且还有一个解释器。你可以使用它,但你仍然需要自己实现 WebGL 胶水。

我不知道任何适用于 iOS 的现有 WebGL 桥接器,因此我认为您需要自己编写或找人为您编写。一个可能无法克服的问题是,如果您使用 WebGL 以外的任何东西来显示内容 - 例如。 HTML、2D 等。将 WebView 显示与 OpenGL 帧缓冲区结合起来会相当棘手。

我对Android不太了解,但考虑到那里的规则比较宽松,可能可以在那里嵌入兼容WebGL的浏览器。

【讨论】:

  • JIT真的被禁了吗?我对此表示怀疑?我认为 Apple 只是想阻止使用开放式脚本在其平台之上建立一个强大的开放平台(任何人都可以开发很酷的 3D 东西等,而无需 Apple 开发者许可)。
  • 是的,JIT被技术手段封杀了。您不能通过mprotect()mmap() 将内存页标记为PROT_EXEC。 Safari 使用了一个特殊的 MAP_JIT 标志,但这是由沙盒权利启用的,Apple 不允许在 3rd 方应用程序上使用该标志。所以这样做的结果是你不能执行运行时生成的代码。请注意,这与不允许解释从网络下载的代码的规则不同。 (这只是 App Store 规则,操作系统无法强制执行)
  • 感谢您的认可。但是不是有什么JIT是不被阻塞的吗?
  • 在运行时生成可执行机器代码是普遍接受的定义 JIT 编译,并且受到 mmap() 限制。我不知道您可能会想到什么其他“JIT”。
【解决方案4】:

我认为没有任何简单的转换器工具。您可能需要使用您的 WebGL 代码库并在 OpenGL 中为这两个平台重写,以创建本机应用程序。

【讨论】:

  • 这与他的要求相反。这也很明显!关键是不要使用 OpenGL 而使用 WebGL,因为那样您就可以同时制作网站和移动应用程序!
  • 是的,但我是说没有这样的工具可以做到这一点。你最好在本地编码。
  • 他确实提到了“中间件”是可以的。这样的中间件称为PhoneGap。唯一的事情是您必须弄清楚如何使用 webkit 浏览器并在 Android 和 iPhone 上为其启用 webGL。然后,您可以使用 PhoneGap 编写您想要的所有 javascript-to-native 代码,同时使用视频加速。如果我从学校获得空闲时间,我会考虑这样做。
  • 是否有机会在 android 应用程序中嵌入 chrome beta 视图以呈现 webgl,或者至少通过 chrome beta 打开?
【解决方案5】:

它还没有准备好,但 ForPlay 或许能够通过 GWT 充当 Android 和 WebGL 的通用开发平台。

【讨论】:

  • 能给个链接吗?
【解决方案6】:

将 WebKit 和应用程序的资源(.js、纹理等)捆绑到 iOS 或 Android 应用程序中听起来并不难。我假设由于 Google 和 Apple 是 WebKit 项目的主要贡献者,所有必需的支持(多点触控和其他东西)都已经存在。

PS:许多 iOS 应用程序使用解释型 Javascript 或 Lua。这些规则是为了防止您的应用执行第 3 方代码(尤其是来自互联网),而不是您在自己的应用中捆绑的代码。

编辑:澄清一下,我认为您需要使用 webkit(从源代码构建)实现自己的 Web 视图,以便使用 WebGL通过 Apple 的筛选过程,因为在 Apple 提供的 Web 视图中激活 WebGL 会导致您的应用被拒绝。

【讨论】:

    【解决方案7】:

    有几个选项可以部署原生 WebGL 应用。 EjectaGL 是一个很棒的 WebGL 实现,但有点难以掌握 (http://codehum.com/stuff/ejectagl/)。

    另一个选择是 Ludei,它最近宣布在 iOS 和 Android 上支持 WebGL。它更易于使用并支持通过 WebGL 在 2D 和 3D 中加速 HTML5 画布。它还提供了一种使用 IAP、广告和大量扩展程序通过应用获利的方法。使用 CocoonJS Launcher 应用程序及其云编译器进行测试要容易得多。

    www.ludei.com http://blog.ludei.com/webgl-demos-arrive-to-google-play-store/

    【讨论】:

      【解决方案8】:

      试试Phonegap。它允许您使用操作系统上的标准 Webkit 安装来构建“本机”HTML+CSS+JS 应用程序。它提供了一个 javascript 到本机的桥梁,让您可以完成纯 web 应用程序中不可能完成的事情。

      【讨论】:

      • Phonegap 不支持 WebGL,因为它使用平台的 Webkit——看到有人在 Maemo 版本中启用了 WebGL,但似乎他们没有任何计划切换到他们自己的用于 WebGL 的 Webkit .
      • 我认为它很快就会上市!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      • 2015-11-08
      • 1970-01-01
      相关资源
      最近更新 更多