首页 >> 大全

Android 游戏开发框架核心组件

2023-08-03 大全 27 作者:考证青年

游戏开发框架核心组件

核心组件介绍 介绍 介绍 就是带 的 view,它是一个 View,是 View 的子类,所以和其他 View 一样,可以在屏幕上展示东西接收用户输入,具有 View 的生命周期回调函数,如 、、、 等 带有独立的 (独立与 的 ),这可以让子线程在独立的 上面绘制东西,进行 的界面绘制,这个子线程就叫做渲染线程,但是要让独立的 上面的东西在 View 上面展示出来,需要 post 一个消息给主线程,目的是把该 中 上的东西绘制到 View 的真正的画布上面( 的 的 上),这样就可以把 UI 线程空闲出来处理用户的交互 可能被销毁,它只在..() 和 ..() 之间有效,这只是说 创建和销毁的时候会回到前面两个方法,所以要确保渲染线程访问的是合法有效的 . 是通过 的 的 来设置给 的,让 实现 并设置给 , 就可以监听这个独立 的创建和销毁了。 sdk 中的介绍

是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的。你可以控制这个的格式和尺寸。控制这个的绘制位置。

是纵深排序(Z-)的,这表明它总在自己所在窗口的后面。提供了一个可见区域,只有在这个可见区域内 部分内容才可见,可见区域外的部分不可见。

的排版显示受到视图层级关系的影响,它的兄弟视图结点会在顶端显示。这意味者

的内容会被它的兄弟视图遮挡,这一特性可以用来放置遮盖物()(例如,文本和按钮等控件)。注意,如果 上面有透明控件,那么它的每次变化都会引起框架重新计算它和顶层控件之间的透明效果,这会影响性能。

你可以通过 接口访问这个,() 方法可以得到这个接口。

变得可见时,被创建;隐藏前,被销毁。这样能节省资源。如果你要查看 被创建和销毁的时机,可以重载()和 () 的核心在于提供了两个线程:UI线程和渲染线程。

这里应注意:

1. 所有 和 . 的方法都会在UI线程里调用,一般来说就是应用程序主线程。所以渲染线程所要访问的各种变量应该作同步处理。

2. 由于可能被销毁,它只在..()和 ..()之间有效,所以要确保渲染线程访问的是合法有效的

介绍

是对 的 的包装,不但在 . 接口中负责 创建和销毁的回调,而且还对 的关键方法 ()、() 方法进行了线程安全的包装,所以 是 对象的持有者,负责 的生命周期中的对 操作的方法的调用

脏矩形 Rect dirty,是指标记这块矩形区域的数据作废,也就是需要重写绘制的矩形区域,(Rect dirty),可以指定一个矩形区域,让 中的 上部分数据重绘。

、、 之间的关系

这里写图片描述

使用的步骤 获取到 对应的 ,给 添加一个 . 对象。创建渲染线程对象在子线程中开始在 上面绘制图形,因为没有对我们暴露 ,而只是暴露了 的包装器 ,所以使用 的 ()获取 上面指定区域的 ,在该 上绘制图形,绘制结束后,使用 的 ()方法解锁 ,并且让 UI 线程把 上面的东西绘制到 View 的 上面 使用的 demo

public class GameUI extends SurfaceView implements SurfaceHolder.Callback {private SurfaceHolder holder;private RenderThread renderThread;private boolean isDraw = false;// 控制绘制的开关public GameUI(Context context) {super(context);holder = this.getHolder();holder.addCallback(this);renderThread = new RenderThread();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceCreated(SurfaceHolder holder) {isDraw = true;renderThread.start();}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {isDraw = false;}/*** 绘制界面的线程* * @author Administrator* */private class RenderThread extends Thread {@Overridepublic void run() {// 不停绘制界面while (isDraw) {drawUI();}super.run();}}/*** 界面绘制*/public void drawUI() {Canvas canvas = holder.lockCanvas();try {drawCanvas(canvas);} catch (Exception e) {e.printStackTrace();} finally {holder.unlockCanvasAndPost(canvas);}}private void drawCanvas(Canvas canvas) {// 在 canvas 上绘制需要的图形}
}

罗升阳的博客 源码剖析

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了