- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试让一个非常简单的 openGL ES 1 程序在几台设备上以 60fps 的稳定速度运行,但我被 HTC desire 困住了。手机本身快速、活泼、功能强大,总体上使用起来轻而易举;但是,我似乎无法使用 OpenGL 以 60fps 全屏显示任何内容。在使用我的应用程序很长时间后,我决定使用文档中的示例代码制作一个测试应用程序。
这是我正在做的。使用 GLSurfaceView 的简单初始化代码。我有三个版本的 onDrawFrame,都很简单。一个是空的。一个只包含 glClear。一个只包含足够的状态来绘制一个全屏四边形。跟踪之前和之后的时间。我的程序中除了我的 GLSurfaceView 之外没有其他 View 。我无法解释我得到的时间。
在所有情况下,onDrawFrame 函数本身总是在 2 毫秒内完成。但通常情况下,onDrawFrame 在 30~40 毫秒之前不会再次调用,从而将我的帧速率一路降至 30fps 或更低。我用空的 onDrawFrame 得到大约 50fps,用 glClear 得到 45fps,用 quad 得到 35fps。同样的代码在 HTC Magic、三星 Galaxy S 和夏普 ISO1 上以 60 fps 的速度运行。由于其屏幕,Sony Experia X10 的帧率稳定在 30fps。我一直在 HTC Magic 上以稳定的 60fps 处理更复杂的场景,与 Desire 相比,它非常动力不足。我手头没有 Nexus One 可以测试。当然,我除了缓冲区交换以阻塞几毫秒。但它总是跳过帧。
为了找出手机在 onDrawFrame 处理程序之外 做什么,我尝试使用 Debug.startMethodTracing。我无法获得跟踪以反射(reflect)电话在循环之外花费的实际时间。在 onDrawFrame 结束时,我使用 startMethodTracing 然后将当前时间 (SystemClock.uptimeMillis) 保存在一个变量中。在下一个开始时,我 Log.e 自函数上次退出以来的时间差,以及 stopMethodTracing。这将被一遍又一遍地调用,所以我安排在我得到一个有 40 毫秒以上暂停的迭代跟踪后停止。结果跟踪的时间尺度小于 2 毫秒,就好像系统在我的程序之外花费了 38 毫秒。
我尝试了很多东西。枚举 EGL 配置并一个接一个地尝试它们。只是为了看看它是否改变了什么,我在脏方案要求在每一帧重绘时切换到渲染。无济于事。无论我做什么,交换缓冲区的预期间隔 14~16 毫秒将花费大约一半时间 30+ 毫秒,而且无论我做什么,设备似乎都在等待两次屏幕刷新。设备上的 ps 显示我的应用程序的 CPU 占用率约为 10%,而 System_server 为 35%。当然,我也尝试了显而易见的方法,杀死其他进程,重启设备……我总是得到完全相同的结果。
我在 canvas 绘图上没有同样的问题。
有谁知道为什么 Desire(并且只有 Desire)会这样?
作为引用,这是我的测试代码:
public class GLTest extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mGLView = new GLSurfaceView(this);
mGLView.setRenderer(new ClearRenderer());
setContentView(mGLView);
}
@Override
protected void onPause() {
super.onPause();
mGLView.onPause();
}
@Override
protected void onResume() {
super.onResume();
mGLView.onResume();
}
private GLSurfaceView mGLView;
}
class ClearRenderer implements GLSurfaceView.Renderer {
public void onSurfaceCreated(GL10 gl, EGLConfig config) {}
public void onSurfaceChanged(GL10 gl, int w, int h) { gl.glViewport(0, 0, w, h); }
long start;
long end;
public void onDrawFrame(GL10 gl)
{
start = System.currentTimeMillis();
if (start - end > 20)
Log.e("END TO START", Long.toString(start - end));
// gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
end = System.currentTimeMillis();
if (end - start > 15)
Log.e("START TO END", Long.toString(end - start));
}
}
最佳答案
你应该看看这个http://www.google.com/events/io/2010/sessions/writing-real-time-games-android.html
他建议您将帧速率保持在 30fps 而不是 60fps。
关于opengl-es - HTC Desire 特定的 OpenGL ES 1 帧速率 - 无法正确处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3706786/
在 OpenGL/ES 中,在实现渲染到纹理功能时,您必须小心,不要引起反馈循环(从正在写入的同一纹理中读取像素)。由于显而易见的原因,当您读取和写入纹理的相同像素时,行为是未定义的。但是,如果您正在
正如我们最终都知道的那样,规范是一回事,实现是另一回事。大多数错误是我们自己造成的,但有时情况并非如此。 我相信列出以下内容会很有用: GPU 驱动程序中当前已知的与最新版本的 OpenGL 和 GL
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。为了帮助澄清这个问题以便可以重新打开它,visit the help center
我正在学习 OpenGL,非常想知道与显卡的交互如何。 我觉得了解它是如何在图形驱动程序中实现的,会让我了解 opengl 的完整内部结构(通过这个我可以知道哪些阶段/因素影响我对 opengl 性能
我正在尝试绘制到大于屏幕尺寸(即 320x480)的渲染缓冲区 (512x512)。 执行 glReadPixels 后,图像看起来是正确的,除非图像的尺寸超过屏幕尺寸——在本例中,超过 320 水平
我正在 Windows 中制作一个 3D 小行星游戏(使用 OpenGL 和 GLUT),您可以在其中穿过一堆障碍物在太空中移动并生存下来。我正在寻找一种方法来针对无聊的 bg 颜色选项设置图像背景。
如果我想要一个包含 100 个 10*10 像素 Sprite 的 Sprite 表,是否可以将它们全部排成一排来制作 1,000*10 像素纹理?还是 GPU 对不那么窄的纹理表现更好?这对性能有什
这个问题在这里已经有了答案: Rendering 2D sprites in a 3D world? (7 个答案) 关闭 6 年前。 我如何概念化让图像始终面对相机。我尝试将三角函数与 arcta
是否可以在 OpenGL 中增加缓冲区? 假设我想使用实例化渲染。每次在世界上生成一个新对象时,我都必须用实例化数据更新缓冲区。 在这种情况下,我有一个 3 个 float 的缓冲区 std::v
有人可以向我解释为什么下面的代码没有绘制任何东西,但如果我使用 GL_LINE_LOOP 它确实形成了一个闭环吗? glBegin(GL_POLYGON); for(int i = 0; i <= N
正如标题所说,OpenGL 中的渲染目标是什么?我对 OpenGL 很陌生,我看到的所有网站都让我很困惑。 它只是一个缓冲区,我在其中放置稍后将用于渲染的东西吗? 如果您能提供一个很好的引用来阅读它,
当使用 OpenGL 1.4 固定功能多纹理时,每个纹理阶段的输出在传递到下一个阶段之前是否都固定在 [0, 1]? spec说(第 153 页): If the value of TEXTURE_E
我比较了 2 个函数 openGL ES 和 openGL gvec4 texelFetchOffset(gsampler2DArray sampler, ivec3 P, int lod, ivec
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
那么当你调用opengl函数时,比如glDraw或者gLBufferData,是否会导致程序线程停止等待GL完成调用呢? 如果不是,那么 GL 如何处理调用像 glDraw 这样的重要函数,然后立即更
我正在尝试实现级联阴影贴图,当我想访问我的视锥体的每个分区的相应深度纹理时,我遇到了一个错误。 更具体地说,当我想选择正确的阴影纹理时会出现我的问题,如果我尝试下面的代码,我会得到一个像 this 中
我想为OpenGL ES和OpenGL(Windows)使用相同的着色器源。为此,我想定义自定义数据类型并仅使用OpenGL ES函数。 一种方法是定义: #define highp #define
我尝试用 6 个位图映射立方体以实现天空盒效果。我的问题是一个纹理映射到立方体的每个面。我已经检查了 gDEBugger,在立方体纹理内存中我只有一个 图像(因为我尝试加载六个图像)。 代码准备纹理:
在 OpenGL 中偏移深度的最佳方法是什么?我目前每个多边形都有索引顶点属性,我将其传递给 OpenGL 中的顶点着色器。我的目标是在深度上偏移多边形,其中最高索引始终位于较低索引的前面。我目前有这
我是一名优秀的程序员,十分优秀!