Skip to content

Flutter Compute #

Find similar titles

4회 업데이트 됨.

Edit
  • 최초 작성자
  • 최근 업데이트
    hey

Structured data

Category
Programming

Compute이란? #

Compute는 단일 스레드로 구성된 플러터에서 새로운 스레드를 구성하여 이벤트 루프와 데이터 전송, 수신을 분리하는 목적으로 제작하였다.

Compute의 동작 원리 #

Compute를 왜 쓰는지 알아보자. 이것을 알기 위해서는 단일 스레드 구성으로 된 플러터의 구조를 먼저 알아야 한다.

Image

  • 플러터는 하나의 스레드로 사용자의 이벤트(터치, 스크롤, 탭 등), JSON 통신, 각종 연산을 진행한다.

  • 순간에 갑자기 많은 데이터 입력이 들어오면 모바일 기기에서 순간적으로 처리해야 할 연산이 많아진다. 그러면 화면이 버벅댄다. (1ms당 60프레임을 지켜야 화면이 자연스럽게 넘어간다.)

  • 버벅대지 않게 하기 위해서는 새로운 스레드를 만든다. 사용자 이벤트를 메인 스레드에서 처리하고 큰 연산(데이터 송수신, 각종 비용이 많이 드는 연산)은 새롭게 만든 스레드에서 처리하게 된다.

  • 일을 분산하기 때문에 메인 스레드에서 순간적으로 처리해야 할 일이 줄어들어 화면이 버벅대지 않는다.

Compute의 매개변수 #

Compute에서 중요한 부분은 Compute(함수, 매개변수) 형태로 구성되어 있다는 점이다. Compute의 두 번째 인자는 사용자가 만든 함수의 매개변수이다. 이 부분은 매우 중요하다. 여기에 들어갈 수 있는 매개변수는 bool, String, int 등 원시 함수를 넣는 것을 추천한다. (Duration, Datetime 같은 변수는 안될 때가 많다.)

    String stringData;

    /// String=>CSV변경
    csv = await compute(ChangingHealthData, stringData);

    Future<File> ChangingHealthData(String stringData) async{
        File csvFile;
        bool status;

        //String 변수 파일을 CSV 파일 형식으로 바꾸기
        csvFile =
        await LifelogGenerator().changeString2CSV(csvStringFile:                stringData);


        print("csv파일까지 변환 완료.");

        return csvFile;
    }

  • 위 코드에서 ChangingHealthData는 문자열을 CSV File 데이터로 바꾸는 함수이다.

  • 큰 용량의 문자열은 메인 스레드에서 처리하면 많은 리소스를 사용한다. 따라서 새로운 스레드를 만들어 메인 스레드가 아닌 다른 스레드로 이 연산을 진행한다.

Image

Compute 매개변수와 일반함수의 매개변수 차이 #

위 코드를 보면 메인 스레드에서 동작하는 함수와 새로운 스레드를 만들어 작동하는 함수의 차이를 알 수 있다. Compute를 사용한 함수는 매개변수를 하나만 받을 수 있지만 메인 스레드에서 동작하는 함수는 매개변수를 사용자가 지정한 개수만큼 설정할 수 있다. 즉 Compute는 오직 한 개의 매개변수만 사용할 수 있다.

String userId;
BuildContext context;

    void getFromMyServerToMyHealth(String userId, BuildContext context)     async {
        var chartData = await api.GetMyHealthData(id: userId);
        getLifelogAPI(context,userId);
        final healthData = context.read<HealthData>();
        if (chartData.isNotError(context)) {

            healthData.setData(chartData.data);
        }

}

///자사 서버 연동.
    await getFromMyServerToMyHealth(userId, context);

Compute에서 주의할 점 #

  • Compute 실행 도중에 setState를 사용하면 에러가 난다. (물론 Build를 여기에서 하지 못한다.)

  • Compute 매개변수는 한 개, 원시 변수(String, int 등)를 사용한다.

  • Compute에 들어간 변수를 다른 함수, 클래스에서 사용할 수 없다. (입구, 출구가 하나인 터널과 비슷한 원리이다.)

정리 #

플러터에서 새로운 스레드를 구성할 방법은 Isolate와 Compute 두 개이다. 이 부분은 다른 언어와 비교해서 종류가 매우 적다. (21년 12월 기준) 또한 Method.invoke와 같이 네이티브 UI가 새로운 스레드에서 빌드하려고 할 때 에러가 나는 문제도 있다.(Isolate, Compute 안에서 빌드할 수 없다. 터널을 생각하시라) 그래서 화면 구성보다 데이터 처리에 많이 쓰인다. 세부적으로 Compute를 사용할 때 API 통신에 주로 쓰이고 Stream 데이터 처리에 많이 쓰인다. 다른 사람들이 이렇게 쓰는 이유가 있는 만큼 자신의 조건에 맞게 잘 사용했으면 좋겠다.

참조링크 #

Suggested Pages #

0.0.1_20230725_7_v68