`
leecong1p
  • 浏览: 147888 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

关于SurfaceView主线程与UI线程的问题

 
阅读更多

       好久没更新博客了,最近工作太忙了,也没什么时间自己研究技术,分享一点工作里总结的经验吧。

       大家都知道做Android游戏用SurfaceView效率比较高,但是需要独立的一个线程去控制绘制以及游戏逻辑。但是UI界面的触摸、按键之类的是属于UI线程的,这里就涉及到线程同步的问题。当然,代码写得小心,异步也完全没问题,效率也比较高。只不过情况有时候很复杂,未必小心就有用。

       我的方法是用一个队列保存事件,在游戏线程检索这个队列,当然要进行同步操作。以下为部分代码(按键事件省去了,与触摸同理。Logic是游戏逻辑对象,这里没有给出定义,应该一看就明白了吧:)

    private ArrayList<MotionEvent> touchEventList;
   
    /**
     * 触摸事件同步锁
     */
    private byte[] touchLock = new byte[0];
 
    public boolean onTouchEvent(MotionEvent event)
    {
        synchronized (touchLock)
        {
            if (touchEventList.size() > MAX_EVENT)
            {
                touchEventList.remove(0);
            }
            touchEventList.add(MotionEvent.obtain(event));
    ​    ​    ​//注意,因为event对象不是临时的,在UI线程中其属性会随时被改变,这里需要进行深拷贝
        }
        return true;
    }
 
     public void run()
    {
        while (true)
        {
            Canvas canvas = surfaceHolder.lockCanvas();
           
            if (canvas == null)
            {
                break;
            }
            
            super.draw(canvas);
            if (logic != null)
            {
                logic.paint(canvas);
                logic.update();
               
                synchronized (touchLock)
                {
                    for (TouchAction touchAction : touchEventList)
                    {
                        logic.onTouchEvent(touchAction);
                    }
                    touchEventList.clear();
                }
            }     
            surfaceHolder.unlockCanvasAndPost(canvas);
        }
    }

 

转载注明出处,谢谢。

分享到:
评论

相关推荐

    为何SurfaceView能够在非UI线程中刷新界面(内容为代码的demo而并非文档)

    在Android系统中,UI操作必须在主线程(也称为UI线程)中执行,这是为了保证用户界面的流畅性和一致性。然而,对于某些高性能的图形处理或者视频播放场景,如游戏或摄像头应用,使用主线程可能会导致性能瓶颈,因为...

    android SurfaceView添加线程源码

    `SurfaceView`提供了直接与硬件图形管道交互的能力,使得开发者可以在单独的线程中进行绘制,从而避免阻塞UI主线程,提高应用性能。本篇文章将深入解析如何在`SurfaceView`中添加线程以及相关的源码分析。 首先,`...

    SurfaceView

    SurfaceView的后台线程可以不断地更新Surface,而不会影响到主线程(UI线程)的工作。 2. **SurfaceHolder接口**: SurfaceView与应用程序交互的主要方式是通过SurfaceHolder接口。开发者可以通过SurfaceHolder来...

    AndroidApp中使用SurfaceView制作多线程动画的实例讲解.docx

    1. **同步问题**:`SurfaceView`及其关联的`SurfaceHolder.Callback`方法都是从主线程(通常即UI线程)调用的。因此,对于在其他线程中获取到的数据或者状态改变,需要确保它们与主线程之间的同步。 2. **合法性...

    Android SurfaceView 实现图片缩放 滑动

    SurfaceView拥有自己的独立渲染线程,这使得它能够高效地处理图像数据,避免阻塞UI主线程。在实现图片缩放和滑动时,我们需要利用这一点来确保流畅的用户体验。 1. **SurfaceView的创建与初始化**: 在布局文件中...

    Android SurfaceView 多线程 滑块

    1. **SurfaceView**:SurfaceView不同于普通的View,它有自己的Surface对象,这个Surface位于应用窗口的顶层,可以直接进行硬件加速的绘制,而不受UI线程的限制。SurfaceView内部会创建一个子线程(通常称为绘图线程...

    Android提高第三篇之SurfaceView与多线程的混搭.docx

    通过这样的方式,SurfaceView与多线程的结合可以极大地优化动画的性能,避免由于主线程阻塞导致的动画卡顿和闪烁问题。同时,这种模式也为开发者提供了更大的灵活性,能够根据具体需求定制复杂的图形渲染逻辑。

    SurfaceView的使用

    7. **同步问题**: 由于SurfaceView的绘图线程与主线程分离,所以可能存在线程同步问题。开发者需要确保在对Surface进行操作时,不会与主线程或其他线程发生冲突。 8. **SurfaceView的子类**: 除了直接使用...

    Android中SurfaceView的使用

    1. **线程同步**:由于SurfaceView有自己的渲染线程,开发者需要处理好与主线程的同步问题,例如在更新SurfaceView状态时,需要确保Surface存在并且可用。 2. **内存管理**:由于SurfaceView涉及到内存分配和释放,...

    SurfaceView入门Demo

    5. **同步问题**:由于SurfaceView的绘图线程与UI线程分离,需要注意线程间的同步问题。比如,当Surface销毁时,必须停止绘图线程,防止空指针异常。 6. **优化性能**:SurfaceView能提供高性能的绘图能力,但也要...

    surfaceview

    SurfaceView的核心特性是它拥有自己的独立线程,这个线程称为"SurfaceHolder"回调线程,它与主线程分离,使得UI更新和图形绘制可以在不同的线程中进行,避免了因频繁更新导致的UI阻塞。这在处理密集型图形计算时尤其...

    安卓Android源码——(SurfaceView游戏框架).rar

    这使得SurfaceView能够与UI线程分离,开发者可以在一个单独的工作线程(通常称为“渲染线程”)中处理图像的绘制和更新,而不会影响到主线程的UI交互。 游戏框架基于SurfaceView的构建通常包括以下几个关键组件和...

    SurfaceView应用实例动态小鱼

    SurfaceView提供了一种高效的方式,将UI线程与绘制线程分离,从而避免了UI更新阻塞主线程的问题。本实例“SurfaceView应用实例动态小鱼”是为了帮助新手理解SurfaceView的使用方法和绘图机制。 首先,SurfaceView的...

    android之view和surfaceview用法示例汇总

    2. **Surface**:SurfaceView包含一个Surface对象,这个对象在独立的SurfaceFlinger线程中更新,与应用程序的主线程分离,从而避免了主线程阻塞问题。 3. **生命周期**:SurfaceView创建时会创建一个Surface,通过`...

    android surfaceview例程

    SurfaceView的工作原理是创建了一个独立的渲染表面,这个表面与应用程序的主线程分离,可以在自己的线程中进行绘制,避免了UI线程的阻塞,从而提高了性能。以下是一些关键知识点: 1. **SurfaceHolder**:...

    安卓开发-VIEW双缓冲与SurfaceView比较.zip.zip

    SurfaceView拥有自己的Surface对象,它不在主线程中进行绘制,而是通过单独的线程(通常称为渲染线程)来处理,从而实现了与UI线程的解耦。这种方式使得SurfaceView更适合处理复杂的动画和实时渲染任务,如播放视频...

    surfaceview进行屏幕截图demo

    它的特点是渲染线程与UI线程分离,这样可以避免更新UI时阻塞主线程,提高应用程序的性能。在Android开发中,有时我们需要对应用界面进行截图,包括SurfaceView的部分。下面我们将详细探讨如何利用SurfaceView实现...

    21天学习android开发教程之SurfaceView与多线程的混搭

    Android应用的主线程,也称为UI线程,负责处理用户交互和更新界面。如果在主线程中执行耗时操作,如图像加载或绘图,会导致应用程序无响应(ANR)。因此,为了防止这种问题,开发者通常会创建新的线程来处理这些任务...

Global site tag (gtag.js) - Google Analytics