首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SurfaceHolder.lockCanvas()太贵了

SurfaceHolder.lockCanvas()太贵了
EN

Stack Overflow用户
提问于 2012-01-05 00:43:43
回答 2查看 2.7K关注 0票数 3

每次我调用这些方法时,都需要14到20 to才能完成。

代码语言:javascript
复制
Canvas canvas = holder.lockCanvas();
holder.unlockCanvasAndPost(canvas);

这是正常行为吗?我该换个办法吗?

这是整个代码

代码语言:javascript
复制
public class Render extends SurfaceView {
    Context c = null;
    SurfaceHolder holder;
    volatile boolean running = true;

    public Render(Context c) {
        super(c);
        this.c = c;
        this.holder = getHolder();
    }

    public void run() {
        if(running) { 
            if(!holder.getSurface().isValid()){
                System.out.println("not valid");
                return;          
            }

            Canvas canvas = holder.lockCanvas();
            holder.unlockCanvasAndPost(canvas);

        }
    }
}

追踪:

01-05 15:49:20.322: I/System.out(4892):帧时:0 ms frame291

01-05 15:49:20.322: I/System.out(4892):无效

01-05 15:49:20.322: I/System.out(4892):帧时:0 ms frame292

01-05 15:49:20.332: I/System.out(4892):帧时:2 ms frame293

01-05 15:49:20.357: I/System.out(4892):帧时: 22 ms frame294

01-05 15:49:20.357: I/System.out(4892):帧时:1 ms frame295

01-05 15:49:20.362: I/System.out(4892):帧时:1 ms frame296

01-05 15:49:20.367: d/剪贴板(4892):在开始输入时隐藏剪贴板对话框:由别人完成.好了!

01-05 15:49:20.367: I/System.out(4892):帧时:8 ms frame297

01-05 15:49:20.377: I/System.out(4892):帧时: 10 ms frame298

01-05 15:49:20.397: I/System.out(4892):帧时: 16 ms frame299

01-05 15:49:20.412: I/System.out(4892):帧时: 16 ms frame300

01-05 15:49:20.427: I/System.out(4892):帧时: 16 ms frame301

更新

当我使用OpenGL时,同样的事情也发生了

代码语言:javascript
复制
package android.apps.td;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.content.Context;
import android.opengl.GLSurfaceView;
import android.opengl.GLSurfaceView.Renderer;

public class Render extends GLSurfaceView implements Renderer {

    private final int MILLION = 1000000;
    private long frame;

    public Render(Context context) {
        super(context);
        setRenderer(this);
        // TODO Auto-generated constructor stub
    }

    public void onDrawFrame(GL10 arg0) {
        System.out.println("Frame "+(System.nanoTime()-frame)/MILLION+" ms");
        frame = System.nanoTime();
    }

    public void onSurfaceChanged(GL10 gl, int width, int height) {
        System.out.println("Surface changed w:"+width+" h:"+height);
    }

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        System.out.println("Surface created");
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-06 23:26:04

我发现了这篇文章:http://replicaisland.blogspot.com/2009/10/rendering-with-two-threads.html

eglSwapBuffers()可能在onDrawFrame之后调用并阻塞,直到硬件完成绘图和交换缓冲区,这需要最小的延迟16.67ms。

票数 2
EN

Stack Overflow用户

发布于 2012-04-27 20:25:32

我一直在调查这个问题。我在Galaxy Tab GT-p 7500上发现的是

  • 页面翻转( unlockCanvasAndPost+lockCanvas )之间的最短时间是每秒的1/60或17 ms。然而,
  • 可以完成高达6 ms的工作,而框架将停留在60 fps。页面翻转(
  • ,unlockCanvasAndPost+lockCanvas)所需的最短时间约为3毫秒。在工作6ms以上的
  • ,lockCanvas()函数可能会引入额外的延迟,迫使帧降至40 fps、30 fps、20 fps或15 fps。在最坏的情况下,页面翻转可能需要超过1/60秒。例如,如果您每帧工作48毫秒(当您添加3毫秒的页面翻转,这是不够快的20 fps),页面翻转浪费19-20毫秒,以迫使框架降低到15帧每秒。低于15 fps,一个页面翻转可能需要17毫秒的consistently.
  • This现象并不总是发生。在基准测试中观察到这种行为之后,我创建了一个专门的活动来进一步调查,而在这个专用活动中,这种现象并没有发生。到目前为止,我还没有找到我最初的基准和新的基准之间的区别:它们都在工作线程中的一个state.
  • Plugging上绘制框架,但是在第二个活动中,页面翻转持续花费3 ms,而在第一个活动中,页面翻转最初需要3 ms,但是在大约1/2秒之后突然上升,在稳定的SurfaceView中,最大的20 ms没有变化。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8736194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档