gpt4 book ai didi

android - SurfaceView 的 renderThread 是否应该与 View 或 Activity 具有相同的生命周期?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:32:48 26 4
gpt4 key购买 nike

创建 SurfaceView 时,通常还会创建一个单独的线程来绘制到表面上。在 Activity 或表面同时创建和销毁线程是更好的编程实践吗?

这两种方式有哪些优点/缺点?

最佳答案

ActivityView基本上是同时创建的。 Surface稍后创建,这就是 SufaceHolder callbacks是给。

您无法在 Surface 上渲染在它存在之前或被销毁之后,因此在此之前启动渲染线程或让它运行之后没有意义。棘手的部分是回调发生在主 UI 线程上(因为这是您设置它的地方),所以 surfaceDestroyed()可以在渲染线程工作时调用回调。

编辑:

下面包含了有关 SurfaceView/Activity 生命周期的一些注意事项。这些现在是官方 Android 文档的一部分;参见 System-Level Graphics 中的附录 B博士。原始帖子可用于历史目的。

您可以在 Grafika 中看到这两种方法的示例。 .方法 #1(在 onResume/onPause 中创建/销毁线程)可以在 TextureFromCameraActivity 中看到,方法#2(在surfaceCreated/surfaceDestroyed中创建/销毁线程)可以在HardwareScalerActivity中看到和 RecordFBOActivity .

关于应用程序生命周期和 SurfaceView 的一些想法.

有两件有些独立的事情正在发生:

  • 应用程序 onCreate/onResume/onPause
  • 表面创建/更改/销毁

  • 当 Activity 启动时,您会按以下顺序获得回调:
  • onCreate
  • 关于简历
  • 表面创建
  • 表面改变

  • 如果你点击“返回”,你会得到:
  • onPause
  • surfaceDestroyed(在 Surface 消失之前调用)

  • 如果旋转屏幕, Activity被拆除并重新创建,所以你得到
    完整的循环。 (您可以通过检查 isFinishing() 来判断这是一个“快速”重启。)启动/停止 Activity 的速度可能如此之快,以至于 surfaceCreated()可能发生在 onPause() 之后,但我不确定。

    但是,如果您点击电源按钮使屏幕空白,您只会收到 onPause() ——
    surfaceDestroyed() . Surface保持活跃,渲染可以继续(你
    如果您继续请求,甚至可以继续获得编舞 Activity )。如果你有
    一个锁定屏幕,强制您的 Activity 特定方向可以被踢,但是
    如果没有,您可以使用相同的 Surface 来从空白屏幕中出来你以前有过。

    当使用单独的渲染器线程时,这提出了一个基本问题 SurfaceView : 线程的生命周期是否应该与 Surface 相关联或到 Activity ?答案是:这取决于你想在屏幕上发生什么
    变为空白。有两种基本方法: (1) 在 Activity 上启动/停止线程
    开始/停止; (2) 在 Surface 上启动/停止线程创建/销毁。

    #1 与应用程序生命周期交互良好。我们在 onResume() 中启动渲染器线程和
    停止在 onPause() .创建和配置线程时会有点尴尬
    因为有时 Surface 已经存在,有时则不会。我们不能简单地
    转发 Surface对线程的回调,因为如果 Surface已经存在。所以我们需要查询或缓存 Surface状态,并转发它
    到渲染器线程。请注意,我们在这里传递对象时必须小心一点
    线程 -- 最好通过 SurfaceSurfaceHolder通过 Handler消息,而是
    而不仅仅是将其塞入线程中,以避免在多核系统上出现问题(参见
    Android SMP Primer )。

    #2 有一定的吸引力,因为 Surface和渲染器在逻辑上是交织在一起的。
    我们在 Surface 之后启动线程已经创建,避免了线程间
    沟通问题。 Surface创建/更改的消息只是转发。我们
    需要确保渲染在屏幕变黑时停止,并在屏幕变黑时恢复
    非空白;这可能是告诉编舞者停止调用
    帧绘制回调。我们的 onResume()将需要恢复回调当且仅当
    渲染器线程正在运行。不过,这可能不是那么简单——如果我们基于动画
    在帧之间耗时上,下一个事件发生时我们可能会有很大的差距
    到达,因此可能需要明确的暂停/恢复消息。

    以上主要关注渲染器线程是如何配置的,以及
    它正在执行。一个相关的问题是从线程中提取状态,当 Activity被杀死(在 onPause()onSaveInstanceState() 中)。方法#1 会奏效
    最好的办法是,因为一旦加入了渲染器线程,它的状态就可以是
    无需同步原语即可访问。

    关于android - SurfaceView 的 renderThread 是否应该与 View 或 Activity 具有相同的生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21567641/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com