2016-10-04 9 views
1

Android에서 가속 센서를 사용하려고하면 코드로 센서를 중지하고 비활성화하려고해도 높은 CPU 사용량이 발생합니다.FireMonkey Android 가속 센서 높은 CPU 사용량

내 앱에서 가속 센서를 한 번만 읽어야하지만 FireMonkey가 응답하지 않고 센서를 멈출 수없는 것처럼 보입니다.

var 
    Sensor: TCustomSensor; 
begin 
    { attempt to get and activate the sensor manager } 
    FSensorManager := TSensorManager.Current; 
    FSensorManager.Activate; 

    { attempt to get an orientation sensor } 
    FSensors := TSensorManager.Current.GetSensorsByCategory(TSensorCategory.Motion); 

    FSensor := nil; 
    for Sensor in FSensors do 
    if TCustomMotionSensor(Sensor).SensorType = TMotionSensorType.Accelerometer3D then 
    begin 
     FSensor := TCustomMotionSensor(Sensor); 
     Break; 
    end; 

    if not Assigned(FSensor) then 
    begin 
    Exit; { no orientation sensor is available } 
    end; 

    { start the sensor if it is not started } 
    if not FSensor.Started then 
    begin 
    FSensor.Start; 
    Timer1.Enabled := True; 
    end; 
end; 

I에 의해 센서를 중지하려고 : 여기

코드입니다

FSensor.Stop; 
FSensorManager.Deactivate; 
FSensor.Free; 
FSensorManager.Free; 

하지만이 전혀 작동하지 않는 것 같습니다!

Before

After pushing button and activated sensor

+0

귀하는 제품 버전 사용에 관해 언급하지 않으 셨습니다. 질문을 편집하여 수정하십시오. – blong

+0

또한 앱의 CPU 사용량이 나타내는 범위에서 센서를 비활성화하려고해도 센서가 비활성화되지 않는다고 말하는 것일 수 있습니다. 이것은 가정입니까? 센서를 비활성화 한 후에도 계속 발생하는 이벤트를보고 포인트를 증명할 수 있습니까? 귀하의 질문을 보는 사람들의 "선들 사이에서 읽기"의 필요성을 진정시키기 위해 질문에 세부 사항을 추가하십시오. – blong

+0

"Rad studio 10.1 update 1"을 사용합니다. 갑자기 "FSensor.Start"가 실행되면 휴대 전화 CPU 사용량이 20 %로 증가합니다! 코드를 비활성화하고 "Fsensor"및 "FSensorManager"를 비우더라도 응용 프로그램을 닫을 때까지 줄어들지 않습니다. – khafan

답변

6

문제는 아래 FireMonkey 안드로이드 센서 구현의 감독으로 보이는 것입니다 :

여기에 CPU 사용량의 증가를 보여주는 스크린 샷입니다. 어떻게됩니까?

activate the sensor manager을 Android에 연결하면 TAndroidSensorManager.Activate이 실행됩니다. 이렇게하면 알려진 모든 Android 센서 유형에 대해 TCustomSensor 자손을 인스턴스화하여 현재 장치에서 지원되지 않는 것으로 발견 된 모든 요소를 ​​빠르게 제거합니다. 이로 인해 관리자는 많은 수의 사용자 지정 센서 객체를 관리하게되며, 각 객체는 인 TNativeSensor 객체를 Androidapi.Sensor 단위로 정의합니다.

지금까지 별거 아니야. 각 TNativeSensor 개체 생성자는 두 가지 NDK 루틴을 호출하여 ASensorManager_getDefaultSensorASensorManager_createEventQueue을 설정합니다. 지금까지 CPU에 눈에 띄는 영향은 없습니다.

Starting the sensor은 기본 TNativeSensor이 NDK ASensorEventQueue_enableSensor 루틴을 호출하게하며, 여기에서 CPU가 pummeled됩니다.

Stopping the custom sensor objectASensorEventQueue_disableSensor을 호출하면 CPU 사용이 중단 될 수 있습니다. 그러나 실제로는 그렇지 않습니다.

센서에서 CPU 사용을 적절히 제거하려면 고유 한 센서 이벤트 대기열을 없애야합니다 (즉, 실제 실험을 통해). 즉, 이전 호출을 ASensorManager_createEventQueue으로 되돌립니다. 그러나 FireMonkey Android 코드는이 작업을 수행하지 않습니다. 코드에 ASensorManager_destroyEventQueue에 대한 호출이 없습니다. ಠ╭╮ಠ

:이 의미

는, 내부 포함한 nil에 센서 및 센서 관리자에 대한 모든 참조 및 모든 센서 객체를 설정 한 다음 여전히 CPU 히트를 얻을 파괴 얻을 경우에도 것입니다

델파이 10.1 베를린에서 유효한 것으로 보이는 동작을 얻을 수있는 유일한 방법은 (현재 업데이트없이) System.Android.Sensors.pas를 수정하는 것입니다.이 이론을 테스트하기 위해 마찬가지로하고 싶은 경우, 여기 단계는 다음과 같습니다

프로젝트에서
  • 이 RTL 폴더에 복사 $ (BDS) \ 소스 \ 속으로 RTL

  • 라는 새 폴더를 만들 rtl \ common \ System.Android.Sensors.pas 여기서 $ (BDS)는 Delphi 설치 폴더입니다.

  • 이 복사 된 파일을 프로젝트 관리자를 사용하여 프로젝트에 추가하십시오.

이제 복사 한 System.Android.Sensors.pas를 변경하십시오.

destructor Destroy; override; 

이 소멸자 구현 : TNativeSensor의 공개 섹션에서 소멸자 선언에 추가

destructor TNativeSensor.Destroy; 
begin 
    ASensorManager_destroyEventQueue(FSensorManager, FNativeEventQueue); 
    inherited; 
end; 

컴파일하고 실행하고 CPU 히트는 센서 객체에 대한 모든 참조가 완전히 때 내려한다 nil으로 설정하십시오.

+0

이것에 버그를 기록 할 것입니다. – blong

+2

버그 보고서 : https://quality.embarcadero.com/browse/RSP-16016 – blong

+0

문제를 완전히 해결하고 CPU 사용량을 줄입니다. 당신의 도움을 주셔서 감사합니다. – khafan