『こなへん』ができるまで  ☆リリース直前編☆     西山信行    5mingame2
はじめに• 私はこれまでにiPhoneアプリをシ  リーズ物とかで12本くらいリリース  している、ほんのり専業アプリ開発  者です。• Objective-Cは5年目、C++は2年目。
はじめに• 5月末に、生まれて初めてほぼC++で書  いたiPhoneアプリ『こなへん』が無事公  開されました!皆さんのおかげです!  多謝。 – 今回は実験的に、拙ブログにて公開直前   バージョンのソースを配布していますので   併せてど...
はじめにそれでは、まずはみなさん一番困っているであろう『こなへん』の発音から。
前回までのあらすじ• 新ジャンル「マゾプログラミング」• C++とOpenGLとOpenALでマルチプ  ラットフォームなゲームが作れる• 「3M」プログラミング – 画像・サウンドの読み込み処理ない…マゾい – 日本語テキスト表示ない…マゾい...
今回のマゾプログラミング•   GameCenter & iAd対応はどうした•   ローカライズはどうした•   テスト&デバッグはどうした•   動作パフォーマンスはどうした
GameCenter & iAd対応
GameCenter & iAd対応• アプリはUIViewControllerが1つだけ  の単純な構造 –XcodeのOpenGL ESのひな形まんま
GameCenter & iAd対応• まず、そのUIViewControllerに  GKLeaderboardViewControllerDelegateと  ADBannerViewDelegateを担当させる
GameCenter & iAd対応• GameCenter.mmというソースを用意。  GameCenter関連を処理する関数群をそ  こに押し込んだ。• クラスにはしないですべて関数で実装  – これだとC++のコードから関数が呼び出せる。...
GameCenter & iAd対応
GameCenter & iAd対応
GameCenter & iAd対応
ローカライズ
ローカライズ• iPhoneの NSLocalizedString() を真似  る所からスタート –定義ファイルをutf-8で用意   • en.langとかjp.langとか –[元のテキスト] TAB [翻訳テキスト] –その定義ファイル...
ローカライズ
ローカライズ• さて、準備はできたけど、C++で  実行環境が「英語」なのか「日本  語」なのかはどうやって調べよう  か…
ローカライズ• Windowsはstd::localeを使って言語環  境を判定 std::locale lc(“”); if (lc.name() == std::string(“Japanese_Japan.932”)) { /* jp.l...
ローカライズ• OSXは CFCopyLocalizedString() で判定• iOSは NSLocalizedString() で判定• どういう事?
ローカライズ• OSXとiOSは Localizable.strings を用意 するだけで読み込む定義ファイルを 決められる。簡単!• “langFile” = “en.lang”; とか書いておく。 – NSLocalizedString(...
ローカライズ• そして、 NSLocalizedString() 同様  std::string text = localize.get(“hoge”);  みたいにして、文字列を取得するよう  になっています。
テスト&デバッグ
テスト&デバッグ• 僕はプログラムの動作中に状況を簡  単に確認できるデバッグプリントが大  好きなので、いろんな場所で  std::cout << “座標:” << x << “,” << y <<  std::endl;  とかしたくなるの...
テスト&デバッグ• Xcode –コンソールに表示される• Windows –へんじがない ただの しかばねの ようだ
テスト&デバッグ• マリアナ海溝よりも深い理由がある  のか。この件、VisualStudioはいいか  げん対応してほしい! – VisualStudio2010調べ• でも自分でなんとかできちゃった。
テスト&デバッグclass DbgStreambuf : public std::streambuf {   std::vector<char> str_;public:   int_type overflow(int_type c = EOF...
テスト&デバッグDbgStreambuf dbgStream;std::streambuf *stream;stream = std::cout.rdbuf(&dbgStream);std::cout << "hogehoge" << std:...
テスト&デバッグ• NSLog() は、リリースビルドだと処理  がスキップされるようになっている。• std::cout も同じようにできないだろう  か…
テスト&デバッグ• こう書くことで解決。  #ifdef _DEBUG   #define DOUT std::cout  #else   #define DOUT 0 && std::cout  #endif DOUT << “hoge pi...
テスト&デバッグ• その他デバッグ機能の紹介 –キーを押してスナップショット –キーを押してどこでもポーズ –連続スナップショット –マップ確認&データ変換ツール –地球プレビュワー
動作パフォーマンス
動作パフォーマンス• 『こなへん』の地球は、1つの球体  データをテクスチャを切り替えたり  して何度も重ね描きしています。
動作パフォーマンス• 開発中期、iPhone4でだけ30fpsになる  現象が発生して慌てた。 – iPhone3GSは常時60fps。• iPhone4の画像プロセッサには Retina  ディスプレイはしんどいらしい。 – これをどうやって...
動作パフォーマンス• Xcode4から導入された  OpenGL ES Performance Detective  Instruments(OpenGL ES Analysis)  を使って描画負荷の原因を調べてみた。  – アップルから配布...
動作パフォーマンス• 診断の結果なんと  「頂点バッファを使え」  「テクスチャ圧縮を使え」  と具体的に指摘されました。英語で  ですが…(汗) –これに対応したらiPhone4でもほぼ  60fpsを達成できた
動作パフォーマンス• CPU負荷はXcodeの  Instruments (Time Profiler)  で計測。CPUの負荷を計測したり、処理  の重い関数をリストアップしてくれる! – これもアップルから配布されている「Instrumen...
動作パフォーマンス• 計測の結果「プログラム最適化の  必要なし」 – C++初心者ゆえのダサい書き方は放置 – 計測で問題なければ、最適化をする必   要は「まったく」無い。
動作パフォーマンス• 問題が発生した時に、まずは処理  負荷を計測、「負荷となっている箇  所」を絞り込む作戦で問題を解決  できた。• 結果、初代iPadでもほぼ60fps!• 僕は勘で直せるほど精通してない  ので…:P
まとめ
まとめ• GameCenter & iAd対応  – iOSに特化した処理なので、大人しくObjective-C    で書いた。• ローカライズ  – OSXやiOSのを真似て自分で実装した。• テスト&デバッグ  – デバッグビルドで検証用...
余談• 今回サポートページをfacebookに  作って直接リンクを設定したけどリ  ジェクトされなかった:D – facebookのアカウントが無くても、アプリ   の情報や連絡先が見られるようにした   からいい…のかな?
おしまいです• こんな感じですが…マゾっぽくないみな  さんの参考になりましたでしょうか… – blog 「でらうま倶楽部」    • http://blog.livedoor.jp/tek_nishi/ – twitter    • @5mi...
『こなへん』ができるまで ☆リリース直前編☆
Upcoming SlideShare
Loading in …5
×

『こなへん』ができるまで ☆リリース直前編☆

8,186 views

Published on

第3回iphone_dev_jp 東京iPhone/Mac勉強会で発表したスライドです

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
8,186
On SlideShare
0
From Embeds
0
Number of Embeds
5,685
Actions
Shares
0
Downloads
8
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

『こなへん』ができるまで ☆リリース直前編☆

  1. 1. 『こなへん』ができるまで ☆リリース直前編☆ 西山信行 5mingame2
  2. 2. はじめに• 私はこれまでにiPhoneアプリをシ リーズ物とかで12本くらいリリース している、ほんのり専業アプリ開発 者です。• Objective-Cは5年目、C++は2年目。
  3. 3. はじめに• 5月末に、生まれて初めてほぼC++で書 いたiPhoneアプリ『こなへん』が無事公 開されました!皆さんのおかげです! 多謝。 – 今回は実験的に、拙ブログにて公開直前 バージョンのソースを配布していますので 併せてどうぞ(スライドの最後に案内があり ます)
  4. 4. はじめにそれでは、まずはみなさん一番困っているであろう『こなへん』の発音から。
  5. 5. 前回までのあらすじ• 新ジャンル「マゾプログラミング」• C++とOpenGLとOpenALでマルチプ ラットフォームなゲームが作れる• 「3M」プログラミング – 画像・サウンドの読み込み処理ない…マゾい – 日本語テキスト表示ない…マゾい – iOSライブラリ使えない…マゾい
  6. 6. 今回のマゾプログラミング• GameCenter & iAd対応はどうした• ローカライズはどうした• テスト&デバッグはどうした• 動作パフォーマンスはどうした
  7. 7. GameCenter & iAd対応
  8. 8. GameCenter & iAd対応• アプリはUIViewControllerが1つだけ の単純な構造 –XcodeのOpenGL ESのひな形まんま
  9. 9. GameCenter & iAd対応• まず、そのUIViewControllerに GKLeaderboardViewControllerDelegateと ADBannerViewDelegateを担当させる
  10. 10. GameCenter & iAd対応• GameCenter.mmというソースを用意。 GameCenter関連を処理する関数群をそ こに押し込んだ。• クラスにはしないですべて関数で実装 – これだとC++のコードから関数が呼び出せる。• 関数内では [[NSString alloc] init]; とか 色々普通に使えます。
  11. 11. GameCenter & iAd対応
  12. 12. GameCenter & iAd対応
  13. 13. GameCenter & iAd対応
  14. 14. ローカライズ
  15. 15. ローカライズ• iPhoneの NSLocalizedString() を真似 る所からスタート –定義ファイルをutf-8で用意 • en.langとかjp.langとか –[元のテキスト] TAB [翻訳テキスト] –その定義ファイルをstd::mapに流し込 むだけ~
  16. 16. ローカライズ
  17. 17. ローカライズ• さて、準備はできたけど、C++で 実行環境が「英語」なのか「日本 語」なのかはどうやって調べよう か…
  18. 18. ローカライズ• Windowsはstd::localeを使って言語環 境を判定 std::locale lc(“”); if (lc.name() == std::string(“Japanese_Japan.932”)) { /* jp.langを読み込む */ }
  19. 19. ローカライズ• OSXは CFCopyLocalizedString() で判定• iOSは NSLocalizedString() で判定• どういう事?
  20. 20. ローカライズ• OSXとiOSは Localizable.strings を用意 するだけで読み込む定義ファイルを 決められる。簡単!• “langFile” = “en.lang”; とか書いておく。 – NSLocalizedString(@” langFile”, 0) で読み込む定義ファイルを決めればいい。
  21. 21. ローカライズ• そして、 NSLocalizedString() 同様 std::string text = localize.get(“hoge”); みたいにして、文字列を取得するよう になっています。
  22. 22. テスト&デバッグ
  23. 23. テスト&デバッグ• 僕はプログラムの動作中に状況を簡 単に確認できるデバッグプリントが大 好きなので、いろんな場所で std::cout << “座標:” << x << “,” << y << std::endl; とかしたくなるのですが…。
  24. 24. テスト&デバッグ• Xcode –コンソールに表示される• Windows –へんじがない ただの しかばねの ようだ
  25. 25. テスト&デバッグ• マリアナ海溝よりも深い理由がある のか。この件、VisualStudioはいいか げん対応してほしい! – VisualStudio2010調べ• でも自分でなんとかできちゃった。
  26. 26. テスト&デバッグclass DbgStreambuf : public std::streambuf { std::vector<char> str_;public: int_type overflow(int_type c = EOF) { str_.push_back(c); return c; } int sync() { str_.push_back(¥0); OutputDebugString(&str_[0]); // VSの出力に文字列を表示する str_.clear(); return 0; }};
  27. 27. テスト&デバッグDbgStreambuf dbgStream;std::streambuf *stream;stream = std::cout.rdbuf(&dbgStream);std::cout << "hogehoge" << std::endl;// VSの出力にちゃんと出力されるstd::cout.rdbuf(stream);// 元に戻す
  28. 28. テスト&デバッグ• NSLog() は、リリースビルドだと処理 がスキップされるようになっている。• std::cout も同じようにできないだろう か…
  29. 29. テスト&デバッグ• こう書くことで解決。 #ifdef _DEBUG #define DOUT std::cout #else #define DOUT 0 && std::cout #endif DOUT << “hoge piyo” << std::endl;
  30. 30. テスト&デバッグ• その他デバッグ機能の紹介 –キーを押してスナップショット –キーを押してどこでもポーズ –連続スナップショット –マップ確認&データ変換ツール –地球プレビュワー
  31. 31. 動作パフォーマンス
  32. 32. 動作パフォーマンス• 『こなへん』の地球は、1つの球体 データをテクスチャを切り替えたり して何度も重ね描きしています。
  33. 33. 動作パフォーマンス• 開発中期、iPhone4でだけ30fpsになる 現象が発生して慌てた。 – iPhone3GSは常時60fps。• iPhone4の画像プロセッサには Retina ディスプレイはしんどいらしい。 – これをどうやって解決しよう…>_<
  34. 34. 動作パフォーマンス• Xcode4から導入された OpenGL ES Performance Detective Instruments(OpenGL ES Analysis) を使って描画負荷の原因を調べてみた。 – アップルから配布されている「iOS OpenGL ESプ ログラミングガイド(日本語!)」にかなり親切な 解説があります。
  35. 35. 動作パフォーマンス• 診断の結果なんと 「頂点バッファを使え」 「テクスチャ圧縮を使え」 と具体的に指摘されました。英語で ですが…(汗) –これに対応したらiPhone4でもほぼ 60fpsを達成できた
  36. 36. 動作パフォーマンス• CPU負荷はXcodeの Instruments (Time Profiler) で計測。CPUの負荷を計測したり、処理 の重い関数をリストアップしてくれる! – これもアップルから配布されている「Instruments ユーザガイド(日本語!)」で詳しく解説されてい ます。素敵すぎます。
  37. 37. 動作パフォーマンス• 計測の結果「プログラム最適化の 必要なし」 – C++初心者ゆえのダサい書き方は放置 – 計測で問題なければ、最適化をする必 要は「まったく」無い。
  38. 38. 動作パフォーマンス• 問題が発生した時に、まずは処理 負荷を計測、「負荷となっている箇 所」を絞り込む作戦で問題を解決 できた。• 結果、初代iPadでもほぼ60fps!• 僕は勘で直せるほど精通してない ので…:P
  39. 39. まとめ
  40. 40. まとめ• GameCenter & iAd対応 – iOSに特化した処理なので、大人しくObjective-C で書いた。• ローカライズ – OSXやiOSのを真似て自分で実装した。• テスト&デバッグ – デバッグビルドで検証用の機能を実装したら楽 できた。• 動作パフォーマンス – 各種検証用ツールがあるXcodeは最高!
  41. 41. 余談• 今回サポートページをfacebookに 作って直接リンクを設定したけどリ ジェクトされなかった:D – facebookのアカウントが無くても、アプリ の情報や連絡先が見られるようにした からいい…のかな?
  42. 42. おしまいです• こんな感じですが…マゾっぽくないみな さんの参考になりましたでしょうか… – blog 「でらうま倶楽部」 • http://blog.livedoor.jp/tek_nishi/ – twitter • @5mingame2 – Facebook • 5mingame2

×