标签: opengl-es

iOS游戏和运行循环管理

首先,我的问题是:你如何管理你的iOS Run-Loop?

接下来我的理由是:我一直在研究各种原型(v.早期开发),并发现了许多令人困惑的问题.

  • 首先,输入问题和运行循环让我尝试以下方法:
    • 当使用最推荐的系统(CADisplayLink)时,我注意到一旦CPU负载导致缓冲区翻转(presentRenderBuffer)必须等待一帧,某些触摸输入就会被丢弃.这只发生在设备而不是模拟器中(烦人的 - 这似乎与等待主线程上的vsync阻塞以及应用程序运行循环过程触摸输入和吃消息的方式有关)
    • 当使用下一个最推荐的系统(NSTimer)时,我注意到一旦CPU负载达到模拟器中的某个点而不是设备中的某个点(也令人讨厌),某些触摸输入就会被丢弃.NSTimer在我的更新发布时也会导致精度降低
    • 当使用推荐最少的系统(在内部使用由mach_absolute_time构建的高精度定时器管理自己的线程中运行运行循环时,我的所有触摸输入问题都会消失,但是我的ASSERT代码现在陷入了错误的线程,只有我睡着了跟随软件中断.(我的断言代码类似于http://iphone.m20.nl/wp/?p=1)我真的很喜欢我的断言代码陷阱导致问题,所以这个解决方案是对我来说不太适合:更难调试.
  • 第二,失去的时间:
    • 在调查系统时,我发现无论帧率如何(奇怪的是,但我认为统计上它仍然有意义w/vsync)我在vsync上等待大约22%的时间.我已经通过移动glFlush/glFinish并通过玩我多久经常进行presentRenderBuffer调用来证实这一点.这是我喜欢处理AI等关键时刻,而不是简单地停止阻塞gl调用.我能想到的唯一方法就是将渲染转移到它自己的线程中,但我不确定是否有理由开始在单处理器设备上重新构建多线程.

那么有没有人围绕这些问题找到了灵丹妙药?有没有人在这个平台上有一个杀手运行循环架构?目前看起来我必须选择较少的邪恶.

iphone optimization opengl-es runloop ios

28
推荐指数
1
解决办法
8515
查看次数

如何在GL_STREAM_DRAW或GL_DYNAMIC_DRAW之间进行选择?

我正在使用OpenGL ES 2.0,但我认为它也与非ES有关:如何知道在创建VBO时选择什么"用法"?

这个特殊的VBO将在完全更新之前使用1到4次,我不确定是否必须选择GL_STREAM_DRAW或GL_DYNAMIC_DRAW.

opengl-es vbo

27
推荐指数
4
解决办法
3万
查看次数

Genymotion模拟器在Kubuntu 13.10 64位上给出Open GL错误

我一直在Kubuntu上使用Genymotion Android模拟器,但最近我遇到了阻止它工作的Open GL错误.有趣的是,我有一个较旧的Galaxy Nexus 4.2.2模拟器图像工作正常(虽然它抱怨我启动时版本不匹配),但如果我尝试创建任何较新的图像,模拟器无法启动.当我检查logcat时,我看到以下错误:

I/SurfaceFlinger(  459): SurfaceFlinger's main thread ready to run. Initializing graphics H/W...
D/libEGL  (  459): loaded /system/lib/egl/libEGL_emulation.so
D/        (  459): HostConnection::get() New Host Connection established 0xb890b898, tid 460
D/libEGL  (  459): loaded /system/lib/egl/libGLESv1_CM_emulation.so
D/libEGL  (  459): loaded /system/lib/egl/libGLESv2_emulation.so
E/setdpi  (  463): Setting DPI to 213
E/SurfaceFlinger(  459): hwcomposer module not found
W/SurfaceFlinger(  459): getting VSYNC period from fb HAL: 16666666
W/SurfaceFlinger(  459): no suitable EGLConfig found, trying without EGL_FRAMEBUFFER_TARGET_ANDROID
W/SurfaceFlinger(  459): no suitable EGLConfig found, trying …
Run Code Online (Sandbox Code Playgroud)

ubuntu android opengl-es android-emulator genymotion

27
推荐指数
1
解决办法
2482
查看次数

在OpenGL ES 2.0中透视正确的梯形纹理

我绘制了一个带纹理的梯形,但结果并没有像我原先想象的那样出现.

不是出现在单个完整的四边形上,而是在对角线处出现不连续性,其中两个包括三角形相交.

此图显示了此问题:
插图演示源纹理(方格图案),预期结果和实际(不正确)结果
(注意:最后一张图片不是100%忠实的表示,但它应该得到重点.)

使用GL_TRIANGLE_STRIPOpenGL ES 2.0(在iPhone上)绘制梯形.它被完全面向屏幕绘制,并且没有被倾斜(即,这不是您正在看到的3D草图!)

我已经明白我需要执行"透视校正",大概是在我的顶点和/或片段着色器中,但我不清楚如何做到这一点.

我的代码包含一些简单的模型/视图/投影矩阵数学,但它们当前都没有影响我的纹理坐标值.更新:根据用户infact的评论,前一个语句不正确.

此外,我在ES 2.0规范中找到了这个小窍门,但不明白它意味着什么:

不支持PERSPECTIVE CORRECTION HINT,因为OpenGL ES 2.0要求对所有属性进行透视插值.

如何正确绘制纹理?


编辑:添加以下代码:

// Vertex shader
attribute vec4 position;
attribute vec2 textureCoordinate;

varying vec2 texCoord;

uniform mat4 modelViewProjectionMatrix;

void main()
{
    gl_Position = modelViewProjectionMatrix * position;
    texCoord = textureCoordinate;
}
Run Code Online (Sandbox Code Playgroud)
// Fragment shader
uniform sampler2D texture;
varying mediump vec2 texCoord;

void main()
{
    gl_FragColor = texture2D(texture, texCoord);
}
Run Code Online (Sandbox Code Playgroud)
// Update and Drawing code (uses GLKit helpers from iOS)

- …
Run Code Online (Sandbox Code Playgroud)

opengl-es opengl-es-2.0

26
推荐指数
1
解决办法
1万
查看次数

Tiler Utilization统计数据在iPhone OpenGL ES仪器中意味着什么?

我一直试图执行一些OpenGL ES性能优化,试图增加我能够在我的iPhone应用程序中呈现的每秒三角形数量,但我已经碰到了一堵砖墙.我已经尝试将我的OpenGL ES数据类型从固定点转换为浮点(根据Apple的推荐),交错我的顶点缓冲区对象,并最大限度地减少绘图状态的变化,但这些变化都没有对渲染速度产生影响.无论如何,我似乎无法在运行3.0操作系统的iPhone 3G上将我的应用程序推到320,000三角形以上.根据这个基准测试,我应该能够使用我正在使用的平滑阴影在这个硬件上达到687,000个三角形/秒.

在我的测试中,当我在Instruments中运行OpenGL ES性能工具对运行的设备时,我看到统计"Tiler利用率"在渲染我的基准测试时达到接近100%,但"渲染器利用率"仅达到约30 %.这可能提供了关于显示过程中瓶颈是什么的线索,但我不知道这些值是什么意思,我没有找到任何关于它们的文档.有人对iPhone OpenGL ES仪器中的这个和其他统计数据有什么好的描述吗?我知道iPhone 3G中的PowerVR MBX Lite是基于图块的延迟渲染器,但我不确定渲染器和Tiler在该架构中的区别.

如果它有任何帮助,如果您想自己下载和测试,可以使用此应用程序的(BSD许可的)源代码.在当前配置中,每次加载新的分子结构并将三角形输出到控制台时,它会启动一个小基准.

iphone opengl-es instruments

25
推荐指数
2
解决办法
7727
查看次数

Android OpenGL ES透明背景

我正在构建一个利用OpenGL的Android应用程序.就目前而言,它的背景GLSurfaceView是由我的代码动态生成的,并作为纹理加载并绘制glDrawTexfOES.这是"OK",但我可以简单地更加流畅显示图像自身的表面(无OpenGL的).有什么方法可以让GLSurfaceView透明的背景?我听说过一些传言说这可以做到setEGLConfigChooser,但我还没有找到任何确认.最后,我想带一个面我画并把GLSurfaceView在它达到一个层次分明的效果.

我知道这是一个棘手的,很可能是不可行的,但任何输入都是值得赞赏的.提前致谢.

android background opengl-es transparent

25
推荐指数
4
解决办法
2万
查看次数

EGL和OpenGL之间有什么关系?

我正在写一个实现开放式VGOpenGL的| ES,这两者取决于Khronos的EGL API,据说是为了便于携带,我猜.

出于乐趣和教育原因,我正在OpenGL ES上编写一个OpenVG实现 - 我没有做过很多渲染工作,我想了解更多有关开放API和实践明确标准的实践(更容易看看我是否得到了正确的结果).

据我了解,EGL提供了一个标准API,用于检索绘图上下文(或者它正确调用的内容),而不是使用多个OS提供的API之一(GLX,WGL等)

在此输入图像描述

我很难相信Khronos会经历这样的努力并将标准OpenGL从循环中移开但事实是,我还没有发现OpenGL(真正的交易)如何或者是否与EGL接口或者它是否只是OpenGL ES.如果OpenGL ES可以使用EGL的绘图上下文,标准OpenGL是否也可以使用?

我对这一切都很陌生,这就是为什么我很兴奋,但我正在做的真正项目是一个Go小部件工具包,它利用OpenVG进行绘图操作,并尽可能使用硬件加速.

如果OpenVG,OpenGL和OpenGL ES依赖于EGL,我认为我的问题可以用"是"或"否"来回答.请记住,我昨晚首先进入了这个主题.

OpenGL使用或依赖于EGL吗?


关闭主题,但没有EGL标记.应该有吗?

opengl opengl-es openvg egl

25
推荐指数
3
解决办法
2万
查看次数

有没有办法检查Android设备是否支持openGL ES 2.0?

我需要动态检查所用设备是否支持openGL ES 2.0.我怎样才能做到这一点?

android opengl-es opengl-es-2.0

25
推荐指数
2
解决办法
3万
查看次数

Sprite Kit和播放声音会导致应用程序终止

使用ARC

只是我遇到的一个问题 - 我有一个SKScene,我在其中使用SKAction类方法播放声音fx

[SKAction playSoundFileNamed:@"sound.wav" waitForCompletion:NO];
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试去背景时,无论声音结束,显然iOS正在终止我的应用程序gpus_ReturnNotPermittedKillClient.

现在只有当我评论这一行并且没有运行动作时,iOS才能在后台运行它(当然,暂停,但没有终止).

我究竟做错了什么?

编辑:如果没有运行,iOS将不会终止应用程序 - 例如,如果它if statement没有运行(soundOn == YES)或类似的东西,当布尔是false

audio opengl-es multitasking ios sprite-kit

25
推荐指数
2
解决办法
1万
查看次数

使用着色器从android ndk使用opengl es 2.0进行YUV到RGB的转换和显示

我目前正在使用ffmpeg在Android上使用rtsp播放器来连接和解码视频流.我想使用OpenGL es 2.0将YUV帧转换为RGB帧并显示它但我被阻止(这是我第一次使用opengl).

我会试着清楚地解释一下我的问题是什么.

从NDK android我使用这个方法初始化一个opengl上下文(从我想用来显示图像的线程):

    //
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_ALPHA_SIZE, 8,
        EGL_NONE
};
EGLint contextAttrs[] = {
        EGL_CONTEXT_CLIENT_VERSION, 2,
        EGL_NONE
};

LOGI("Initializing context");

if((display = eglGetDisplay(EGL_DEFAULT_DISPLAY)) == EGL_NO_DISPLAY)
{
    closeContext();
    return;
}

if(!eglInitialize(display, 0, 0))
{
    closeContext();
    return;
}

if(!eglChooseConfig(display, attribs, &config, 1, &numConfigs))
{
    closeContext();
    return;
}

if(!eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format))
{
    closeContext();
    return;
}

ANativeWindow_setBuffersGeometry(window, 0, 0, format);

if(!(surface = eglCreateWindowSurface(display, config, window, 0)))
{
    closeContext(); …
Run Code Online (Sandbox Code Playgroud)

c android opengl-es android-ndk

25
推荐指数
1
解决办法
2391
查看次数