安卓模拟器支持OpenGL ES 3.0吗?

16

我知道模拟器自SDK工具17和Android 4.0.3推出以来已支持OpenGL ES 2.0,但这是在2012年4月引入的。

安卓模拟器是否支持OpenGL ES 3.0,还是我们仍在等待?
如果不支持,那么其他第三方模拟器/仿真器(例如Genymotion)是否支持OpenGL ES 3.0?


即使模拟器中OpenGL ES 2.0的支持有些有限和有缺陷。但Nexus4支持OpenGL ES 3.0。而且使用二手N4非常便宜。 - keaukraine
那么这就是一个明确的“不是”了吗? - Cypress Frankenfeld
如果你回答了问题,那么这是完全可以接受的答案。 - Cypress Frankenfeld
据我所知,Android模拟器尚不支持OpenGL ES 3.X。然而,许多运行Jelly Bean及以上版本的设备都支持GLES 3.0。一些支持Open GLES 3.0的设备包括Nexus 4、5、7、10、三星Galaxy S4、Note 3等。 - G3M
1
是的,我正在开发这些设备上,所以我知道它们支持这个功能。现在我想在一个只有安卓模拟器而没有物理设备的服务器上运行一些自动化测试。: \ - Cypress Frankenfeld
vulkan: https://dev59.com/f5_ha4cB1Zd3GeqP2q3I - Ciro Santilli OurBigBook.com
3个回答

13

最新的Android模拟器现在支持OpenGL ES 3.0。要使用OpenGL ES 3.0,您的开发计算机需要具有支持Microsoft® Windows®或Linux上OpenGL 3.2或更高版本的主机GPU显卡。

请参见:https://android-developers.googleblog.com/2017/05/android-studio-3-0-canary1.html

OpenGL ES 3.0 in Android Emulator

从NDK中的gles3jni示例应用程序是尝试它的一个不错的选择。

如果出现以下情况:

java.lang.RuntimeException: createContext failed: EGL_BAD_CONFIG

同时尝试在主机上首先运行:

echo "GLESDynamicVersion = on" >> ~/.android/advancedFeatures.ini

开发人员目前正在列出支持的主机GPU,这将覆盖它,参见:https://issuetracker.google.com/issues/68496715


嗨,Jamal,你自己的机器上真的看到这个工作了吗? - aaaidan
是的。如果有任何问题,请告诉我。您也可以在此处提交错误报告:https://issuetracker.google.com/issues/new?component=192727,我们可以进行更深入的研究。 - Jamal Eason
太棒了!现在只缺Vulkan :-) https://dev59.com/f5_ha4cB1Zd3GeqP2q3I - Ciro Santilli OurBigBook.com
我已经添加了设置的ini文件,并期望在AVD中看到一个下拉选项来选择“GLES 3.0”,但是我没有看到。我在Windows 10上安装了Android Studio 3.0.1。 - Cameron Taggart
请注意,Linux和Windows一样都是注册商标。 - jhasse

7
目前,无论是Android模拟器还是系统镜像以及Genymotion都不支持OpenGL ES Version 3.0。
截至我撰写此篇文章时,最新的ARM和x86系统镜像适用于Android 5.1.1(API 22),它们仅支持OpenGL ES Version 2.0而不是3.0。
同样地,Genymotion的Nexus 5 Android 5.1.0 API 22虚拟设备也只支持OpenGL ES Version 2.0。
您可以使用下面的代码来检查未来系统镜像和模拟器的支持情况:
package com.example.opengltest;

import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.ConfigurationInfo;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

public class OpenGLESVersionActivity extends Activity {

    private static final String TAG = "OpenGLESVersionActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final ActivityManager activityManager =
                (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        final ConfigurationInfo configurationInfo =
                activityManager.getDeviceConfigurationInfo();
        String versionText = "Device Supported OpenGL ES Version = " + configurationInfo.getGlEsVersion();
        Toast.makeText(this, versionText, Toast.LENGTH_LONG).show();
        Log.d(TAG, versionText);
    }

}

这种方法比使用glGetString(GLES20.GL_VERSION)更可靠吗?我很好奇两者之间的区别是什么,因为运行glGetString似乎更容易。 - Cypress Frankenfeld
如果您已经拥有有效的OpenGL上下文(例如,如果您正在Renderer的onSurfaceCreated中记录),那么glGetString会更容易。我看到上述方法的唯一好处是它不需要GLSurfaceView和Renderer才能工作。 - Godfrey Duke
Android文档建议使用glGetString: https://developer.android.com/guide/topics/graphics/opengl.html#version-check请注意,在GLSurfaceView上未调用setEGLContextClientVersion时,例如: myGLSurfaceView.setEGLContextClientVersion(2), glGetString可能会返回类似于: "OpenGL ES-CM 1.1" 这对我们的目的可能有点误导性。 这篇文章(虽然它涉及NDK)描述了同样的问题: https://dev59.com/kYPba4cB1Zd3GeqPrmV9 - Godfrey Duke
截至2020年,Genymotion Google Pixel 9(API 28)也显示不支持OpenGL 3.0与图形卡NVIDIA GeForce GTX 860M(通过Geeks3D GPU caps viewer验证支持OpenGL 4.6)。 - Gleichmut

4
我通过运行glGetString(GLES20.GL_VERSION)找到了模拟器支持的版本。看起来,我测试的模拟器不支持OpenGL ES 3.0或更高版本,但我不想假设它们所报告的就是它们实际支持的,因此我不能保证这个结论是最终的。
在我的Nexus 5上: OpenGL ES 3.0 V@104.0 AU@ (GIT@Id3510ff6dc) 使用HAXM的Android模拟器: OpenGL ES 2.0 (2.1 NVIDIA-10.2.7 310.41.25f01) Genymotion模拟器: OpenGL ES 2.0 (2.1 NVIDIA-10.2.7 310.41.25f01)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接