TrackerManager.GetInstance().IsTrackerDataLoadCompleted() 체크 관련 문의입니다.
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; }
IsTrackerDataLoadCompleted 함수가 True/False를 반환하는 기준은 로드하려는 데이터가 스레드에서 처리중인지 아닌지를 기준으로 합니다.
SDK가 처음 구동될때, 타겟이 0개여도 SDK는 이미 돌고 있는 상태이며 True를 반환합니다.
그 후에 AddTrackerData를 사용하면 스레드에서 로드할 데이터를 처리하는 프로세싱이 진행되는 동안에만 False를 반환합니다.
TrackingData는 SDK가 돌고있는 중에도 로드/언로드가 가능하며, 로드할 데이터가 몇개인지 딱 정해지지 않은 상황이기 때문에
로드할 데이터가 없는 모든 idle 상태에서는 True를 반환하는 것입니다.
감사합니다.
Leo
Maxst Support Team
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체크 하는것 말고 다른 방법은 없나요?
해당 문제는 유니티 초기화로 인한 문제같습니다.
유니티에서 앱을 구동시켰을 때 최초에 유니티 구성요소들을 초기화 시키기 위한 시간이 필요합니다.
그 이전에 데이터를 조작/제어하려 시도했다간 유니티 초기화가 완료되며 데이터가 날라가는 현상이 생깁니다.
그런 현상을 방지하기 위해서 제가 이전에 했던 프로젝트에서는 yield return new WaitForSeconds(1.0f); 와 같이 약간의 시간 텀을 둔 후에
초기화를 시키는 방식으로 구현을 하였습니다.
시간텀을 두어 구현해보시기 바랍니다.
감사합니다.