ゴッホカメラの全体モジュール構成図
Mac | Mac OS X 10.7.5(Lion) |
---|---|
Windows | Windows7 Professional 64bit(VMWare Fusion4) |
マシン | iMac 2011 Mid Core i5 760@2.70GHz Mem=12GB(Win6GB,Mac6GB) |
HDD | 1TB(Win545GB,Mac299GB) |
Xcode | Xcode 4.6 |
iOS Target | 6.0以上 |
前回の「Storyboardで見る全画面遷移」ではゴッホカメラをユーザーに近い視点から全体像をご紹介しましたので、
今回はプログラム構成としてゴッホカメラの全体モジュール構成図を書いてみました。
ちなみに画面は現在Appleへ申請中のver1.02のものです。このバージョンから動画&GIFアニメ用画面が追加される予定です。
以下、くわしく
- 1)YasuhalGoghMain(ゴッホフィルタエンジンメインクラス)
このクラスはフィルタ関連の処理を何でもやってくれる便利屋さんです。
具体的には、以下の処理を行っています。
- フィルタ用画像バッファの管理 YasuhalGoghMainクラス内のYasuhalImageAcceleratorプロパティを使って行います。
- フィルタごとのパラメータ管理 こちらもクラス内プロパティの各フィルタクラス(YasuhalGoghPaint、YasuhalAquaPaint等)で行います。
- カメラデバイスとフィルタ処理のサポート カメラデバイスからのリアルタイム画像を受け取り、YasuhalImageAcceleratorへ転送したり、動画出力/アニメGIF出力クラスへ渡して出力処理を行います。
また、フィルタ適用を効率化する(大量にフィルタ変更を要求されたら間をskip)などの処理も行っています。
- 2)GoghBaseVC(ゴッホカメラ全画面のUIViewController基底クラス)
このクラスはゴッホカメラ全画面の基底クラスになっており、画面の切り替えや他の画面と共有したいクラスの管理等を行っています。
具体的には、以下のような処理を行っています。
- 画面の切り替えや他の画面と共有したいクラスの管理 ゴッホカメラはメモリの消費量が多く、画面切り替え時にメモリを保持しないようSegueでUIViewControllerの破棄を行っています。
- UIの処理も行う UIの処理も行っており、共通の処理を呼び出すだけで良いので各画面クラスから見ると縁の下の力持ち的な役割で便利です。
- アイテム/フレームの管理 アイテム/フレームの管理はUIの処理も含むためこのクラスで行っています。
その為次の画面で必要なクラスの受け渡しをこのクラスで行っています。
ただ、実のところゴッホカメラはUIが複雑なところも多く、めんどうな仕事はだいたい全部ここに行わせてしまっています。
- 3)残りのクラス
それぞれ概要だけ以下の通りご紹介致します。
- ファイル入出力クラス 静止画入出力(PhotoLoader、PhotoWriter)、ギャラリー入出力(GalleryFile)、設定ファイル入出力(GoghUserDefaults)、動画/アニメGIF入出力(VideoWriter,AnimGIFWriter,UIImage+GIF)、サウンド読み込み&再生(SimpleSound)、非同期カメラロール読み込み(AsyncFileReader)があります。
- 画面別VCクラス Storyboardで作成した画面別のUIViewControllerクラスです。
- カスタムUIViewクラス UIViewをベースにしたUI部品クラス郡です。
- パラメータVCクラス フィルタごとのパラメータ別のUIViewControllerクラスです。
- Segueクラス 画面と画面を繋ぐSegueのクラスです。
- Storyboard これはプログラムではありませんが、各画面クラスとの結びつきが強いため記載しました。
- その他クラス YasuhalUtilはクラスを作る必要のない小さなユーティリティ関数群です。
ゴッホカメラが画像ツールのため種類が多いのですが、機能別のクラスでまとまっておりAsyncFileReader以外は非常にシンプルです。
カメラ画面、アイテム画面、フレーム画面、保存画面、ファイル読み込み画面、サムネイル画面、、、など画面の数だけ存在します。
なお図の通り、カメラ画面はフィルタ画面を、動画/アニメGIF画面はカメラ画面をそれぞれ継承しています。
フレーム用、アイテム用、インジケータ、トーストなどそれぞれ用途別に分けて使いやすくしています。
切り替え時のアニメーションごとにカスタマイズしてクラスを分けています。
ゴッホカメラは1つのStoryboardだけで構成しています。
FaceRecognizeは顔認識用のクラスです。
私はプログラムをデータ入出力/ユーザーインターフェイス/メインの3つに分けて構成するので、だいたいどのアプリも似たような構成図になります。
この組み方は職業プログラマになってから定着したもので、様々な言語やクラス化により記述法は変わっても、基本として変わらない部分です。
どうも巷ではMVCモデルとか言うそうです。(他社に仕様書を見せた時指摘されました)
なので誰が作ってもこんな感じになるんじゃないかなーと思ってもいます。
プログラムに興味のある方や、経験の浅い若手プログラマーがコレを見て、もし工場萌え的な機能美を少しでも感じてくれたら、ちょっと幸せな気分ですね(*´Д`*)