Unity 使用Loom插件实现主线程与C#线程之间的切换

Unity多线程安全实践:从Thread红线到Loom插件进阶 Unity多线程并非禁止使用,而是严格限定安全边界——子线程可执行纯CPU计算,但禁止调用任何Unity引擎API(如transform、Time、Resources等),否则触发InvalidOperationException或未定义行为。其原理源于Unity主线程承载渲染、物理、生命周期等多重调度职责,所有MonoBehaviour回调和引擎对象访问均强制绑定主线程。技术价值在于解耦耗时任务与帧率瓶颈,显著提升资源加载、算法计算、网络请求和大数据处理的响应性。典型应用场景包括异步纹理加载、后台路径寻路 阅读详情

Loom代码如下:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
using System.Threading;
using System.Linq;

public class Loom : MonoBehaviour
{
    public static int maxThreads = 8;
    static int numThreads;
    private static Loom _current;
    private int _count;
    public static Loom Current
    {
        get
        {
            Initialize();
            return _current;
        }
    }

    void Awake()
    {
        _current = this;
        initialized = true;
    }
    static bool initialized;

    static void Initialize()
    {
        if ( !initialized )
        {

            if ( !Application.isPlaying )
                return;
            initialized = true;
            var g = new GameObject("Loom");
            _current = g.AddComponent<Loom>();
        }
    }

    private List<Action> _actions = new List<Action>();
    public struct DelayedQueueItem
    {
        public float time;
        public Action action;
    }
    private List<DelayedQueueItem> _delayed = new List<DelayedQueueItem>();

    List<DelayedQueueItem> _currentDelayed = new List<DelayedQueueItem>();

    public static  void QueueOnMainThread(Action action)
    {
        QueueOnMainThread(action, 0f);
    }
    public static void QueueOnMainThread(Action action, float time)
    {
        if ( time != 0 )
        {
            lock ( Current._delayed )
            {
                Current._delayed.Add(new DelayedQueueItem { time = Time.time + time, action = action });
            }
        }
        else
        {
            lock ( Current._actions )
            {
                Current._actions.Add(action);
            }
        }
    }

    public static Thread RunAsync(Action a)
    {
        Initialize();
        while ( numThreads >= maxThreads )
        {
            Thread.Sleep(1);
        }
        Interlocked.Increment(ref numThreads);
        ThreadPool.QueueUserWorkItem(RunAction, a);
        return null;
    }
    private static void RunAction(object action)
    {
        try
        {
            ((Action)action)();
        }
        catch
        {
        }
        finally
        {
            Interlocked.Decrement(ref numThreads);
        }

    }

    void OnDisable()
    {
        if ( _current == this )
        {

            _current = null;
        }
    }

    // Use this for initialization
    void Start()
    {

    }

    List<Action> _currentActions = new List<Action>();

    // Update is called once per frame
    void Update()
    {
        lock ( _actions )
        {
            _currentActions.Clear();
            _currentActions.AddRange(_actions);
            _actions.Clear();
        }
        foreach ( var a in _currentActions )
        {
            a();
        }
        lock ( _delayed )
        {
            _currentDelayed.Clear();
            _currentDelayed.AddRange(_delayed.Where(d => d.time <= Time.time));
            foreach ( var item in _currentDelayed )
                _delayed.Remove(item);
        }
        foreach ( var delayed in _currentDelayed )
        {
            delayed.action();
        }
    }
}

其中主要使用Loom中的两个函数:

 Loom.QueueOnMainThread(() => {//切换为主线程
              //todo 主线程的something
            });
            
 Loom.RunAsync(() =>{//切换为C#线程               
               //todo C#线程的something
            });          

在需要切换线程时候调用两个方法即可。

Unity多线程安全实践:从Thread踩坑到Loom工程化落地 多线程是提升Unity运行性能的关键技术,其核心原理在于将耗时计算与主线程解耦,避免阻塞渲染和交互。技术价值体现在保障帧率稳定、增强响应实时性、支持复杂IO与算法并行。典型应用场景包括图像处理、网络请求、模型加载、实时数据解析等。然而Unity引擎的API线程不安全性导致直接使用System.Threading.Thread极易引发崩溃、UI失效或静默失败。本文聚焦‘Unity线程安全边界’与‘主线程回调机制’两大热词,详解如何通过数据隔离、安全通信和生命周期绑定构建可靠多线程方案,并以Loom插件为工程化 阅读详情

