对不起我的英语不好.
我的工作基于https://github.com/harism/android_page_curl/
经过几个小时的研究,我找到了一些解决方案,但不是我在申请中遇到的所有问题.我在使用GLSurfaceView时遇到了一些麻烦.我有一个背景,有一个relativeLayout,一个GLSurfaceView和一个叠加在上面.
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/background"
android:layout_width="match_parent"
android:background="@layout/backgroundrepeat"
android:layout_height="match_parent">
<com.m2y.foxprez.view.CurlView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/openglview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/overlay"
android:layout_width="match_parent"
android:layout_height="match_parent">
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
当我开始我的观点时:
setEGLConfigChooser(8,8,8,8,16,0);
setRenderer(renderer);
getHolder().setFormat(PixelFormat.TRANSLUCENT);
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
setZOrderMediaOverlay(true);
Run Code Online (Sandbox Code Playgroud)
在我的渲染器中:
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glClearColor(0f, 0f, 0f, 0f);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
gl.glHint(GL10.GL_LINE_SMOOTH_HINT, GL10.GL_NICEST);
gl.glHint(GL10.GL_POLYGON_SMOOTH_HINT, GL10.GL_NICEST);
gl.glEnable(GL10.GL_LINE_SMOOTH);
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glDisable(GL10.GL_CULL_FACE);
}
public synchronized void onDrawFrame(GL10 gl) {
gl.glClearColor(0f,0f,0f,0f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glLoadIdentity();
}
Run Code Online (Sandbox Code Playgroud)
经过多次研究,我目前被阻止了这个结果:
使用setZOrderOnTop,我有背景,但叠加层在视图下.
使用setZOrderMediaOverlay,我有叠加层,但背景为黑色.
有人可以帮帮我吗?
我们一直在与SurfaceViews相关的一些问题进行斗争一个多星期,并找不到合适的解决方案.我们在论坛中阅读了有关类似问题的其他问题(甚至是Mixare源代码)但找不到答案,所以我们希望您能以某种方式帮助我们.
场景:我们有
问题:
无论我们如何努力,两个SurfaceViews显然都不能相处得很好.如果我们试图:
setContentView(mCameraPreview);
addContentView(mGLSurfaceView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
addContentView(mInfoView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
Run Code Online (Sandbox Code Playgroud)
(这似乎合乎逻辑),一切都按预期进行,直到我们锁定/解锁手机.之后,GLSurfaceView就会消失(不是InfoView,仍会显示).
相反,如果我们尝试:
setContentView(mGLSurfaceView);
addContentView(mCameraPreview, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
addContentView(mInfoView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
Run Code Online (Sandbox Code Playgroud)
然后问题是GLSurfaceView仅在锁定/解锁后出现,在此之前屏幕显示相机和InfoView.
我们发现,如果我们在显示视图的活动中执行onStart()之后将主线程休眠4.6秒(或更多),则行为与预期一致(即使在锁定/解锁后,也会显示相机,glsurface和info视图).
问题是,我们正在寻找更优雅的解决方案.
在我们看来,问题是相机花费的时间比预期的多Camera.open(),因此添加了相机视图,添加了GLSurfaceView,当相机实际打开时,它会在GLSurfaceView的顶部打开.关于这一点,我们bringToFront()在GLSurfaceView上使用了它,并将其放在信息视图的顶部,但是在锁定/解锁后,相机仍然在其上面打开,只留下一个带有摄像头预览的屏幕.
有任何想法吗?我们如何在它们之上显示SurfaceViews和信息视图?
Android中是否有任何方法可以使用GLSurfaceView显示相机预览,同时在该表面上使用OpenGL效果?特别是加成混合效果.我知道OpenGL可以使用这些效果,我知道相机可以放在SurfaceView上,但是可以将相机放在GLSurfaceView中并将OpenGL混合效果应用于相机预览吗?
我正在尝试实现以下视图:
如果视图是分层的(从下到上):
TextView)我已经使用GLSurfaceView并TextureView沿着这些线路,都没有成功.我可以将不透明度设置为曲面,但整个视图变为半透明,并且setZOrderOnTop必须设置为true,因此没有窗口小部件可以存在于顶部.我也试过rajawali3d,结果相同
这可以实现吗?使用股票查看?还是图书馆?
更新:也试过JPCT-AE,结果相同.
更新2:似乎有一种方法UnityPlayer可以在使用a时使用浮动OpenGL视图SurfaceView,但在较新的SDK中不再是这种情况.
transparency android glsurfaceview opengl-es-2.0 textureview
我正在尝试创建一个显示游戏区域地图的GLSurfaceView.当玩家移动时,游戏活动会调用highlightSpot,而后者又会触发渲染请求.我想重新绘制视图的唯一时间是玩家移动时.
然而,在我当前的实现中,尽管调用setRenderMode(RENDERMODE_WHEN_DIRTY)了我的GLSurfaceView,但它的渲染模式似乎仍然是连续的.为了检查,我在我的onDrawFrame方法中抛出了一个println语句,当我运行我的应用程序时,输出很快就会填满我的logcat,而玩家甚至不会移动一次 - 它显然不符合我的预期.还有什么我需要做的才能在被问到时才进行视图渲染吗?
(此代码的大部分内容来自http://insanitydesign.com/wp/projects/nehe-android-ports/上的教程.为了简洁起见,我省略了我的onDrawFrame,OnSurfaceChanged和onSurfaceCreated方法,因为我是不改变渲染模式或在这些方法中的任何地方请求渲染.如果有人认为它可能是相关的,我也可以发布它们.)
public class SurfaceViewClass extends GLSurfaceView implements Renderer {
public SurfaceViewClass(Context context) {
super(context);
...
this.setRenderer(this);
this.setRenderMode(RENDERMODE_WHEN_DIRTY);
}
public void highlightSpot(int x, int y) {
/* change some variables here */
...
this.requestRender();
}
}
Run Code Online (Sandbox Code Playgroud) 我的应用程序由图像背景组成(从后到前),然后是包含3D对象和前2个按钮的glSurfaceView.我希望GLSurfaceView的背景是透明的,并看到背后的图像.
我尝试了两种解决方案,但没有一种令人满意:
mGLSurfaceView = new GLSurfaceView(mContext);
mGLSurfaceView.setEGLContextClientVersion(2);
mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
mGLSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
mGLSurfaceView.setZOrderOnTop(true);
mGLSurfaceView.setRenderer(mRenderer);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我可以看到背景,但3D对象浮动在所有其他布局的顶部,有时隐藏按钮.
mGLSurfaceView = new GLSurfaceView(mContext);
mGLSurfaceView.setEGLContextClientVersion(2);
mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
mGLSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
mGLSurfaceView.setZOrderMediaOverlay(true);
mGLSurfaceView.setRenderer(mRenderer);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我可以看到按钮,但GLSurfaceView不再透明,我看不到图像背景.我已经解析了所有其他主题,但没有一个给我任何令人满意的答案.
我打算用可缩放的用户界面编写一个2D绘图应用程序.使用该应用程序,用户应该能够转换(平移和缩放)绘制的路径(当然还有UI).我假设同时会有多达500个路径.现在,我想知道从哪个视图开始(View,SurfaceView或GLSurfaceView)以提供可接受的性能.我阅读了几篇帖子[1-6],包括曾经在Android上的开发者指南,我仍然不能100%确定使用哪个视图.
根据Google I/O 2009(http://youtu.be/U4Bk5rmIpic?t=45m10s)上的演示文稿和自己的体验,在处理100多个路径时,canvas(View和SurfaceView)似乎没有足够快的性能.
有没有人看到使用画布实现应用程序的可能性或OpenGL的方式去?
[1] Android:在SurfaceView和OpenGL之间做出决定(GLSurfaceView)
[2] SurfaceView或GLSurfaceview?
[4] http://pierrchen.blogspot.jp/2014/03/anroid-graphics-surfaceview-all-you.html
我GLSurfaceView在我的应用程序中使用,最近在调整它的大小时发现了一个奇怪的行为。最后,我找出了导致我的应用程序出现问题的原因,并创建了一个简单的示例来重现它。
假设我们有一个FrameLayout包含 simple GLSurfaceView. 在每次点击时,GLSurfaceView我们使用以下代码更改其高度
CyclicIterator<Integer> iterator = CyclicIterator.from(200, 300, 500);
glView.setOnClickListener(v -> {
glView.getLayoutParams().height = sizeIterator.next();
glView.requestLayout();
});
Run Code Online (Sandbox Code Playgroud)
一切顺利,直到我们在后台快速移动应用程序,然后使用“概览”按钮(类似于“猴子测试”)返回到前台。如果我们足够快地在背景/前景之间切换并再次调整视图大小,我们最终可能会遇到以下情况:表面内出现一个“死”区域,直到我们再次停止/开始活动它才会更新。
我glGetError在每次 gl 调用后都检查过,没有收到任何错误。同时我收到了正确的width和height在onSurfaceChanged回调。
我尝试重现此行为并在 Nexus 5X 和小米红米 6A 上获得相同的结果。
GLSurfaceView 配置为:
glView.setEGLContextClientVersion(2);
glView.setRenderer(new Renderer() {
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);
}
@Override …Run Code Online (Sandbox Code Playgroud) 我正试图描绘我的渲染器,我看到一些奇怪的剖析行为,我无法解释.
我正在使用glSurfaceView,我已设置连续渲染.
这就是我onDrawFrame()的结构
public void onDrawFrame(GL10 unused) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
executeAllDrawCommands();
}
Run Code Online (Sandbox Code Playgroud)
这在轻负载下表现得很慢,所以我创建了一个计时器类并开始对其进行分析.我看到的东西让我很惊讶.
我对onDrawFrame方法进行了一些探测,如下所示:
public void onDrawFrame(GL10 unused) {
swapTimer.end();
clearTimer.start();
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
clearTimer.end();
drawTimer.start();
executeAllDrawCommands();
drawTimer.end();
swapTimer.start();
}
Run Code Online (Sandbox Code Playgroud)
clearTimer测量调用glClear所需的时间,drawTimer测量运行所有绘制调用swapTimer所需的时间,并测量onDrawFrame退出和返回时的时间(调用eglSwapBuffers所需的时间).
当我跑一个非常轻载的场景时,我得到了一些我无法解释的奇怪数字:
swapTimer : 20ms (average)
clearTimer : 11ms (average)
drawTimer : 2ms (average)
Run Code Online (Sandbox Code Playgroud)
我预计交换时间有点大,因为我相信设备在~30fps时有vsync强制启用,但我不知道为什么实际的"清除"调用阻塞了11毫秒?我以为它应该发出一个异步命令并返回?
当我绘制一个更繁忙的场景时,数字会发生很大变化:
swapTimer : 2ms (average)
clearTimer : 0ms (average)
drawTimer : 44ms (average)
Run Code Online (Sandbox Code Playgroud)
在这个场景中,我的绘制调用花了很多时间,看起来它隐藏了很多vsync周期,并且清除调用上的块完全消失了.
有什么解释为什么glClear在我轻载的场景上阻挡了?
链接到我的'Timer'类源代码,以防有人怀疑我的测量技术:http://pastebin.com/bhXt368W
对于我的游戏,我正在考虑在我GLSurfaceView使用RelativeLayout的基础上绘制UI元素(TextView用于显示已用时间,按钮用于暂停/重新开始游戏)...
直到现在,我自己直接将所有UI元素绘制到surfaceView,但考虑到Android UI提供的广泛选项(如更改字体和颜色的字体),我决定使用它.
问题:
GLSurfaceView或者直接绘制所有UI内容是否更好GLSurfaceView?TextView通过使用runOnUiThread()方法定期更新UI元素(Say )的内容(每16毫秒)...这是不是很糟糕?这是测试java代码,我用它来设置RelativeLayout ... glView是GLSurfaceView实例.
rl = new RelativeLayout(this);
rl.addView(glView);
tv = new TextView(this);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
lp.addRule(RelativeLayout.ALIGN_TOP);
tv.setLayoutParams(lp);
tv.setText("FPS: 0");
tv.setBackgroundColor(0x4060ff70);
rl.addView(tv);
setContentView(rl);
Run Code Online (Sandbox Code Playgroud) android ×10
glsurfaceview ×10
opengl-es ×7
surfaceview ×2
3d ×1
android-view ×1
camera ×1
lifecycle ×1
overlay ×1
renderer ×1
textureview ×1
transparency ×1