cut*_*xyz 5 android opengl-es android-ndk opengl-es-2.0
一般来说,它工作正常。但如果我锁定屏幕,并等待 APP_CMD_LOST_FOCUS 发生,然后我解锁屏幕。它变成肖像了!但我发现egl buff仍然是风景设置,并且所有坐标都更大。
我的 AndroidManifest.xml 设置:
<activity android:name="android.app.NativeActivity"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="landscape"
android:clearTaskOnLaunch="true">
<meta-data android:name="android.app.lib_name"
android:value="sunred" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)
我的egl init C++代码
int engine_init_display(OSCONTEXTENGINE* pEngine, const DISPLAY_CONFIG* pConfig)
{
// initialize OpenGL ES and EGL
/*
* Here specify the attributes of the desired configuration.
* Below, we select an EGLConfig with at least 8 bits per color
* component compatible with on-screen windows
*/
const EGLint attribs[] =
{ EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_BLUE_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_RED_SIZE, 8,
EGL_DEPTH_SIZE, 8, EGL_NONE };
EGLint w, h, dummy, format;
EGLint numConfigs;
EGLConfig config;
EGLSurface surface;
EGLContext context;
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
eglInitialize(display, 0, 0);
//eglBindAPI(EGL_OPENGL_ES_API);
/* Here, the application chooses the configuration it desires. In this
* sample, we have a very simplified selection process, where we pick
* the first EGLConfig that matches our criteria */
EGLBoolean bres = eglChooseConfig(display, attribs, &config, 1,
&numConfigs);
if (!bres)
{
__android_log_print(LOGINFO_ERROR, "engine_init_display",
"numConfigs = %d", numConfigs);
}
/* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is
* guaranteed to be accepted by ANativeWindow_setBuffersGeometry().
* As soon as we picked a EGLConfig, we can safely reconfigure the
* ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */
eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);
ANativeWindow_setBuffersGeometry(pEngine->m_app->window, 0, 0, format);
surface = eglCreateWindowSurface(display, config, pEngine->m_app->window,
NULL);
const EGLint ai32ContextAttribs[] =
{ EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
context = eglCreateContext(display, config, NULL,
ai32ContextAttribs);
if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE)
{
LOGW("Unable to eglMakeCurrent");
return P_ERR;
}
eglQuerySurface(display, surface, EGL_WIDTH, &w);
eglQuerySurface(display, surface, EGL_HEIGHT, &h);
pEngine->m_EglDisplay = display;
pEngine->m_EglContext = context;
pEngine->m_EglSurface = surface;
pEngine->m_iWidth = w;
pEngine->m_iHeight = h;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当APP_CMD_INIT_WINDOW发生时,我调用engine_init_display。
有什么方法可以使用 C++ 强制将其设置为横向模式吗?
渲染帧:
工作正常:
pEngine->m_iWidth = 960;
pEngine->m_iHeight = 540;
Run Code Online (Sandbox Code Playgroud)
锁定屏幕 -> APP_CMD_LOST_FOCUS -> 解锁屏幕
pEngine->m_iWidth = 540;
pEngine->m_iHeight = 960;
Run Code Online (Sandbox Code Playgroud)
窗口变为纵向!但egl buff仍然是风景设定,并且所有坐标都更大。
当您收到 APP_CMD_CONFIG_CHANGED 时,尝试执行另一个 init:
case APP_CMD_CONFIG_CHANGED:
if (engine->app->window != NULL && ((engine->width != ANativeWindow_getWidth(app->window)) || (engine->height != ANativeWindow_getHeight(app->window)))) {
engine_handle_cmd(app, APP_CMD_TERM_WINDOW);
engine_handle_cmd(app, APP_CMD_INIT_WINDOW);
}
break;
Run Code Online (Sandbox Code Playgroud)
(来自 NativeActivity 示例代码的变量名称等。)您最终将在唤醒时多次执行 init ;如果这是一个问题,您还可以执行延迟初始化,并使 APP_CMD_CONFIG_CHANGED 和 APP_CMD_INIT_WINDOW 中的配置无效。
这是来自实时代码;在我们的测试中,它在 2.3 及更高版本中大约 99% 的时间都有效(之前未经测试),但从锁定屏幕启动程序然后解锁的极少数时间会导致不调用 CONFIG_CHANGED 的竞争条件我们醒来时发现自己被困在风景中。对于我们的游戏,这不是用户代码路径(从锁定屏幕启动),因此我没有进一步调查。
| 归档时间: |
|
| 查看次数: |
3489 次 |
| 最近记录: |