我一直在玩OpenGL ESAndroid 上的开发.OpenGL ES应用程序似乎在我的开发机器上的模拟器中运行缓慢.这是否反映了实际硬件的可能性能?如果图形性能变得迟缓,我担心花费太多时间开发应用程序.
有谁知道在iPhone上使用OpenGLES的初学者指南?我找到了一些,但他们都需要我没有的假设知识.
我使用Native代码在Android中渲染OpenGL,我得到的定期错误如下所示:
ERROR/IMGSRV(1435):frameresource.c:610:WaitUntilResourceIsNotNeeded:PVRSRVEventObjectWait失败
错误/ IMGSRV(1018):sgxif.c:124:WaitForRender:PVRSRVEventObjectWait失败
错误/ IMGSRV(1435):osfunc_um.c:318:PVRSRVEventObjectWait:返回错误13
一旦出现这些错误,我必须重新启动手机,否则渲染将无法再次正确启动.我已经做了很多网络搜索,我无法找出导致这些错误的原因.有没有人有任何建议?
有没有办法在规划阶段根据游戏/应用程序的预期复杂性预先决定是否在SurfaceView中使用常规Canvas绘图或使用OpenGL?
我一直在玩Canvas并且只需要2D移动,而在一部相当新的手机上,我得到了相当不错的性能,其中有一堆原始对象和一些在固定背景屏幕上运行的位图.
可以公平地说,如果我要绘制背景图像并增加移动和绘制对象的数量,我应该直接使用OpenGL吗?
剧透:我对答案很有信心NO,但这只是经过一天非常沮丧的调试之后.现在我想知道是否确实如此(如果是这样,我可能知道的话),或者我是否只是做了一些完全错误的事情.
这是情况.我正在使用OpenGL ES 2.0来渲染我从各种文件(.obj,.md2等)加载的一些网格物体.为了性能和用户体验,我使用GCD将这些网格及其相关纹理的实际加载委托给后台线程.
根据Apple的 说明,在每个后台线程上,我创建并设置一个与shareGroup主渲染上下文相同的新EAGLContext .这允许在后台线程上创建的OpenGL对象(如纹理和缓冲区对象)立即被主线程上下文使用.
这一直在努力.现在,我最近了解到顶点数组对象是一种缓存与渲染某些缓冲区内容相关的OpenGL状态的方法.它看起来不错,并减少了样板状态检查和设置渲染每个网格所需的代码.最重要的是,Apple还建议在他们使用顶点数据的最佳实践指南中使用它们.
但是我在让VAO为我工作时遇到了严重的问题.就像我对所有加载一样,我会将网格从文件加载到后台线程的内存中,然后生成所有关联的OpenGL对象.没有失败,我第一次尝试glDrawElements()使用VAO 调用时,应用程序崩溃了EXC_BAD_ACCESS.没有VAO,它就会很好.
调试EXC_BAD_ACCESS是一种痛苦,特别是当NSZombies无法帮助时(他们显然不会这样做),但经过一段时间分析捕获的OpenGL帧后,我意识到,虽然在后台线程上创建VAO很顺利(不GL_ERROR,当一个时间来到主线程上的VAO时,我会得到一个GL_INVALID_OPERATION,当尝试绑定到一个不存在的VAO时,文档状态会发生.果然,看着在渲染时当前上下文中的所有对象的时候,没有一个单一的VAO待观察,但都与VAO生成的维也纳各组织在同一时间存在.如果我在主线程上加载VAO它可以正常工作.很沮丧.
我将加载代码提炼为更原子的形式:
- (void)generate {
glGenVertexArraysOES(1, &_vao);
glBindVertexArrayOES(_vao);
_vbos = malloc(sizeof(GLuint) * 4);
glGenBuffers(4, vbos);
}
Run Code Online (Sandbox Code Playgroud)
当在后台线程上执行上述操作时,如果有效EAGLContext与shareGroup主上下文相同,则主上下文将有4个VBO,但没有VAO.如果我在主线程上执行它,使用主上下文,它将有4个VBO和VAO.这使我得出结论,EAGLContext在处理VAO时,s 的对象共享性质存在一些奇怪的例外.如果确实如此,我真的希望Apple文档能够在某处注明.不得不手动发现这样的小花絮是非常不方便的.是这样的,还是我错过了什么?
将我的手机升级到android 4.03后,我的游戏再次打开,它只是关闭而没有任何错误消息在deviCe上和这个在eclipse上
04-02 16:55:27.672: E/dalvikvm(26884): JNI ERROR (app bug): attempt to use stale local reference 0x1
04-02 16:55:27.672: E/dalvikvm(26884): VM aborting
Run Code Online (Sandbox Code Playgroud)
我的游戏主要是用java编写的,但有些部分是在c中,我觉得这个问题是(因为它说JNI ERROR :)不是很难弄清楚))
当然我不知道问题在哪里,所以我不给任何代码
我没有在android 2.3上遇到这个问题
我不知道它是否有帮助但我有时也会得到这个错误
04-02 16:55:26.061: E/Adreno200-ES11(26884): <qglDrvAPI_glTexImage2D:1913>: GL_STACK_UNDERFLOW
Run Code Online (Sandbox Code Playgroud)
我在OpenGL中平滑滚动有问题(在SGS2和ACE上测试)
我创建了简单的应用程序 - 只有固定速度的水平滚动图像,或者只有一个图像(播放器)通过加速器移动,但它的运动不顺畅:-(
我试过了许多代码但不满意......
首先我尝试使用GLSurfaceView.RENDERMODE_CONTINUOUSLY并将所有代码放到onDrawFrame:
public void onDrawFrame(GL10 gl)
{
updateGame(gl, 0.017f);
drawGame(gl);
}
Run Code Online (Sandbox Code Playgroud)
这是最简单,最绝对的顺畅! - 但它取决于硬件速度(=无用)
public void onDrawFrame(GL10 gl)
{
frameTime = SystemClock.elapsedRealtime();
elapsedTime = (frameTime - lastTime) / 1000;
updateGame(gl, elapsedTime);
drawGame(gl);
lastTime = frameTime;
}
Run Code Online (Sandbox Code Playgroud)
这是最好的,但它不像以前那样流畅,有时轻弹
我试过GLSurfaceView.RENDERMODE_WHEN_DIRTY,在onDrawFrame我只有绘图对象和这个代码在单独的线程中:
while (true)
{
updateGame(renderer, 0.017f);
mGLSurfaceView.requestRender();
next_game_tick += SKIP_TICKS;
sleep_time = next_game_tick - System.currentTimeMillis();
if (sleep_time >= 0)
{
try
{
Thread.sleep(sleep_time);
}
catch (Exception e) {}
}
else
{
Log.d("running behind: ", String.valueOf(sleep_time)); …Run Code Online (Sandbox Code Playgroud) 我正在制作一款安卓游戏,目前我还没有达到我想要的性能.我在自己的线程中有一个游戏循环,用于更新对象的位置.渲染线程将遍历这些对象并绘制它们.目前的行为似乎是波涛汹涌/不均匀的运动.我无法解释的是,在我将更新逻辑放入自己的线程之前,我在onDrawFrame方法中,就在gl调用之前.在这种情况下,动画非常流畅,当我尝试通过Thread.sleep来限制我的更新循环时,它只会变得不连贯/不均匀.即使我允许更新线程进行狂暴(无睡眠),动画也是平滑的,只有当涉及Thread.sleep时它才会影响动画的质量.
我已经创建了一个骨架项目来查看是否可以重新创建该问题,下面是渲染器中的更新循环和onDrawFrame方法: Update Loop
@Override
public void run()
{
while(gameOn)
{
long currentRun = SystemClock.uptimeMillis();
if(lastRun == 0)
{
lastRun = currentRun - 16;
}
long delta = currentRun - lastRun;
lastRun = currentRun;
posY += moveY*delta/20.0;
GlobalObjects.ypos = posY;
long rightNow = SystemClock.uptimeMillis();
if(rightNow - currentRun < 16)
{
try {
Thread.sleep(16 - (rightNow - currentRun));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的onDrawFrame方法:
@Override
public void onDrawFrame(GL10 gl) {
gl.glClearColor(1f, 1f, 0, 0); …Run Code Online (Sandbox Code Playgroud) 我正在制作一个带有人脸检测的自定义相机,它可以成功运行.
但我想添加贴纸,如记录/预览的脸.眼睛的位置用于在预览上正确调整大小并放置帽子,眼镜和领带等.
使用FaceOverlayView进行人脸检测
public class FaceOverlayView extends View {
private Paint mPaint;
private Paint mTextPaint;
private int mDisplayOrientation;
private int mOrientation;
private Face[] mFaces;
public FaceOverlayView(Context context) {
super(context);
initialize();
}
private void initialize() {
// We want a green box around the face:
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setColor(Color.GREEN);
mPaint.setAlpha(128);
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mTextPaint = new Paint();
mTextPaint.setAntiAlias(true);
mTextPaint.setDither(true);
mTextPaint.setTextSize(20);
mTextPaint.setColor(Color.GREEN);
mTextPaint.setStyle(Paint.Style.FILL);
}
public void setFaces(Face[] faces) {
mFaces = faces;
invalidate();
}
public void setOrientation(int orientation) {
mOrientation = …Run Code Online (Sandbox Code Playgroud) 注意:我理解基本的数学.我理解perspective各种数学库中的典型函数会产生一个矩阵,它将-zNear到-zFar的z值转换回-1到+1,但前提是结果除以w
具体的问题是GPU为你做了什么,而不是你必须自己做?
换句话说,可以说的GPU没有神奇划分gl_Position的gl_Position.w,并且代替你不得不做手工,如
attribute vec4 position;
uniform mat4 worldViewProjection;
void main() {
gl_Position = worldViewProjection * position;
// imaginary version of GL where we must divide by W ourselves
gl_Position /= gl_Position.w;
}
Run Code Online (Sandbox Code Playgroud)
由于这个原因,这个想象中的GL会打破什么?它是否有效或是否有一些关于在被除以之前传递值的东西,它w为GPU提供了额外需要的信息?
请注意,如果我实际执行此操作,纹理映射透视图会中断.
"use strict";
var m4 = twgl.m4;
var gl = twgl.getWebGLContext(document.getElementById("c"));
var programInfo = twgl.createProgramInfo(gl, ["vs", "fs"]);
var bufferInfo = twgl.primitives.createCubeBufferInfo(gl, 2);
var tex = twgl.createTexture(gl, {
min: gl.NEAREST,
mag: gl.NEAREST,
src: [
255, 255, 255, 255, …Run Code Online (Sandbox Code Playgroud)opengl-es ×10
android ×7
android-ndk ×2
java ×2
objective-c ×2
eaglcontext ×1
game-loop ×1
glsl ×1
ios ×1
iphone ×1
opengl ×1
thread-sleep ×1