相关推荐

Unity跨平台开发实战:GAID与IDFA获取、ATT合规与降级策略全解析

在移动应用开发中,设备唯一标识符是实现用户行为分析、广告归因和数据统计的技术基石。其核心原理在于为每台设备生成一个稳定、可重置的标识,用于在广告平台、数据分析后台与应用服务器之间准确关联用户行为,从而构建清晰的用户转化路径与画像。这一技术对于评估广告投放效果(ROI)、优化用户体验和实现精准运营具有关键价值,广泛应用于游戏、电商、社交等各类移动应用场景。随着iOS的ATT(App Tracking Transparency)框架和Android权限模型的持续收紧,开发者必须在Unity引擎中妥善处理GAID

weixin_33770878的博客 313

Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享

Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com            熟悉Unity的developer都知道在Unity中的线程不能使用Unity的对象,但可以使用Unity的值类型变量,如Vector3等。这样就使得线程在Unit...

qiudesuo的专栏 1929

Unity多线程编程实战Demo项目

现代异步编程范式普遍采用Task<T>、Promise/Future等抽象来表示尚未完成的操作。而在Unity中,由于缺乏对的良好支持(尤其是在较旧版本中),开发者往往需要借助协程模拟类似行为。为此,设计一个具备类Task语义的异步任务包装器成为必要手段。此类包装器的核心目标是:- 将协程封装成可链式调用的对象;- 支持成功回调、失败处理与进度通知;- 提供取消机制以避免资源浪费;- 隐藏和的细节,降低使用门槛。特性描述解耦性强。

weixin_42576467的博客 1063

Unity c#脚本中调用主线程方法

unity

翻肚鱼儿的博客 1570

c#实现unity下可用的http多线程下载

c#实现unity下可用的http多线程下载。主要是WWW接口的bundle函数不好用,而且性能也不高。支持多线程。支持单个文件和多个文件下载

loom:C99 的无锁线程池

