2

API を使用しPhotoCameraて QR コード スキャン ページを作成しています (ZXing を使用)。ただし、このページはアプリのごく一部であるため、常に表示されるわけではありません。したがって、アプリケーションは、このページと共通のコントロールを持つ他のページの間を移動します。

問題は、スキャン後、アプリケーション全体が実際の理由もなく 60fps ではなく 30fps に遅くなることです。カメラがまだバックグラウンドで実行されていると思われ、フレーム同期によりアプリが 30 fps にロックされます。これが私の問題です。APIを使用するページを適切に破棄するにはどうすればよいですか?PhotoCamera

私のXAML:

<Grid Background="Black">
    <ProgressBar x:Name="PBar" IsIndeterminate="True" VerticalAlignment="Center" />

    <Rectangle x:Name="ScanRect">
        <Rectangle.Fill>
            <VideoBrush x:Name="ScanVideoBrush" />
        </Rectangle.Fill>
    </Rectangle>
</Grid>

スキャンプロセスを停止する私のC#:

    private void StopScan() {
        if (analysisTimer != null) {
            analysisTimer.Stop();
            analysisTimer = null;
        }

        if (focusTimer != null) {
            focusTimer.Stop();
            focusTimer = null;
        }

        if (camera != null) {
            camera.Dispose();
            camera.Initialized -= OnCameraInitialized;
            camera = null;
        }

        // Following two lines are a try to dispose stuff 
        // as much as possible, but the app still lags
        // sometimes after a scan...

        ScanVideoBrush.SetSource(new MediaElement());
        ScanRect.Fill = new SolidColorBrush(Colors.Black);
    }

注: Lumia 920 でアプリをテストしています。

4

1 に答える 1

0

呼び出しcam.Dispose();は、Camera オブジェクトによって使用されるイメージ ソース ストリームと空きリソースを破棄する必要があるため、問題ありません。

本当にメモリを解放していますか?つまり、PhotoCamera クラスのイベントからサブスクライブを解除していますか?

あなたのStopScanメソッドはいつ呼び出されますか?OnNavigatingFromの中で呼び出すことをお勧めしPhoneApplicationPageます。

PhotoCamera を破棄する MSDN のコード サンプルを次に示します。

protected override void OnNavigatingFrom(System.Windows.Navigation.NavigatingCancelEventArgs e)
{
    if (cam != null)
    {
        // Dispose camera to minimize power consumption and to expedite shutdown. 
        cam.Dispose();

        // Release memory, ensure garbage collection. 
        cam.Initialized -= cam_Initialized;
        cam.CaptureCompleted -= cam_CaptureCompleted;
        cam.CaptureImageAvailable -= cam_CaptureImageAvailable;
        cam.CaptureThumbnailAvailable -= cam_CaptureThumbnailAvailable;
        cam.AutoFocusCompleted -= cam_AutoFocusCompleted;
        CameraButtons.ShutterKeyHalfPressed -= OnButtonHalfPress;
        CameraButtons.ShutterKeyPressed -= OnButtonFullPress;
        CameraButtons.ShutterKeyReleased -= OnButtonRelease;
    }
} 

ソース

于 2013-02-04T09:33:27.227 に答える