查看: 1064|回复: 1
打印 上一主题 下一主题

[其他] 协程1——Action机制

[复制链接]

2722

主题

42

听众

3万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
38268
精华
111

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2014-12-27 05:42:26 |只看该作者 |倒序浏览
协程1——Action机制

协程作为[color=rgb(85, 85, 85) !important]unity3d中非常重要的一个机制,我们有必要了解协程是如何运作的。下面我讲解一下协程的驱动原理:Action机制。
为什么叫Action机制?其实也可以叫Actor机制,至于原因,不用追究了,反正有了面向对象的概念就有了这哥们。

何为Action机制呢?传统编程中,每一个独立的功能块会封装成一个函数或者一个类对象等。但是我们经常会看到一个函数内部会连续调用多个函数,但这个仅能用于顺序执行的代码块儿;如果我们每个被调用的函数之间要等待一段时间怎么办呢?1、锁死线程——难道其他代码不工作了?2、启动其他线程——是可以,但增加了线程安全的维护。这时候我们想想,如果将每一个被调用函数封装成一个Action,然后用一个底层循环驱动Action的运转,到了Action可以执行的时候再去执行(甚至是重复执行、条件执行等),让后消亡,这样不是很好么。其实,这个就是Action机制。回想一下,所有的[color=rgb(85, 85, 85) !important]游戏引擎是不是都是靠Action机制驱动的呢?只不过底层循环不是一直循环而是每一帧等一下的循环。当然Unity3D的协程也是依靠这种循环驱动力运作的,只不过协程的Action是隐式的,即在编译后由编译器编译成了Action而已。

Action机制的两个主要部件:

interface IAction
{
    bool isAlive { get; }
    void Update();
}

这个是Action必须实现的重要接口,isAlive表面是否有效,Update由驱动一直调用

public interface ITickObject
{
    void Update();
}

这个是驱动循环必须实现的接口,每一帧去调用Update,Update函数内部调用所有的Action的Update进行更新,然后检测isAlive=false的Action,将其踢出循环队列。

分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

74

主题

2

听众

3549

积分

中级设计师

Rank: 5Rank: 5

纳金币
-100
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2014-12-27 09:38:18 |只看该作者
从哪来的文章?质量不错
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-8-5 20:41 , Processed in 0.071963 second(s), 31 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部