Try MAXST AR Fusion Tracker Now ✨
List
TrackerManager.GetInstance().IsTrackerDataLoadCompleted() 체크 관련 문의입니다.
Posted Date: 2020-02-10 8:52     Edited Date: 2020-02-14 6:50     Writer: jowh

Please provide your development details as below;

1. SDK Version: 4.1.4
2. Development Environment: (eg. Unity-Android, Unity-iOS, Native Android, Native iOS) Unity-Android
3. Tracker/Scanner: Tracker
4. License Type(Free / Pro-One Time Fee / Pro-Subscription / Enterprise): Pro-One Time Fee
5. Target Device(Optional): 안드로이드 갤럭시 s6
 

트랙데이터 로드가 완료되는 시점을 체크하려고하는데..

항상 씬을 시작할때 True를 반환합니다. 

혹시 씬 처음 시작시 왜 True상태로 시작을하는지 알수 있을까요?

Start()이후에 

AddTrackerData를 호출하고난뒤에 체크를하면 False상태로 시작해서 데이터 로드가 모두 완료가되면 정삭적으로 True를 반환합니다

while (!TrackerManager.GetInstance().IsTrackerDataLoadCompleted())
{
    yield return null;
}

Posted Date: 2020-02-11 2:43     Edited Date: 2020-02-11 5:16     Writer: bhlee

IsTrackerDataLoadCompleted 함수가 True/False를 반환하는 기준은 로드하려는 데이터가 스레드에서 처리중인지 아닌지를 기준으로 합니다. 

SDK가 처음 구동될때, 타겟이 0개여도 SDK는 이미 돌고 있는 상태이며 True를 반환합니다.

그 후에 AddTrackerData를 사용하면 스레드에서 로드할 데이터를 처리하는 프로세싱이 진행되는 동안에만 False를 반환합니다. 

TrackingData는 SDK가 돌고있는 중에도 로드/언로드가 가능하며, 로드할 데이터가 몇개인지 딱 정해지지 않은 상황이기 때문에

로드할 데이터가 없는 모든 idle 상태에서는 True를 반환하는 것입니다.

감사합니다.

 

Leo

Maxst Support Team

Posted Date: 2020-02-11 10:25     Edited Date: 2020-02-13 4:46     Writer: jowh
private void AddTrackerData()
{
   Loading(true);

   foreach (var trackable in imageTrackablesMap)
   {
      if (trackable.Value.TrackerDataFileName.Length == 0)
      {
         continue;
      }

      if (trackable.Value.StorageType == StorageType.AbsolutePath)
      {
         TrackerManager.GetInstance().AddTrackerData(trackable.Value.TrackerDataFileName);
         TrackerManager.GetInstance().LoadTrackerData();
      }
      else if (trackable.Value.StorageType == StorageType.StreamingAssets)
      {
         if (Application.platform == RuntimePlatform.Android)
         {
            StartCoroutine(MaxstARUtil.ExtractAssets(trackable.Value.TrackerDataFileName, (filePah) =>
            {
               TrackerManager.GetInstance().AddTrackerData(filePah, false);
               TrackerManager.GetInstance().LoadTrackerData();
            }));
         }
         else
         {
            TrackerManager.GetInstance()
               .AddTrackerData(Application.streamingAssetsPath + "/" + trackable.Value.TrackerDataFileName);

            TrackerManager.GetInstance().LoadTrackerData();
         }
      }
   }
   
   StartCoroutine(CheckTrackerDataCompleteCo());
}

IEnumerator CheckTrackerDataCompleteCo()
{
   while (!TrackerManager.GetInstance().IsTrackerDataLoadCompleted())
   {
      yield return null;
   }
   Loading(False);
}

현재 테스트중인 기기(갤럭시 s6)의 처리 속도가 느려서 5~6초정도 데이터 처리과정이 있습니다.

그래서 데이터 처리과정을 로딩화면으로 처리하기 위해서 

ImageTrackerSample.CS 코드에서 TrackerManager.GetInstance().IsTrackerDataLoadCompleted()체크하는 것을 추가하였습니다.

정상이라면 데이터를 AddTrackerData호출후 44개의 데이터 처리가 완료가 되고나서 로딩패널이 꺼져야하는데.. 

씬 시작후 True상태에서 변화없이 계속 유지하며 카메라에 인식은 타겟을 대고있어도 5~6초정도  지나고 나서부터 인식이 됩니다.

 

1. Start

2. 로딩화면켜짐

3. IsTrackerDataLoadCompleted : False

4. IsTrackerDataLoadCompleted : True

5. 로딩화면꺼짐

6. 5~6초후

7. 인식됨

 

Start에서 AddTrackerData를 호출하지않고, 버튼으로 AddTrackerData를 호출하면  로딩 화면이 켜지고 정상적으로 5~6초동안 데이터 로드를하고 로딩 화면이 꺼지고 바로 인식 됩니다.

1. Start

2. 버튼클릭  AddTrackerData호출

3. 로딩화면켜짐

4. IsTrackerDataLoadCompleted : False

5. 5~6초후

6. 로딩화면꺼짐, IsTrackerDataLoadCompleted : True

7. 인식됨

 IsTrackerDataLoadCompleted체크 하는것 말고 다른 방법은 없나요?

Posted Date: 2020-02-14 1:23     Edited Date: 2020-02-14 1:23     Writer: bhlee

해당 문제는 유니티 초기화로 인한 문제같습니다. 

유니티에서 앱을 구동시켰을 때 최초에 유니티 구성요소들을 초기화 시키기 위한 시간이 필요합니다. 

그 이전에 데이터를 조작/제어하려 시도했다간 유니티 초기화가 완료되며 데이터가 날라가는 현상이 생깁니다.

그런 현상을 방지하기 위해서 제가 이전에 했던 프로젝트에서는 yield return new WaitForSeconds(1.0f); 와 같이 약간의 시간 텀을 둔 후에

초기화를 시키는 방식으로 구현을 하였습니다. 

시간텀을 두어 구현해보시기 바랍니다.

감사합니다.