목차
하나, 전언 :
코루틴은 Unity에서 매우 중요한 개념입니다. 게임 개발을 위해 Unity를 사용할 때 멀티스레딩은 일반적으로 고려되지 않습니다. 그러면 Unity가 제공하는 기본 작업 이외의 일부 요구 사항을 어떻게 처리해야 할까요? 제공됩니다.
Unity에서 멀티스레딩이 일반적으로 고려되지 않는 이유는 무엇입니까?
왜냐하면 Unity에서는 객체의 컴포넌트, 메소드, 객체 등을 메인 스레드에서만 얻을 수 있기 때문입니다. 이들이 분리되면 Unity의 많은 기능을 구현할 수 없으므로 멀티스레딩의 존재는 별 의미가 없습니다.
스레드와 코루틴의 차이점은 무엇입니까?
코루틴의 경우 동시에 하나의 코루틴만 실행할 수 있지만 스레드는 동시에 실행될 수 있으며
두 스레드는 동일한 메모리 사용량을 가지며 스택을 공유하지 않는
것이 실제로 가장 좋습니다 . 두 가지 모두 가장 간단한 차이점은 미시적으로 스레드는 병렬(멀티 코어 CPU의 경우)인 반면 코루틴은 직렬이라는 점입니다. 이해하지 못하더라도 상관없습니다.
2. 코루틴에 대하여
1. 코루틴이란 무엇입니까?
코루틴은 말 그대로 프로그램을 보조하는 것을 의미합니다. 메인 작업을 수행하는 동안 최종 효과를 달성하기 위해 함께 작업할 몇 가지 분기 작업이 필요합니다. 이를 좀 더 생생하게 설명하겠습니다. 많은 리소스를 소비하는 작업이 필요합니다. 이러한 작업을 하나의 프레임에서 구현하면 게임이 매우 지연될 수 있습니다. 이때 코루틴을 사용하여 특정 프레임 내에서 작업을 완료할 수 있습니다. 주요 작업의 진행에 영향을 미치지 않습니다.
2. 코루틴의 원리
우선, 코루틴은 스레드가 아니라는 점을 이해해야 합니다. 그런 다음 코루틴이 반복자를 통해 함수를 구현한다는 점을 알아야 합니다. IEnumerator를 사용한다는 점에 유의하세요. IEnumerable 대신.
둘 사이의 차이점은 다음과 같습니다.
IEnumerator: 반복자 함수를 구현하는 인터페이스입니다. IEnumerable: IEnumerator를 기반으로 하는 캡슐화된 인터페이스입니다. 반복자에서
IEnumerator를 반환하는 GetEnumerator() 메서드가 있습니다 .
. 이는 코루틴의 기능을 구현하는 주요 방법입니다. 이 키 메서드를 통해 코루틴 실행을 일시 중지하고 다음 시작 시간과 위치를 기록할 수 있습니다.
반복자에 대한 자세한 설명은 반복자에 대한 자세한 설명을 위한 C# 공식 문서 를 참조하세요 .
3. 코루틴 사용
오해:
코루틴이 거의 모든 프레임에서 실행되고 장기 실행 작업 중에 일시 중지되지 않는 경우 일반적으로 코루틴을 Update 또는 LateUpdate 콜백으로 바꾸는 것이 더 합리적입니다. 예를 들어 장기 실행 또는 무한 루핑 코루틴이 있습니다.
중첩 사용을 최대한 줄입니다. 중첩된 코루틴은 코드 구성 및 유지 관리에 매우 유용하지만 코루틴 추적 개체 자체로 인해 메모리 오버헤드가 높아집니다.
1. 기능적 접근
전송 함수를 사용하여 코루틴을 시작합니다.
StartCoroutine(Cor_1());
코루틴을 중지합니다: (❎ 잘못된 사용법 1)
StopCoroutine(Cor_1());
처음 배울 때 이렇게 했는데 왜 안되는지 모르겠습니다. 나중에 보니 같은 함수 이름이 전달되었음에도 정지할 때 전달된 함수의 주소가 처음에 전달된 함수의 주소가 아니었습니다.
코루틴을 중지합니다: (❎ 잘못된 사용법 2)
StopCoroutine(”Cor_1“);
초보자를 위한 잘못된 사용법: 코루틴을 시작하려면 함수를 전달하는 방법을 사용하고, 코루틴을 중지하려면 문자열을 전달하는 방법을 사용합니다.
그렇다면 StartCoroutine(Cor_1());을 사용하여 코루틴을 시작하는 경우 어떻게 수동으로 중지할 수 있습니까? 계속 읽어주세요…
2. 함수명의 방법
함수 이름을 전달하여 코루틴을 시작합니다.
StartCoroutine("Cor_1");
코루틴을 중지합니다.
StopCoroutine(”Cor_1“);
이렇게 사용하는데는 문제가 없습니다(내부 구현에서는 <Key, Value> 형태로 저장하는 것 같아요).
단점: 하나의 매개변수 전달만 지원합니다.
1과 2에서 함수 이름 형태의 열기 및 닫기만 가능하다는 결론을 내릴 수 있지만, 이는 방법 1에 남아 있는 문제를 해결하지 못합니다. 계속해서 읽어주세요...
3. 반환값 받기
코루틴을 시작하는 데 다음 방법 중 어떤 방법을 사용하든 반환 값을 종료하여 해당 코루틴을 중지할 수 있습니다.
private Coroutine stopCor_1;
private Coroutine stopCor_2;
stopCor_1 = StartCoroutine("Cor_1");
stopCor_2 = StartCoroutine(Cor_2());
코루틴을 중지합니다.
StopCoroutine(stopCor_1);
StopCoroutine(stopCor_2);
반환 값을 수신하는 이 방법을 사용하면 필요에 따라 코루틴을 중지할 수 있습니다.
이렇게 하면 방법 1과 2에 남아 있는 문제가 해결됩니다.
4、StopAllCoroutines
어떤 방식으로든 코루틴을 시작하세요.
StartCoroutine("Cor_1");
StartCoroutine(Cor_2());
StopAllCoroutines를 사용하여 중지할 수 있습니다.
StopAllCoroutines();
StopAllCoroutines()는 현재 스크립트의 모든 코루틴을 중지할 수 있습니다.
참고 사항:
나중에 로직을 수정할 때 새로운 코루틴을 생성할 수도 있고, 멈추지 않고 중지할 수도 있으므로 주의해서 사용하는 것이 좋습니다(어떻게 아는지는 묻지 마세요)
. 호출 스크립트를 종료해야 함(예: 연결 끊기 및 다시 연결) 모든 상태를 재설정해야 함)
5. 게임 개체 비활성화/파기
게임 개체 코루틴을 비활성화/파기하면 중지됩니다. 객체가 다시 활성화되면 코루틴은 더 이상 실행되지 않습니다.
gameObject.SetActive(false);
//通过销毁游戏对象方式和禁用同效果
//Destroy(gameobject)
그게 아니다:
script.enabled = false;
즉, 숨겨진 스크립트에 의해 마운트된 게임 개체입니다(상위 개체가 숨겨진 경우에도 마찬가지입니다).
6. 수익률 소개:
yield return null; // 下一帧再执行后续代码
yield return 0; //下一帧再执行后续代码
yield return 6;//(任意数字) 下一帧再执行后续代码
yield break; //直接结束该协程的后续操作
yield return asyncOperation;//等异步操作结束后再执行后续代码
yield return StartCoroution(/*某个协程*/);//等待某个协程执行完毕后再执行后续代码
yield return WWW();//等待WWW操作完成后再执行后续代码
yield return new WaitForEndOfFrame();//等待帧结束,等待直到所有的摄像机和GUI被渲染完成后,在该帧显示在屏幕之前执行
yield return new WaitForSeconds(0.3f);//等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间会受到Time.timeScale的影响);
yield return new WaitForSecondsRealtime(0.3f);//等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间不受到Time.timeScale的影响);
yield return WaitForFixedUpdate();//等待下一次FixedUpdate开始时再执行后续代码
yield return new WaitUntil()//将协同执行直到 当输入的参数(或者委托)为true的时候....如:yield return new WaitUntil(() => frame >= 10);
yield return new WaitWhile()//将协同执行直到 当输入的参数(或者委托)为false的时候.... 如:yield return new WaitWhile(() => frame < 10);
4. 요약:
- StartCoroutine(function());을 사용하여 시작된 경우 반환 값을 수신해야만 중지할 수 있습니다. [매개변수 수에는 제한이 없습니다.]
- StartCoroutine("함수 이름"); 형식을 사용하여 시작하는 경우 StopCoroutine("함수 이름"); 형식을 사용하여 중지하거나 반환 값을 수신하여 중지할 수 있습니다. [단점: 하나의 매개변수만 전달할 수 있음]
- 두 가지 열기 형식 모두 StopAllCoroutines()에 의해 제어됩니다. StopAllCoroutines()는 현재 스크립트의 모든 코루틴을 중지할 수 있습니다.
- gameObject.SetActive(false); 이 GameObject의 모든 코루틴을 중지할 수 있으며 다시 활성화되면 코루틴이 계속되지 않습니다.
- StopCoroutine(function()); script.enabled = false; 코루틴을 중지할 수 없습니다.
5. 주의사항
코루틴을 사용하면 성능에 영향을 미치므로 실제 프로젝트에서는 주의해서 사용해야 합니다.