loom -- C99 的无锁线程池 Loom 创建一个任务队列和工作线程池。 工作人员按计划运行任务,否则睡眠直到工作可用。 注意:这仍处于开发初期。 我已经在多核 x86 / x86-64 系统上对其进行了压力测试,它应该是安全无锁的,但在具有不同内存屏障的硬件平台上可能存在竞争条件。 __sync_bool_compare_and_swap在内部使用,因此可移植性将仅限于该功能可用的平台/编译器。 构建状态 主要特征: 无锁:通过在内部使用操作来避免锁争用开销。 无分配:初始化后不分配。 背压支持:backlog 大小是公开的,以允许对填充队列的上游代码进行成比例的推回。 可以针对特定应用程序调整线程数和任务队列的大小。 ISC 许可证:您可以自由使用它,甚至可以用于商业目的。 入门 首先,初始化线程池: /* The default configuration. I

Unity网络通信优化:Best HTTP插件核心原理与实战应用

HTTP协议作为现代应用网络通信的基石,其核心在于客户端与服务器之间的请求-响应模型。在Unity开发中,高效稳定的网络通信是实现游戏联机、资源加载和云服务集成的关键技术。原生UnityWebRequest方案在处理复杂场景时,往往在性能、稳定性和开发效率上存在局限。第三方HTTP插件通过底层优化和架构设计,提供了连接池管理、断点续传、智能重试等高级功能,显著提升了移动端和PC端的网络通信质量。这些技术价值在游戏资源下载、实时数据同步、RESTful API调用等应用场景中尤为突出。本文聚焦Best HTT

weixin_30251829的博客 300

Unity3D实现批量下载图片功能

主要为大家详细介绍了Unity3D实现批量下载图片功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Unity游戏集成Qwen3-ASR:实现低延迟本地语音交互的完整方案

语音识别(ASR)作为人机交互的关键技术,其核心原理是将音频信号转化为文本。传统云端方案虽通用性强,但存在延迟高、依赖网络的局限。在实时性要求苛刻的场景(如游戏、嵌入式设备)中,本地化部署的语音识别技术价值凸显,它能提供毫秒级响应并保障数据隐私。本文以3D游戏开发为应用场景,深入解析如何通过进程间通信(IPC)架构,将通义千问团队开源的Qwen3-ASR模型与Unity引擎深度集成,构建一套完整的实时语音指令系统。方案涵盖音频采集、流式传输、VAD(语音活动检测)与模型推理等核心环节,并针对性能优化与常见问

culuo8053的博客 731

【PyTorch版本兼容性指南】如何在不同版本中正确使用torch.nn.attention

本文详细解析了PyTorch版本兼容性问题,特别是torch.nn.attention模块在不同版本中的使用差异。针对常见的ModuleNotFoundError错误,提供了三种实用解决方案:升级PyTorch版本、使用自定义实现和源码移植方案,并分享了最佳实践建议,帮助开发者有效避免兼容性问题。

weixin_29084231的博客 471

人工智能训练师技能等级认定四级技能考核试卷-样题4

本文为人工智能训练师四级技能考核试卷,包含六个实操考核项目,总时长150分钟。考核内容涵盖:1)车牌数据集规范评估与格式处理;2)车牌数据集采集代码修改与数据处理;3)房价预测数据集加载、预处理与可视化分析;4)车牌标注数据集审核与修正;5)螺丝螺母检测数据集的平台创建与共享;6)螺丝螺母数据的去噪处理与标注优化。要求考生使用Python编程、数据处理平台和标注工具完成各项任务,重点考察数据加载、格式转换、缺失值处理、数据可视化、标注审核及平台操作等技能。所有操作需在配备Python3.7和深度学习平台的W

weixin_42221934的博客 348

Unity商业射击游戏开发:从架构设计到性能优化的完整指南

游戏开发是一个将创意转化为可交互产品的系统性工程,其核心在于构建稳定、可扩展的技术架构。在Unity引擎中,模块化设计、资源管理和网络同步是支撑项目长期迭代的基础。通过采用实体组件系统思维和配置数据驱动,开发者能实现数据与行为的有效分离,提升团队协作效率。对于追求商业成功的射击游戏而言,性能优化与多平台适配是技术价值的直接体现,涉及GPU Instancing、对象池、LOD等关键技术,以确保游戏在低端设备上也能流畅运行。这些工程实践最终服务于核心应用场景——打造兼具优秀手感和稳定体验的射击游戏,其中网络同

weixin_34268753的博客 408

船舶轨迹预测中的5个常见坑:基于LSTM单步预测的避坑实践

本文针对船舶轨迹预测中LSTM单步预测的常见问题,系统总结了五个典型陷阱及避坑实践。重点分析了如何正确处理AIS数据的非均匀采样与清洗、对航向角进行周期性编码、采用轨迹级归一化策略、缓解单步滚动预测的误差累积,并设计贴合业务的评估指标。这些实践能有效提升预测模型的准确性与实用性。

cnn8visionary的博客 631

unity 主线程调用_Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享...

Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享By D.S.Qiu尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com熟悉Unity的developer都知道在Unity中的线程不能使用Unity的对象,但可以使用Unity的值类型变量,如Vector3等。这样就使得线程在Unity中显的很鸡肋和蹩脚,因为很多函数很都是...

weixin_39616071的博客 438

Visual Studio 2022 社区版安装指南:从下载到配置的完整流程

本文详细介绍了Visual Studio 2022社区版的完整安装与配置流程,包括系统要求检查、官方下载步骤、工作负载选择、安装位置配置等关键环节。作为微软推出的免费集成开发环境,VS2022社区版支持多种编程语言,适合个人开发者和小型团队使用。文章还提供了常见问题解决和性能优化技巧,帮助用户高效完成开发环境搭建。

weixin_28829339的博客 875

VMvare 桥接模式无法联网、没有未桥接的主机网络适配器,无法将网络更改为桥接状态。

很多程序员,整天沉浸在业务代码的 CRUD 中,业务中没有大量数据做并发,缺少实战经验,对并发仅仅停留在了解,做不到精通,所以总是与大厂擦肩而过。我把私藏的这套并发体系的笔记和思维脑图分享出来,理论知识与项目实战的结合,我觉得只要你肯花时间用心学完这些,一定可以快速掌握并发编程。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!战项目源码讲义》点击传送门即可获取!**

q16974058的博客 4330

Unity回调到主线程

Unity回调到主线程

ms 1277

安卓APP通过CH340实现USB串口通信与设备检测

本文详细介绍了安卓APP通过CH340芯片实现USB串口通信与设备检测的完整流程。从CH340芯片的基础原理到开发环境搭建,再到串口通信的具体实现和错误处理,提供了全面的技术指导。文章还分享了USB热插拔处理、自动重连策略以及性能优化等实战技巧,帮助开发者高效完成安卓与嵌入式设备的通信开发。

weixin_42531925的博客 379

【Unity 多线程】Loom源码解析

unity loom

qq_22849251的博客 760

嵌入式开发环境Vscode开发STM32单片机程序

STM32单片机非常强大,大多数教程都是使用 keil 编译器,keil 是收费的而 gcc 是开源免费的。这里介绍一些使用 gcc +开发单片机程序的经验。(这里不解释 gcc 是什么)。

嵌入式技术开发 1842

12、认知地图的建模与学习

本博客系统介绍了认知地图的定义、背景及其在机器智能领域的应用,重点探讨了模糊认知地图(FCMs)的建模方法与优势。文章还对比分析了几种主流的认知地图模型(如Axelrod模型、Kosko模型等),并讨论了模型的稳定性条件及实际应用前景。通过智能制造和医疗诊断的具体案例,展示了认知地图在复杂因果推理中的强大能力,并提出了模型优化方向与未来研究展望。

plant的博客 209

【Unity / Thread】Unity 中子线程回调主线程的方法

Unity 引擎的游戏逻辑和渲染,都是在主线程中进行的,和大多数其他游戏引擎一样,Unity 也是一个单线程的引擎。这与常规开发的思路可能不太一样,通常认为多线程能够很大程度上提升程序的性能效率,何况是游戏这种需要大量资源和大量计算的复杂程序。其实不然,单线程能为游戏引擎开发和游戏开发带来很多好处,未经过精心设计的多线程也可能会为中后期开发带来灾难性的后果。但这不是本文要讨论的重点,感兴趣的话可以...

ls9512 6130

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C#线程切换

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace ConsoleApplication1 { class Program { public static void print1() { .

ChrisKyrie的博客 843

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C#中的null

什么是 null?null是所谓的文字关键字什么是文字关键字计算机是二进制表示一切,文字关键字就是以文字的形式表示某个特定的二进制值。比如ture,false也是文字关键字。可以认为true表示0x0001;false表示0x0000的bool值。C#1.X中的null=空指针MSDN中的解释:null 关键字是表示不引用任何对象的空引用的文字值。null 是引用类型变量的默认

xiaomin98的专栏 1959

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Loom开篇:Java 虚拟机的协程和延续

Project Loom 的使命是更轻松地编写、调试、分析和维护满足当今要求的并发应用程序。线程从 Java 的第一天开始就是一种自然而方便的并发结构(抛开线程之间通信的单独问题),因为它们当前作为操作系统内核线程的实现不足以满足现代需求,所以它正在被一些你不太容易理解的抽象模型所取代,并且浪费了在云中特别有价值的计算资源。(译者:指的是现有的线程模型是和操作系统线程一对一绑定的,会阻塞运行,你需要自己去构建响应式的程序来获取高的性能,比如webflux他就很难理解。

liuwenqiang1314的博客 1369
上一篇: Unity 简易第一人称角色控制器移动和视角控制
下一篇: Unity Pico手柄触摸圆盘滑动功能
爱尚游Bin
博客等级 码龄9年 86粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值