先说一下原理.. 截图有两种方法,第一种: Application.CaptureScreenshot(url); 这个API可以截全屏并保存到指定路径 这里我们不采用此方法 下面的代码采用第二种方法,自己建一个Texture2D 这种方法灵活,操作性更高 WWWForm方法是用来提交到数据库的 WWWForm wwwForm = new WWWForm(); wwwForm.AddField("Username",name); wwwForm.AddField("ID&qu…
Unity的协程使用起来比较方便,但是由于其封装和隐藏了太多细节,使其看起来比较神秘.比如协程是否是真正的异步执行?协程与线程到底是什么关系?本文将从语义角度来分析隐藏在协程背后的原理,并使用C++来实现一个简单的协程,以揭开协程的神秘面纱.(文内代码为截图,可点击放大查看.) 一.什么是协程 简单来说,协程是一个有多个返回点的函数.一般来说一个函数只有一个返回点,函数的调用者调用一次后,函数的生命周期就结束了.而对于协程来说,其生命周期由调用者来决定,可以通过返回值来决定如何进行一次调用以及如…
前言: 协程在Unity中是一个很重要的概念,我们知道,在使用Unity进行游戏开发时,一般(注意是一般)不考虑多线程,那么如何处理一些在主任务之外的需求呢,Unity给我们提供了协程这种方式 为啥在Unity中一般不考虑多线程 因为在Unity中,只能在主线程中获取物体的组件.方法.对象,如果脱离这些,Unity的很多功能无法实现,那么多线程的存在与否意义就不大了 既然这样,线程与协程有什么区别呢: 对于协程而言,同一时间只能执行一个协程,而线程则是并发的,可以同时有多个线程在运行 两者在内存…
Unity开发不可避免的要用到协程(Coroutine),协程同步代码做异步任务的特性使程序员摆脱了曾经异步操作加回调的编码方式,使代码逻辑更加连贯易读.然而在惊讶于协程的好用与神奇的同时,因为不清楚协程背后的实现原理,所以总是感觉无法完全掌握协程.比如: MonoBehaviour.StartCoroutine接收的参数为什么是IEnumerator,IEnumerator和协程有什么关系? 既然协程函数返回值声明是IEnumerator,为什么函数内yield return的又是不同类型的返…
Unity协程(Coroutine)原理深入剖析 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 其实协程并没有那么复杂,网上很多地方都说是多线程什么的,真是误人子弟..在传统实时游戏中,在update中要延迟执行一些代码,或者满足一定条件后执行一些代码.需要在update添加一个计时器,用当前时间来减去前面记录的时间来判断执行.当这种情况越来越多的时候,会添加很多变量和代码,代码就越来越乱..实时游戏写多了就知道..这时候一般会抽象一个…
记得去年6月份刚开始实习的时候,当时要我写网络层的结构,用到了协程,当时有点懵,完全不知道Unity协程的执行机制是怎么样的,只是知道函数的返回值是IEnumerator类型,函数中使用yield return ,就可以通过StartCoroutine调用了.后来也是一直稀里糊涂地用,上网google些基本都是例子,很少能帮助深入理解Unity协程的原理的. 本文只是从Unity的角度去分析理解协程的内部运行原理,而不是从C#底层的语法实现来介绍(后续有需要再进行介绍),一共分为三部分: 线程(…
转载请标明出处:http://www.cnblogs.com/zblade/ 一.序言 在unity的游戏开发中,对于异步操作,有一个避免不了的操作: 协程,以前一直理解的懵懵懂懂,最近认真充电了一下,通过前辈的文章大体理解了一下,在这儿抛砖引玉写一些个人理解.当然首先给出几篇写的非常精彩优秀的文章,最好认真拜读一下: 王迅:Coroutine从入门到劝退​zhuanlan.zhihu.com Unity3d中协程的原理,你要的yield return new xxx的真正理解之道​blog.c…
原文摘自 Unity协程Coroutine使用总结和一些坑 MonoBehavior关于协程提供了下面几个接口: 可以使用函数或者函数名字符串来启动一个协程,同时可以用函数,函数名字符串,和Coroutine对象来终止一个协程. 使用上有这几种问题: 1,使用 Coroutine StartCoroutine(IEnumerator routine)来启动一些协程,能否使用StopCoroutine(string methodName) 和StopCoroutine(Coroutine rout…
0x00 前言 在使用Unity的过程中,对协程仅仅知道怎样使用,但并不知道协程的内部机理,对于自己不清楚的部分就像一块大石压力心里.让自己感觉到担忧和不适. 这篇文章一探到底,彻底揭开协程的面纱,让大家在使用中不再有后顾之忧. 0x01 概念 协程是:程序组件来生成非抢占式多任务子函数,生成的子函数同意在程序里挂起和唤醒操作. 0x02 使用场景 通常协程能够非常方便实现延时操作.以及异步载入操作.以下是两个简单协程使用样例. 延时操作 // Use this for initializati…
Unity协程(Coroutine)原理深入剖析再续 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 前面已经介绍过对协程(Coroutine)的认识和理解,主要讲到了Unity引擎在执行协程(Coroutine)的原理(Unity协程(Coroutine)原理深入剖析)和对协程(Coroutine)状态的控制(Unity协程(Coroutine)管理类——TaskManager工具分享),到这使用Coroutine的疑问就没有了,但是D…
[Unity协程使用经验] 1.协程的好处是,异步操作发起的地方和结束的地方可以统一在一个方法,这样就不用引入额外的成员变量来进行状态同步. 2.在一个协程中,StartCoroutine()和 yield return StartCoroutine()是不一样的. 前者仅仅是开始一个新的Coroutine,这个新的Coroutine和现有Coroutine并行执行.  后者是返回一个新的Coroutine,当这个新的Coroutine执行完毕后,才继承执行现有Coroutine. 3.由于协程…
Unity协程(Coroutine)原理深入剖析 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 记得去年6月份刚开始实习的时候,当时要我写网络层的结构,用到了协程,当时有点懵,完全不知道Unity协程的执行机制是怎么样的,只是知道函数的返回值是IEnumerator类型,函数中使用yield return ,就可以通过StartCoroutine调用了.后来也是一直稀里糊涂地用,上网google些基本都是例子,很少能帮助深入理解Unit…
我是快乐的搬运工: http://gulu-dev.com/post/perf_assist/2016-12-20-unity-coroutine-optimizing#toc_0 ------------------------------------------------------------------------ 分割线 ---------------------------------------------------------------------------- 目录: W…
博客分类: Unity3D插件学习,工具分享 源码分析   Unity协程(Coroutine)管理类——TaskManager工具分享 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 在分享vp_Timer 中提到,没有继承的MonoBehaviour,没有Update,InVoke 和StartCoroutine的机制,vp_Timer就是提供了InVoke的机制,而且还可以统一管理.本篇D.S.Qiu要分享的TaskManager就…
StartCoroutine在unity3d的帮助中叫做协程,意思就是启动一个辅助的线程. 在C#中直接有Thread这个线程,但是在unity中有些元素是不能操作的.这个时候可以使用协程来完成. 使用线程的好处就是不会出现界面卡死的情况,如果有一次非常大量的运算,没用线程就会出现假死的情况. 下面通过一个简单的例子来说明使用协程的好处: void OnGUI() { GUI.Label(new Rect(0, 0, 200, 50), "测试1:" + result); if (GU…
协程是不同步的 协程 不是 线程,协同程序是 不同步 的 一个线程在程序中和其他线程是异步运行的,在多处理器机器中一个线程可以同时与所有其他线程的实时运行其代码,这使得线程编程能够解决很复杂的事情,因为可能在相同的时间里一个线程在改变它而另一个线程正在读取它,这意味着另一个线程实际上可以改变的东西在游戏中处理的中间似乎是你的源代码一行.这是因为你写的代码是由机器变成汇编语言,更是更复杂.正因为如此,你必须通过锁,以确保这种情况不会由任何确保没有共享内存发生.或者通过锁定其他线程使用同一块内存,当…
using UnityEngine; using System.Collections; using System.Text; public class rotCube : MonoBehaviour { //示例,如何为一个自定义对象实现GetEnumerator接口,从而可以对该对象使用foreach //这种写法是c#2.0才有的,通过yield关键字与IEnumerator返回类型组合成一个枚举器 //C#会自动生成一个IEnumerator类,该类实现了MoveNext(),Reset…
unity终止协程提供了  StopAllCoroutines() 和 StopCoroutines() 两个方法, 但是都只能终止该文件内的 IEnumerator. 并且具体使用有点坑, 见如下实验:   结论: 单独终止xxx协程, 必须以 StartCoroutine("xxx") 开启, 以StopCoroutine("xxx")方式关闭.   Test1:          Test1 Run:   Test1结果:      成功停止了SayWorld…
先上效果图预览. ============================开始写实现方法================================ 1.我用的是UGUI,先在空场景中新建Slider和text组件,拖放到适当位置上 2.然后新建脚本,代码如下 using UnityEngine;using System.Collections;using UnityEngine.UI; public class Aegis : MonoBehaviour{ /// <summary> /…
想快速了解协程与网络调用的原来么,那么请赶紧关闭本页,因为下面都是在扯淡. 这几天是端午假期,第一天大算照着网上一大堆基于ucontext来写协程的文章自己也写一个简单的协程实现.于是第一天我就开始动手了,非常轻松愉快,毕竟是抄么.但是很多文章写到怎么用ucontext做切换就戛然而止了,很显然在我们日常协程用的比较多的网络应用中没有人会去做手工的协程切换,这些协程的切换调度其实都被封装在socket接口中,即在协程进行网络操作需要等待时调用yield使得当前协程挂起,在等待的时间到达时调用re…
Unity的协程是轻量的异步解决方案,但是每调用一次yield就必须等下一帧才能继续,这一点带来了很多约束. 比如如下代码: void OnEnable() { StartCoroutine(_Do()); } IEnumerator _Do() { Debug.Log("[A]Frame " + Time.frameCount); yield return null; Debug.Log("[B]Frame " + Time.frameCount); } 当然,也…
工作的流程是这样:某个协程在栈上创建task对象,在task对象内有需要返回的cv::Mat. 然后把task放到另一个线程上去执行,然后切换到别的协程,等到工作线程执行完task后,再唤醒协程. 这时候协程内去访问cv::Mat使用是empty. 同样的代码,task对象不是在栈上创建,而是new出来,一切正常. 暂未找到原因,怀疑与栈的拷贝有关.其实也打印了使用各个阶段的指针的地址,发现地址未发生改变.…
//通过StartCoroutine()开始一个协程//通过StopCoroutine();关闭一个协程//通过StopAllCoroutines()方法来实现关闭所有协程void Start(){Debug.Log("开始协程程序:执行开始时间:"+ Time.time);StartCoroutine("Ie_Demo1");//开始2个协程分别输出猪八戒和沙悟净StartCoroutine("Ie_Demo2");StartCoroutine…
你是不是遇到过协程停不了的情况?你是直接调用IEnumerator方法,如下? void Start () { StartCoroutine(IETest01()); StartCoroutine(IETest02()); } IEnumerator IETest01() { Debug.LogError("IETest01"); ); StopCoroutine(IETest02()); ); Debug.LogError("IETest01 end"); } I…
使用协程做计时功能应注意 1.协程中用到的组件,变量等被置空前,应该将协程置空 2.置空协程之前应停止协程 3.为了确保同一个协程同时只运行一次,可在协程开始前添加安全代码:判断改协程是否存在,存在则停止协程并将协程置空 实现方法: local function setMyTime() --注意(3) if this.countdown then coroutine.stop(this.countdown) this.countdown = nil end this.countdown = co…
local co_time_tbl = {} setmetatable(co_time_tbl, { __len = function(o) for k, v in pairs(o) do count = count + end return count end }) local function isWindows() , ) == "\\" end local function sleep(n) if isWindows() then then ) .. " localh…
最近写项目有用到html2canvas.js,可以实现页面的截图功能,但遭遇了许多的坑,特此写一篇随笔记录一下. 在使用html2canvas时可能会遇到诸如只能截取可视化界面.截图没有背景色.svg标签无法截取等问题,下面详细的说明一下. 一.导入html2canvas.js 这个不需要多说,可以从github上获取:https://github.com/niklasvh/html2canvas 也可以直接导入链接: <script src="https://cdn.bootcss.co…
<script type="text/javascript" src="js/html2canvas.js"></script> //布局截图 $(function(){ //布局截图 function htmlCanvas(){ html2canvas($(".J_screenshot"), { onrendered: function(canvas){ // document.body.appendChild(canv…
cropperjs使用不多说网上都有很详细的介绍如下面: https://blog.csdn.net/lxy4239/article/details/78920979 主要讲下使用的经历 裁剪后图片不失真效果显示 直接上代码: 链接:https://pan.baidu.com/s/1W1liylZzUwKNSt0CBIravw  密码:fypq 等比裁剪: <div class="btn-group btn-group-crop" id="cutout">…
前言 kindeditor是一个非常好用的富文本编辑器,它的简单使用我就不再介绍了. 而kindeditor却对图片的处理不够理想. 本篇博文需要解决的问题有两个: kindeditor扩展粘贴图片功能 kindeditor修改图片上传路径并通过webapi上传图片到图片服务器(支持分布式图片) 结果演示 1.扩展粘贴图片功能演示 2.修改图片上传路径演示: 我们的网站演示地址是:http://localhost:9393/ 我们的图片服务器地址是:http://localhost:9394/…