Kohei Asai

Kohei Asai

2019/11/07に投稿
  • English
  • 日本語
  • Flutter製のテキサスホールデムポーカーの計算機をリリースしました

    Flutterで作ったiOS/Androidアプリを初めてストアに出しました。テキサスホールデムというポーカーの計算機で、複数人のハンドやハンドレンジからそれぞれ誰がどれくらいの勝率があるかを計算できるものです。

    ダウンロード

    Get it on Google Play Download on the App Store

    オープンソースにしており、こちらからコードも確認できます。IssueやStarなどでのフィードバックは励みになるので是非よろしくお願いします。

    実装について

    計算処理は所謂モンテカルロシミュレーションで、決められた回数をランダムに試行して平均勝率を算出しています。ポーカーでは互いの持っていそうなカードを複数の候補で予想しながら戦います。ここからプレイヤー人数分の組み合わせを考えるとO(n^m)の時間複雑度になり、全パターン試行するのが難しくなるためです。

    一定の精度で求めるには膨大な試行回数が必要になります。計算処理をUIと同じスレッドでするわけにはいかないので、UIスレッドと疎通を行うスレッドを別途用意して計算しています。Flutter (もといDart) ではこういったマルチスレッディングなどでの並列処理を抽象化したIsolateという概念があり、このアプリでもそれを利用しています。

    Flutter製のアプリをリリースするのはどうだったか

    さほど難しくないですが、やっぱりiOSとAndroidでの開発は経験しておいた方がいいです。コーディングに関する部分はFlutterによって抽象化されており、まったく知識がなくても扱えるようになっています。ですが、リリースに際しての証明書での署名や難読化、デバイスのアーキテクチャごとのビルドなど、各プラットフォームの知識があった方がいい箇所もあります。

    マルチスレッド

    前述のとおり抽象化されたIsolateという概念があり、凝ったことをしない限りは手軽に扱えます。制約のある安全でシンプルなAPIでガイドラインの意味も果たしています。Goのgoroutineと同じような感じだと思います。

    アニメーション

    Flutterではシーケンスなアニメーションと、Tweenを用いた値のグラデーションによるアニメーションの両方を扱えます。

    あまり凝ったアニメーションは実装していませんが、WebのDOMに比べてより手軽で身近な存在になっているように感じます。パフォーマンスが高いためにheightなどあらゆるUIのプロパティにてTweenを用いてアニメーションを実現できるためです。

    ダークモード

    FlutterにはMediaQueryというAPIがあり、これによって

    • ディスプレイのサイズや向き
    • 太いフォントを好んで利用するかどうか (iOS)
    • 24時間のタイムフォーマットを利用しているかどうか

    などデバイスやOSの設定の情報を取得できます。FlutterにはInheritedWidgetというReactのContextと同じ伝搬モデルがあり、MediaQueryはこのAPIに則っています。ダークモードもこのMediaQueryを使って簡単にUIに反映できます。

    Aqua Light Theme Aqua Dark Theme

    Flutterは何に向いていないと感じるか

    広告を入れたい場合

    Flutterはプラットフォームで用意されたUIフレームワークを利用せず、全画面にキャンバスを広げて独自のレンダリングシステムでUIを描画しています。そのためケースによってはネイティブ以上のレンダリングパフォーマンスを叩き出すのですが、通常、広告のSDKはプラットフォームごとのUIフレームワークに依存しているのでFlutterと相性が悪いです。

    カメラを軸としたアプリ

    これもFlutterが独自のレンダリングシステムを利用しているのが原因です。InstagramやSnapchatのようにカメラにフィルターを当てるようなアプリは作りにくいです。