unity3d使用协程应该注意啥
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity3d使用协程应该注意啥相关的知识,希望对你有一定的参考价值。
因为Unity内部架构特性,Unity自带的玩意很难支持多线程,所以搞出了协程这个假的多线程。 在主线程刷Mono的每次生命周期时,每次都会在某个阶段检查一下是否有协程准备就绪,只要有准备就绪的,就执行,遇到yield就继续挂起。和invoke挺像的。 ... 参考技术A 应该从MonoBehavior的机制来分析比较合适如果你的类无需引擎提供的各种初始化,更新及析构,物理,渲染等的回调.最好不要继承MonoBehavior继承后,引擎会在事件触发时,通过反射调用各种函数.这是需要消耗性能的.当然,如果你的类压根没挂上GameObject.理论上说,应该没啥卵用所以总结,弄不继承MonoBehavior尽量不派生Swoole 中协程的使用注意事项及协程中的异常捕获
协程使用注意事项
- 协程内部禁止使用全局变量,以免发生数据错乱;
- 协程使用
use
关键字引入外部变量到当前作用域禁止使用引用,以免发生数据错乱; - 不能使用类静态变量
Class::$array
/ 全局变量$_array
/ 全局对象属性$object->array
/ 其他超全局变量$GLOBALS
等保存协程上下文内容,以免发生数据错乱; - 协程之间通讯必须使用通道(Channel);
- 不能在多个协程间共用一个客户端连接,以免发生数据错乱;可以使用连接池实现;
- 在 SwooleServer 中,客户端连接应当在 onWorkerStart 中创建;
- 在 SwooleProcess 中,客户端连接应当在 SwooleProcess->start 后,子进程的回调函数中创建;
- 必须在协程内捕获异常,不得跨协程捕获异常;
- 在
__get
/__set
魔术方法中不能有协程切换。
协程中的异常捕获
示例一:协程中使用exit函数抛出 ExitException 异常
function route()
{
controller();
}
function controller()
{
your_code();
}
function your_code()
{
co::sleep(.001);
exit(1);
}
go(function () {
try {
route();
} catch (SwooleExitException $e) {
var_dump($e->getMessage());
var_dump($e->getStatus() === 1);
var_dump($e->getFlags());
}
});
示例二:协程中使用exit函数抛出 ExitException 异常
$exit_status = 0;
go(function () {
try {
exit(123);
} catch (SwooleExitException $e) {
global $exit_status;
$exit_status = $e->getStatus();
}
});
swoole_event_wait();
var_dump($exit_status);
示例三:协程中直接抛出 RuntimeException 异常
function test() {
throw new RuntimeException(__FILE__, __LINE__);
}
SwooleCoroutine::create(function () {
try {
test();
}
catch (Throwable $e) {
echo $e;
}
});
以上是关于unity3d使用协程应该注意啥的主要内容,如果未能解决你的问题,请参考以下文章