我在CompoundView中使用GLSurfaceView来实现精美的导航.目前,GLSurfaceView是在选择子部分时创建的,而不是在开始时创建的.
我的问题是,当第一次创建GLSurfaceView时,屏幕会瞬间闪烁.选择不同的子部分时,它不会闪烁; 在这种情况下,当前的GLSurfaceView被丢弃,另一个被创建.
当然,这非常令人恼火,特别是因为它在非常轻的主题上闪烁着黑色.我想在大多数情况下它都没关系,因为GLSurfaceViews通常是全屏的并且使用寿命很长,但在这种情况下它是一个传统的Android应用程序,它可以一直打开和关闭活动.
有没有办法规避这个?就像在创建活动时预先初始化OpenGl一样(我假设闪烁在那里不会那么烦人)?
我有一个OpenGL ES2.0应用程序正在运行各种Android版本从2.2到4.1的设备.但是有人告诉我,当在Android 4.2的Nexus 7上运行时,应用程序中的3D图形都是黑色的.操作栏和对话框工作正常.我已经尝试在带有Intel Atom处理器的仿真Nexus 7上运行HAX和GPU,运行4.2.2并且运行正常.我本来希望运行ARM映像,但似乎不包括Open GL ES2.0
有没有人能够深入了解Nexus 7上可能导致此问题的原因以及如何解决这个问题?
一种可能性是当前App版本的目标API级别设置为15,而4.2.2是级别17.这可能是一个问题吗?它虽然在模拟器上运行正常.
下面是我用来在渲染器onSurfaceCreated()中设置纹理的代码,以防任何帮助.
/**
* Sets up texturing for the object
*/
private void setupTextures(String[] texFiles) {
// create new texture ids if object has them
// number of textures
mTextureIDs = new int[texFiles.length];
GLES20.glGenTextures(texFiles.length, mTextureIDs, 0);
for(int i = 0; i < texFiles.length; i++) {
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureIDs[i]);
// parameters
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,
GLES20.GL_NEAREST);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_MAG_FILTER,
GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,
GLES20.GL_REPEAT);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,
GLES20.GL_REPEAT);
int ID = mContext.getResources().getIdentifier( texFiles[i], "raw", "com.antonymsoft.slidixcube" );
InputStream …Run Code Online (Sandbox Code Playgroud) 我有一个复杂的应用程序,它创建多个Bitmap对象并使用它们来创建BitmapDrawables.我知道这可能是一个难以回答的问题,但任何指导我指向正确方向的帮助都会非常感激.我已经对内存分配进行了测试,并且主要是空手而归....关于可能导致这种情况的任何想法?
日志:
04-29 12:48:00.442: E/BufferQueue(177): [com.example.app/com.example.app.Activity_One] queueBuffer: fence is NULL
04-29 12:48:00.442: E/Surface(2154): queueBuffer: error queuing buffer to SurfaceTexture, -22
04-29 12:48:00.442: W/Adreno-EGLSUB(2154): <SwapBuffers:1374>: failed to queueBuffer
04-29 12:48:00.442: W/Adreno-EGL(2154): <qeglDrvAPI_eglSwapBuffers:3654>: EGL_BAD_SURFACE
04-29 12:48:04.486: W/Adreno-EGLSUB(2154): <DequeueBuffer:606>: dequeue native buffer fail: Unknown error 2147483646, buffer=0x0, handle=0x0
04-29 12:48:04.486: E/BufferQueue(177): [com.example.app/com.example.app.Activity_One] dequeueBuffer: can't dequeue multiple buffers without setting the buffer count
04-29 12:48:04.486: W/Adreno-EGLSUB(2154): <DequeueBuffer:606>: dequeue native buffer fail: Invalid argument, buffer=0x0, handle=0x0
04-29 12:48:04.486: W/Adreno-ES20(2154): <gl2_surface_swap:43>: GL_OUT_OF_MEMORY
04-29 12:48:04.486: W/Adreno-EGL(2154): <qeglDrvAPI_eglSwapBuffers:3597>: …Run Code Online (Sandbox Code Playgroud) 我正在开发一款在相机视图上执行OpenCL/OpenGL互操作的Android应用.我正在使用GLSurfaceView.Renderer.当然,从onSurfaceCreated调用创建和初始化OpenCL运行环境(来自OpenGL)的代码,并且每个预览框架的实际处理都在onDrawFrame中进行.
一切顺利,除非我完成,我想清理OpenCL的东西.理想情况下,onSurfaceDestroyed方法是清理的最佳位置,但GLSurfaceView.Renderer中没有这样的方法.所以清理代码无处可去,我的应用程序可能存在内存泄漏.
这是我的问题:
为什么GLSurfaceView.Renderer中没有onSurfaceDestroyed方法?有onSurfaceCreated和onSurfaceChanged.人们会期望onSurfaceDestroyed在那里.
鉴于GLSurfaceView.Renderer中不存在onSurfaceDestroyed,我的清理代码应该去哪里,为什么?
最近我正在通过grafika(感谢fadden)学习安卓摄像头和OpenglES.它在大多数设备上都很好,但我遇到了一些设备中的错误,特别是MTK设备(如MT6580,MT8163 ......).
例如,当"CameraCaptureActivity"在MTK中运行时.我收到此错误:
java.lang.NullPointerException:尝试在空对象引用上调用虚方法'void android.hardware.Camera.setPreviewTexture(android.graphics.SurfaceTexture)'
所以我将"handleSetSurfaceTexture"函数更改为:
private void handleSetSurfaceTexture(SurfaceTexture st) {
if(mCamera == null)
{
Log.e(TAG, "mCamera return null");
return;
}
st.setOnFrameAvailableListener(this);
try {
mCamera.setPreviewTexture(st);
} catch (Exception ioe) {
Log.e(TAG, "camera failed handleSetSurfaceTexture");
throw new RuntimeException(ioe);
}
mCamera.startPreview();
}
Run Code Online (Sandbox Code Playgroud)
然后错误更改为:
java.lang.RuntimeException:java.io.IOException:setPreviewTexture在jp.co.cyberagent.android.gpuimage.grafika.CameraCaptureActivity.handleSetSurfaceTexture(CameraCaptureActivity.java:1150)失败
我读了许多其他相机应用程序源代码,我想可能在MTK设备中有Camera和SurfaceRender的同步问题.所以我改变了这样的代码:
private void waitUntilSetup()
{
long l = System.currentTimeMillis();
while ((getMaxTextureSize() == 0) && (System.currentTimeMillis() - l < 3000L))
{
SystemClock.sleep(100L);
}
Log.e(TAG,"getMaxTextureSize() = " + getMaxTextureSize());
}
private int getMaxTextureSize() {
int[] maxTextureSize = new int[1];
GLES20.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, …Run Code Online (Sandbox Code Playgroud) 我正在使用此代码对GlSurfaceView上的位图赋予多重效果. 应用效果,图像上,使用效果
现在,我想保存位图.他们给出了保存位图的代码,但是,整个GlSurfaceView将被保存为位图图像.相反,我想只保存位图区域以保存为图像.
有一种方法可以获取像素并从中制作位图并制作图像.例如:
public Bitmap takeScreenshot(GL10 mGL) {
final int mWidth = mEffectView.getWidth();
final int mHeight = mEffectView.getHeight();
IntBuffer ib = IntBuffer.allocate(mWidth * mHeight);
IntBuffer ibt = IntBuffer.allocate(mWidth * mHeight);
mGL.glReadPixels(0, 0, mWidth, mHeight, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, ib);
// Convert upside down mirror-reversed image to right-side up normal
// image.
for (int i = 0; i < mHeight; i++) {
for (int j = 0; j < mWidth; j++) {
ibt.put((mHeight - i - 1) * mWidth + j, ib.get(i …Run Code Online (Sandbox Code Playgroud) 我有一个简单的Android应用程序,使用我们的OpenGL渲染SDK将数据呈现给Android GLSurfaceView.由于我们提供和SDK供其他人使用,我们需要支持GLSurfaceViews的所有用例.目前,我们需要能够在重新创建所有Android视图并保持OpenGL上下文活动的同时旋转设备.这源于客户在横向和横向模式下需要不同的布局.
解决这个问题的正常方法是:
1.添加android:configChanges="orientation|screenSize"到您的活动中AndroidManifest.xml,您将没事.
这将不会在这种情况下,作为工作这不会重新上旋转的意见.因此,通过这样做,我们不能在横向和横向模式中具有不同的布局.
2.呼叫GLSurfaceView.onPause()和GLSurfaceView.onResume()从Activity.
虽然这被认为是一种很好的做法,但在这个用例中还不够,因为在执行此操作时会破坏OpenGL上下文.请注意,我们仍然这样做,它只是没有解决我们的问题.
3.使用a EGLContextFactory在旋转时保留OpenGL上下文.
这是可能的和有用的,例如在该答案中所描述的.感觉就像一个黑客,但它绝对有效.这个想法只是EGLContext在你没有一个时创建一个并重用你拥有的那个.
使用此hack时遇到的主要问题是渲染线程在GLSurfaceView分离并重新连接到视图层次结构时被销毁并重新创建.这似乎是通过查看GLSurfaceView实现来设计的.
在我们的SDK中,我们有一些线程本地存储连接到线程,所以突然得到一个新的渲染线程是不太可取的.我们可能会在渲染线程发生变化时更改某些状态,但我们想调查是否有更好的方法来执行此操作.
所以我的问题是:
答:使用EGLContextFactory"正确"的方式能够在旋转时手动保存OpenGL上下文吗?
B.有没有办法在旋转时不破坏和重新创建渲染线程(不修改源代码)?
C.在保持OpenGL上下文和渲染线程的同时,是否有更好/更简单的替代方法来实现视图销毁/重建的轮换?
额外信息:
setPreserveEGLContextOnPause(true);.拜托,有人可以提供在 GLSurfaceView 中使用 CameraX 库的好例子,找不到任何信息。
我使用GLSurfaceView通过回调提供矩形的 SDK 。
我希望能够以圆形布局呈现此视图。(即)我想在圆形视图上显示视图
GLSurfaceView过ImageViewGLSurfaceView了VideoView。我试过下面的代码来制作圆圈 GLSurfaceView
public class SampleGLView extends GLSurfaceView implements View.OnTouchListener {
private Path clippingPath;
public SampleGLView(Context context) {
this(context, null);
}
public SampleGLView(Context context, AttributeSet attrs) {
super(context, attrs);
setOnTouchListener(this);
}
private TouchListener touchListener;
@Override
public boolean onTouch(View v, MotionEvent event) {
final int actionMasked = event.getActionMasked();
if (actionMasked != MotionEvent.ACTION_DOWN) {
return false;
}
if (touchListener != null) { …Run Code Online (Sandbox Code Playgroud) 有没有一种好方法可以View在a之上绘制标准Android对象GLSurfaceView并同步两层之间的移动?
我的布局看起来像
\n<FrameLayout>\n <RelativeLayout>\n <MyCustomGLSurfaceView>\n</FrameLayout>\nRun Code Online (Sandbox Code Playgroud)\n它MyCustomGLSurfaceView实现了一个摄像头,当用户适当地触摸屏幕时,该摄像头就会移动。
在渲染器中的回调结束时,onDrawFrame()我调用回调来告诉RelativeLayout相机已移动,并且它应该根据需要更新任何子视图的位置。
为了尝试同步两个层,我正在执行以下操作:
\nrenderMode = RENDERMODE_WHEN_DIRTY范围内MyCustomGLSurfaceViewMyCustomGLSurfaceView实现Choreographer.FrameCallback并在doFrame(frameTimeNanos: Long)方法调用中requestRender()RelativeLayout根据需要更新 it\xe2\x80\x99s 子视图的位置。MyCustomGLSurfaceView看起来 AndroidView对象直到下一帧才在屏幕上更新,而 则MyCustomGLSurfaceView立即更新。其理论是,通过侦听Choreographer回调,渲染MyCustomGLSurfaceView会在应用程序重新绘制标准 UI 元素的同时进行。
这似乎工作得相当好,但 Android 对象层中存在明显的卡顿View。另外,通过设置边距来定位 Android 层中的元素View会出现一些奇怪的行为(视图在离开屏幕时会被破坏,并且并不总是重新出现,有时甚至根本停止更新)。我尝试使用它们来定位它们translationX …
android ×10
glsurfaceview ×10
opengl-es ×5
surfaceview ×2
bitmap ×1
grafika ×1
java ×1
opencl ×1
textures ×1
textureview ×1