欢迎您访问系统网
您现在的位置是:首页» windows系统» surfaceview甯х巼,surfaceview璇﹁В

surfaceview甯х巼,surfaceview璇﹁В

2023-12-05 01:26:55
今天小编为大家分享Windows系统下载、Windows系统教程、windows相关应用程序的文章,希望能够帮助到大家!   SurfaceDestroyed原文:  屏幕的显示机制和帧动画类似,也是一帧一帧的连环画,只不过刷新频率很高,感觉像连续的。为了显示一帧,需要经历计算和渲染两个过程,CPU 先计

今天小编为大家分享Windows系统下载、Windows系统教程、windows相关应用程序的文章,希望能够帮助到大家!

  SurfaceDestroyed原文:

  屏幕的显示机制和帧动画类似,也是一帧一帧的连环画,只不过刷新频率很高,感觉像连续的。为了显示一帧,需要经历计算和渲染两个过程,CPU 先计算出这一帧的图像数据并写入内存,然后调用 OpenGL 命令将内存中数据渲染成图像存放在 GPU Buffer 中,显示设备每隔一定时间从 Buffer 中获取图像并显示。上则销亮述过程中的计算,对于View来说,就好比在主线程遍历 View树 以决定视图画多大(measure),画在哪(layout),画些啥(draw),计算结果存放在内存中,SurfaceFlinger 会调用 OpenGL 命令将内存中的数据渲染成图像存放在 GPU Buffer 中。每隔16.6ms,显示器从 Buffer 中取出帧并显示。所以自定义 View 可以通过重载onMeasure()、onLayout()、onDraw()来定义帧内容,但不能定义帧刷新频率。SurfaceView可以突破这个限制。而且它可以将计算帧斗脊数据放到独立的线程中进行。下面是自定义SurfaceView的模版代码:

  public abstract class BaseSurfaceView extends SurfaceView implements SurfaceHolder.Callback {

  public static final int DEFAULT_FRAME_DURATION_MILLISECOND = 50;

  // 用于计算帧数据孙宽的线程

  private HandlerThread handlerThread;

  private Handler handler;

  // 帧刷新频率

  private int frameDuration = DEFAULT_FRAME_DURATION_MILLISECOND;

  // 用于绘制帧的画布

  private Canvas canvas;

  private boolean isAlive;

  public BaseSurfaceView(Context context) {

  super(context);

  init();

  }

  protected void init() {

  getHolder().addCallback(this);

  // 设置透明背景,否则SurfaceView背景是黑的

  setBackgroundTransparent();

  }

  private void setBackgroundTransparent() {

  getHolder().setFormat(PixelFormat.TRANSLUCENT);

  setZOrderOnTop(true);

  }

  @Override

  public void surfaceCreated(SurfaceHolder holder) {

  isAlive = true;

  startDrawThread();

  }

  @Override

  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}

  @Override

  public void surfaceDestroyed(SurfaceHolder holder) {

  stopDrawThread();

  isAlive = false;

  }

  // 停止帧绘制线程

  private void stopDrawThread() {

  handlerThread.quit();

  handler = null;

  }

  // 启动帧绘制线程

  private void startDrawThread() {

  handlerThread = new HandlerThread(“SurfaceViewThread”);

  handlerThread.start();

  handler = new Handler(handlerThread.getLooper());

  handler.post(new DrawRunnable());

  }

  private class DrawRunnable implements Runnable {

  @Override

  public void run() {

  if (!isAlive) {

  return;

  }

  try {

  // 1. 获取画布

  canvas = getHolder().lockCanvas();

  // 2. 绘制一帧

  onFrameDraw(canvas);

  } catch (Exception e) {

  e.printStackTrace();

  } finally {

  // 3. 将帧数据提交

  getHolder().unlockCanvasAndPost(canvas);

  // 4. 一帧绘制结束

  onFrameDrawFinish();

  }

  }

  }

  SurfaceDestroyed改写:

  屏幕显示的原理就像是一幅连环画,通过连续不断地刷新帧的方式来呈现动态画面。为了展示一帧画面,需要经过计算和渲染两个步骤。首先,CPU会计算出这一帧的图像数据,并将数据写入内存。然后,通过调用OpenGL命令,将内存中的数据渲染成图像,并存储在GPU缓冲区中。显示设备会每隔一定的时间从缓冲区中获取图像并显示在屏幕上。

  以上是关于计算的过程,对于View来说,就好像在主线程中遍历View树,决定每个视图的尺寸(measure)、位置(layout)和绘制内容(draw),计算的结果会存储在内存中。SurfaceFlinger会调用OpenGL命令,将内存中的数据渲染成图像,并存放在GPU缓冲区中。显示器会每隔16.6毫秒从缓冲区中获取一帧图像并显示。

  因此,自定义View可以通过重写onMeasure()、onLayout()和onDraw()方法来定义每一帧的内容,但是不能定义帧的刷新频率。而SurfaceView可以突破这个限制。此外,SurfaceView还可以将计算帧数据的过程放在独立的线程中进行。

  下面是自定义SurfaceView的模板代码:

  public abstract class BaseSurfaceView extends SurfaceView implements SurfaceHolder.Callback {

  public static final int DEFAULT_FRAME_DURATION_MILLISECOND = 50;

  // 用于计算帧数据的线程

  private HandlerThread handlerThread;

  private Handler handler;

  // 帧刷新频率

  private int frameDuration = DEFAULT_FRAME_DURATION_MILLISECOND;

  // 用于绘制帧的画布

  private Canvas canvas;

  private boolean isAlive;

  public BaseSurfaceView(Context context) {

  super(context);

  init();

  }

  protected void init() {

  getHolder().addCallback(this);

  // 设置透明背景,否则SurfaceView背景是黑的

  setBackgroundTransparent();

  }

  private void setBackgroundTransparent() {

  getHolder().setFormat(PixelFormat.TRANSLUCENT);

  setZOrderOnTop(true);

  }

  @Override

  public void surfaceCreated(SurfaceHolder holder) {

  isAlive = true;

  startDrawThread();

  }

  @Override

  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

  }

  @Override

  public void surfaceDestroyed(SurfaceHolder holder) {

  stopDrawThread();

  isAlive = false;

  }

  // 停止帧绘制线程

  private void stopDrawThread() {

  handlerThread.quit();

  handler = null;

  }

  // 启动帧绘制线程

  private void startDrawThread() {

wwW.Xtw.Com.cN系统网专业的PC、手机系统开发下载平台,HarmonyOS系统、安卓、OS、windows电脑重装系统在线下载安装,操作系统平台技术学习,攻略教程,技术交流。

免责声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。内容仅供参考使用,不准确地方联系删除处理!

联系邮箱:773537036@qq.com

标签: 获取 android