好久没更新博客了,最近工作太忙了,也没什么时间自己研究技术,分享一点工作里总结的经验吧。
大家都知道做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); } }
转载注明出处,谢谢。
相关推荐
在Android系统中,UI操作必须在主线程(也称为UI线程)中执行,这是为了保证用户界面的流畅性和一致性。然而,对于某些高性能的图形处理或者视频播放场景,如游戏或摄像头应用,使用主线程可能会导致性能瓶颈,因为...
`SurfaceView`提供了直接与硬件图形管道交互的能力,使得开发者可以在单独的线程中进行绘制,从而避免阻塞UI主线程,提高应用性能。本篇文章将深入解析如何在`SurfaceView`中添加线程以及相关的源码分析。 首先,`...
SurfaceView的后台线程可以不断地更新Surface,而不会影响到主线程(UI线程)的工作。 2. **SurfaceHolder接口**: SurfaceView与应用程序交互的主要方式是通过SurfaceHolder接口。开发者可以通过SurfaceHolder来...
1. **同步问题**:`SurfaceView`及其关联的`SurfaceHolder.Callback`方法都是从主线程(通常即UI线程)调用的。因此,对于在其他线程中获取到的数据或者状态改变,需要确保它们与主线程之间的同步。 2. **合法性...
1. **SurfaceView**:SurfaceView不同于普通的View,它有自己的Surface对象,这个Surface位于应用窗口的顶层,可以直接进行硬件加速的绘制,而不受UI线程的限制。SurfaceView内部会创建一个子线程(通常称为绘图线程...
通过这样的方式,SurfaceView与多线程的结合可以极大地优化动画的性能,避免由于主线程阻塞导致的动画卡顿和闪烁问题。同时,这种模式也为开发者提供了更大的灵活性,能够根据具体需求定制复杂的图形渲染逻辑。
7. **同步问题**: 由于SurfaceView的绘图线程与主线程分离,所以可能存在线程同步问题。开发者需要确保在对Surface进行操作时,不会与主线程或其他线程发生冲突。 8. **SurfaceView的子类**: 除了直接使用...
1. **线程同步**:由于SurfaceView有自己的渲染线程,开发者需要处理好与主线程的同步问题,例如在更新SurfaceView状态时,需要确保Surface存在并且可用。 2. **内存管理**:由于SurfaceView涉及到内存分配和释放,...
5. **同步问题**:由于SurfaceView的绘图线程与UI线程分离,需要注意线程间的同步问题。比如,当Surface销毁时,必须停止绘图线程,防止空指针异常。 6. **优化性能**:SurfaceView能提供高性能的绘图能力,但也要...
SurfaceView拥有自己的独立渲染线程,这使得它能够高效地处理图像数据,避免阻塞UI主线程。在实现图片缩放和滑动时,我们需要利用这一点来确保流畅的用户体验。 1. **SurfaceView的创建与初始化**: 在布局文件中...
SurfaceView的核心特性是它拥有自己的独立线程,这个线程称为"SurfaceHolder"回调线程,它与主线程分离,使得UI更新和图形绘制可以在不同的线程中进行,避免了因频繁更新导致的UI阻塞。这在处理密集型图形计算时尤其...
这使得SurfaceView能够与UI线程分离,开发者可以在一个单独的工作线程(通常称为“渲染线程”)中处理图像的绘制和更新,而不会影响到主线程的UI交互。 游戏框架基于SurfaceView的构建通常包括以下几个关键组件和...
SurfaceView提供了一种高效的方式,将UI线程与绘制线程分离,从而避免了UI更新阻塞主线程的问题。本实例“SurfaceView应用实例动态小鱼”是为了帮助新手理解SurfaceView的使用方法和绘图机制。 首先,SurfaceView的...
2. **Surface**:SurfaceView包含一个Surface对象,这个对象在独立的SurfaceFlinger线程中更新,与应用程序的主线程分离,从而避免了主线程阻塞问题。 3. **生命周期**:SurfaceView创建时会创建一个Surface,通过`...
SurfaceView的工作原理是创建了一个独立的渲染表面,这个表面与应用程序的主线程分离,可以在自己的线程中进行绘制,避免了UI线程的阻塞,从而提高了性能。以下是一些关键知识点: 1. **SurfaceHolder**:...
SurfaceView拥有自己的Surface对象,它不在主线程中进行绘制,而是通过单独的线程(通常称为渲染线程)来处理,从而实现了与UI线程的解耦。这种方式使得SurfaceView更适合处理复杂的动画和实时渲染任务,如播放视频...
它的特点是渲染线程与UI线程分离,这样可以避免更新UI时阻塞主线程,提高应用程序的性能。在Android开发中,有时我们需要对应用界面进行截图,包括SurfaceView的部分。下面我们将详细探讨如何利用SurfaceView实现...
Android应用的主线程,也称为UI线程,负责处理用户交互和更新界面。如果在主线程中执行耗时操作,如图像加载或绘图,会导致应用程序无响应(ANR)。因此,为了防止这种问题,开发者通常会创建新的线程来处理这些任务...