2016-10-04 24 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; 

私はことにより、センサを停止しよう:

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のAndroidのセンサーの実装における監督のように見えるものにである:

はここでCPUの使用率の増加を示したスクリーンショットです。どうなりますか:

activate the sensor managerがAndroidの場合、TAndroidSensorManager.Activateが呼び出されます。これにより、すべての既知のAndroidセンサータイプの子孫であるTCustomSensorがインスタンス化され、現在のデバイスでサポートされていないものがすばやく削除されます。これにより、マネージャは、多数のカスタムセンサオブジェクトを管理したままになり、それぞれはTNativeSensorオブジェクトをsensor type enumeration valueで作成しました。これは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

関連する問題