2012-08-24 3 views
4

우리는 게임이 "곧"필요로 할 다양한 자원을 동시에 "백그라운드에서"다운로드 할 방법을 찾고 있습니다. 우리의 요구 사항은 (1) 가능한 최대 다운로드 속도, (2) 게임을 운전하는 "전경"Runloop 활동의 최소 중단 가능성, (3) 우리에게 관심있는 모든 주요 플랫폼 (Android/iOS/PC/Mac), 그리고 (4) 해결책을 쇠약하게 만드는 버그가 없습니다.Unity3d : 백그라운드 네트워킹 활동 및 Unity 실행 루프

우리가 요구 사항 # 1을 충족하지 못하면 게임이 멈추고 배경 다운로드가 걸려서 필요한 자원을 제공 할 때까지 사용자를 대기시켜야합니다. 우리가 요구 사항 # 2를 충족시키지 못한다면, 배경 다운로드는 게임이 어떻게 진행되는지에 부정적으로 영향을 미치며, 갑작 스럽거나 반응이 느리다.

우리는 애셋 번들, WWW 및 네이티브 C# HttpWebRequest를 포함하며 그 중 일부는 우리의 모든 요구 사항을 충족합니다. 아래 세부 사항.

우리는 이미이 문제를 해결하는 방법을 알고 있다면 대화를 나누기를 원합니다. 여기

지금까지 우리의 경험의 세부 사항은 다음과 같습니다

우리는 유니티에 내장 된 안드로이드 응용 프로그램이 - 결국 또한 아이폰 OS를 통해 사용할 수. 일반적인 전경 활동과 더불어 포 그라운드에서 앱이 사용할 다양한 리소스를 다운로드하는 배경 우선 순위가 낮은 활동이 있습니다.

(최근에 변경된 사항이없는 한 Asset Bundle은 작동하지 않습니다. Unity의 다른 버전에서 작동하지 않습니다. 즉 Unity 3.5의 자산 번들이 Unity 3.5에서 작동하지 않습니다. 사용자를 업그레이드하면 다시 모든 자산을 다시 다운로드해야합니다.)

불행히도 'WWW'구성 요소를 사용하여 여러 가지 귀찮은 버그를 발견했습니다. 여기에는 네트워크가 손실되었을 때 업데이트하지 않고 웹 요청 (예 : '게시')의 반환 값이 없습니다. 따라서 우리는 우리의 WWW 사용을 네이티브 C# HttpWebRequest로 대체하려고합니다. 유감스럽게도, 공동 루틴을 통해 유니티 런 루프 (Unity Runloop)에서이 구성 요소를 사용하면 런 루프가 멈추고 UI가 멈 춥니 다.

하지만이 동일한 코드를 배경 C# 스레드 (공동 루틴 아님)에 배치 한 다음 해당 스레드의 활동을 폴링하면 작동하는 것 같습니다.

우리는 Unity 스케줄러와 조화를 이룬이 활동을 멀리에서 계획 할 수 있으므로이 접근법을 좋아하지 않습니다. 네트워크 (및 연관된 CPU) 활동이 Unity Run Loop의 적절한 틈에서 실행되기를 바랍니다. 그러나 우리가 말할 수있는 한, 우선 순위를 지정할 수있는 세 가지 방법이 있습니다 :

  • WWW.threadPriority - 우리는 WWW를 사용하지 않으므로 음소거입니다.
  • Application.backgroundLoadingPriority - 다운로드를 수행하기 위해 Unity 구성 요소 (예 : AssetBundles)를 사용하지 않으므로 아무 효과가 없다고 가정합니다.
  • YieldInstructions WaitForSeconds 및 WaitForFixedUpdate - 내 이해는 이들이 상당히 바보입니다. 실행 일정이 잡혀 있고 Unity Run Loop의 요구 사항을 따르지 않을 때 실행됩니다.

이해할만한 내용 : - WWW에 문제가 있습니까? 아니면 구성 요소를 사용 했습니까? - HttpWebRequest를 사용하는 사람이 Unity 앱을 사용하고 있습니까? 그들이 스레드 방식으로 그렇게 했습니까? - 유니티에 '인터럽트'또는 '우선 순위'아키텍처가있어 백그라운드 작업이 Unity Runloop을 사용하여 작동하고 글리치 또는 경쟁을 유발하지 않도록 할 수 있습니까?

+0

혹시 되었습니까 : 나는 here

WebClient를 예제를 사용,이 내가 전에 아니라 통일의 내부에 사용했던 system.net에서 웹 클라이언트는하지만, 그는 비동기 다운로드가 알고 좋은 해결책? 그렇다면 공유 할 수 있습니까? – ch3rryc0ke

+0

Unity Player가 단일 스레드 (하나의 메인 루프 만)로 실행됩니다. 백그라운드에서 다운로드 스레드가 필요한 경우 [Unity plugin approach (http://docs.unity3d.com/Documentation/Manual/Plugins.html)]를 사용할 수 있습니다.). 예를 들어 Android에서 주요 Unity 플레이어 활동에 협조 할 수있는 다운로드 활동을 만들 수 있습니다. – Maadiah

답변

0

WWW를 사용하고 싶지 않은 경우 빠른 Google 검색을 사용하면 this 마녀가 작동 할 수 있습니다.

WebClient webClient = new WebClient(); 

webClient.DownloadProgressChanged += OnChange; 
webClient.DownloadFileCompleted += OnCompleted; 
webClient.DownloadFileAsync(new Uri(download), fileAndPath);