SlideShare a Scribd company logo
1 of 43
Download to read offline
『こなへん』ができるまで
  ☆リリース直前編☆



     西山信行
    5mingame2
はじめに

• 私はこれまでにiPhoneアプリをシ
  リーズ物とかで12本くらいリリース
  している、ほんのり専業アプリ開発
  者です。
• Objective-Cは5年目、C++は2年目。
はじめに

• 5月末に、生まれて初めてほぼC++で書
  いたiPhoneアプリ『こなへん』が無事公
  開されました!皆さんのおかげです!
  多謝。
 – 今回は実験的に、拙ブログにて公開直前
   バージョンのソースを配布していますので
   併せてどうぞ(スライドの最後に案内があり
   ます)
はじめに


それでは、まずはみなさん一番
困っているであろう『こなへん』の
発音から。
前回までのあらすじ

• 新ジャンル「マゾプログラミング」
• C++とOpenGLとOpenALでマルチプ
  ラットフォームなゲームが作れる
• 「3M」プログラミング
 – 画像・サウンドの読み込み処理ない…マゾい
 – 日本語テキスト表示ない…マゾい
 – iOSライブラリ使えない…マゾい
今回のマゾプログラミング


•   GameCenter & iAd対応はどうした
•   ローカライズはどうした
•   テスト&デバッグはどうした
•   動作パフォーマンスはどうした
GameCenter & iAd対応
GameCenter & iAd対応


• アプリはUIViewControllerが1つだけ
  の単純な構造
 –XcodeのOpenGL ESのひな形まんま
GameCenter & iAd対応


• まず、そのUIViewControllerに
  GKLeaderboardViewControllerDelegateと
  ADBannerViewDelegateを担当させる
GameCenter & iAd対応

• GameCenter.mmというソースを用意。
  GameCenter関連を処理する関数群をそ
  こに押し込んだ。
• クラスにはしないですべて関数で実装
  – これだとC++のコードから関数が呼び出せる。
• 関数内では [[NSString alloc] init]; とか
  色々普通に使えます。
GameCenter & iAd対応
GameCenter & iAd対応
GameCenter & iAd対応
ローカライズ
ローカライズ

• iPhoneの NSLocalizedString() を真似
  る所からスタート
 –定義ファイルをutf-8で用意
   • en.langとかjp.langとか
 –[元のテキスト] TAB [翻訳テキスト]
 –その定義ファイルをstd::mapに流し込
  むだけ~
ローカライズ
ローカライズ


• さて、準備はできたけど、C++で
  実行環境が「英語」なのか「日本
  語」なのかはどうやって調べよう
  か…
ローカライズ

• Windowsはstd::localeを使って言語環
  境を判定
 std::locale lc(“”);
 if (lc.name() ==
 std::string(“Japanese_Japan.932”)) {
 /* jp.langを読み込む */ }
ローカライズ


• OSXは CFCopyLocalizedString() で判定
• iOSは NSLocalizedString() で判定
• どういう事?
ローカライズ

• OSXとiOSは Localizable.strings を用意
 するだけで読み込む定義ファイルを
 決められる。簡単!
• “langFile” = “en.lang”; とか書いておく。
 – NSLocalizedString(@” langFile”, 0)
   で読み込む定義ファイルを決めればいい。
ローカライズ


• そして、 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) {
     str_.push_back(c);
     return c;
   }

     int sync() {
       str_.push_back('¥0');
       OutputDebugString(&str_[0]); // VSの出力に文字列を表示する
       str_.clear();
       return 0;
     }
};
テスト&デバッグ
DbgStreambuf dbgStream;
std::streambuf *stream;

stream = std::cout.rdbuf(&dbgStream);

std::cout << "hogehoge" << std::endl;
// VSの出力にちゃんと出力される

std::cout.rdbuf(stream);
// 元に戻す
テスト&デバッグ


• NSLog() は、リリースビルドだと処理
  がスキップされるようになっている。
• std::cout も同じようにできないだろう
  か…
テスト&デバッグ
• こう書くことで解決。
  #ifdef _DEBUG
   #define DOUT std::cout
  #else
   #define DOUT 0 && std::cout
  #endif

 DOUT << “hoge piyo” << std::endl;
テスト&デバッグ

• その他デバッグ機能の紹介
 –キーを押してスナップショット
 –キーを押してどこでもポーズ
 –連続スナップショット
 –マップ確認&データ変換ツール
 –地球プレビュワー
動作パフォーマンス
動作パフォーマンス


• 『こなへん』の地球は、1つの球体
  データをテクスチャを切り替えたり
  して何度も重ね描きしています。
動作パフォーマンス

• 開発中期、iPhone4でだけ30fpsになる
  現象が発生して慌てた。
 – iPhone3GSは常時60fps。
• iPhone4の画像プロセッサには Retina
  ディスプレイはしんどいらしい。
 – これをどうやって解決しよう…>_<
動作パフォーマンス

• Xcode4から導入された
  OpenGL ES Performance Detective
  Instruments(OpenGL ES Analysis)
  を使って描画負荷の原因を調べてみた。
  – アップルから配布されている「iOS OpenGL ESプ
    ログラミングガイド(日本語!)」にかなり親切な
    解説があります。
動作パフォーマンス

• 診断の結果なんと
  「頂点バッファを使え」
  「テクスチャ圧縮を使え」
  と具体的に指摘されました。英語で
  ですが…(汗)
 –これに対応したらiPhone4でもほぼ
  60fpsを達成できた
動作パフォーマンス

• CPU負荷はXcodeの
  Instruments (Time Profiler)
  で計測。CPUの負荷を計測したり、処理
  の重い関数をリストアップしてくれる!
 – これもアップルから配布されている「Instruments
   ユーザガイド(日本語!)」で詳しく解説されてい
   ます。素敵すぎます。
動作パフォーマンス


• 計測の結果「プログラム最適化の
  必要なし」
 – C++初心者ゆえのダサい書き方は放置
 – 計測で問題なければ、最適化をする必
   要は「まったく」無い。
動作パフォーマンス

• 問題が発生した時に、まずは処理
  負荷を計測、「負荷となっている箇
  所」を絞り込む作戦で問題を解決
  できた。
• 結果、初代iPadでもほぼ60fps!
• 僕は勘で直せるほど精通してない
  ので…:P
まとめ
まとめ
• GameCenter & iAd対応
  – iOSに特化した処理なので、大人しくObjective-C
    で書いた。
• ローカライズ
  – OSXやiOSのを真似て自分で実装した。
• テスト&デバッグ
  – デバッグビルドで検証用の機能を実装したら楽
    できた。
• 動作パフォーマンス
  – 各種検証用ツールがあるXcodeは最高!
余談

• 今回サポートページをfacebookに
  作って直接リンクを設定したけどリ
  ジェクトされなかった:D
 – facebookのアカウントが無くても、アプリ
   の情報や連絡先が見られるようにした
   からいい…のかな?
おしまいです

• こんな感じですが…マゾっぽくないみな
  さんの参考になりましたでしょうか…
 – blog 「でらうま倶楽部」
    • http://blog.livedoor.jp/tek_nishi/
 – twitter
    • @5mingame2
 – Facebook
    • 5mingame2
『こなへん』ができるまで ☆リリース直前編☆

More Related Content

What's hot

Open Design Computer Project - Tsukuba.pm
Open Design Computer Project - Tsukuba.pmOpen Design Computer Project - Tsukuba.pm
Open Design Computer Project - Tsukuba.pm
Hirotaka Kawata
 
自作x86エミュレータの終焉
自作x86エミュレータの終焉自作x86エミュレータの終焉
自作x86エミュレータの終焉
Daisuke Kamikawa
 
簡易デプロイツール(スクリプト)を作ってみた話
簡易デプロイツール(スクリプト)を作ってみた話簡易デプロイツール(スクリプト)を作ってみた話
簡易デプロイツール(スクリプト)を作ってみた話
yokoda_toshiaki
 

What's hot (20)

Android gameprogramming
Android gameprogrammingAndroid gameprogramming
Android gameprogramming
 
Open Design Computer Project - Tsukuba.pm
Open Design Computer Project - Tsukuba.pmOpen Design Computer Project - Tsukuba.pm
Open Design Computer Project - Tsukuba.pm
 
マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)
マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)
マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)
 
Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSAL
 
Subprocess no susume
Subprocess no susumeSubprocess no susume
Subprocess no susume
 
カーネルモジュールプログラミング超入門 #1(仮)
カーネルモジュールプログラミング超入門 #1(仮)カーネルモジュールプログラミング超入門 #1(仮)
カーネルモジュールプログラミング超入門 #1(仮)
 
Prefixから始めるgentoo生活
Prefixから始めるgentoo生活Prefixから始めるgentoo生活
Prefixから始めるgentoo生活
 
自作x86エミュレータの終焉
自作x86エミュレータの終焉自作x86エミュレータの終焉
自作x86エミュレータの終焉
 
初めてのCPUを作ってみた
初めてのCPUを作ってみた初めてのCPUを作ってみた
初めてのCPUを作ってみた
 
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)
 
Androidプログラミング初心者のためのゲームアプリ開発入門
Androidプログラミング初心者のためのゲームアプリ開発入門Androidプログラミング初心者のためのゲームアプリ開発入門
Androidプログラミング初心者のためのゲームアプリ開発入門
 
SoftlayerのCLIで遊ぼうとしたら
SoftlayerのCLIで遊ぼうとしたらSoftlayerのCLIで遊ぼうとしたら
SoftlayerのCLIで遊ぼうとしたら
 
ocsとselってコマンド作ったわよ
ocsとselってコマンド作ったわよocsとselってコマンド作ったわよ
ocsとselってコマンド作ったわよ
 
Testman
TestmanTestman
Testman
 
Clojure で chatbot 作るライブラリ作った
Clojure で chatbot 作るライブラリ作ったClojure で chatbot 作るライブラリ作った
Clojure で chatbot 作るライブラリ作った
 
awk v.s. bashどっちが強い?@OSC2011Tokyo
awk v.s. bashどっちが強い?@OSC2011Tokyoawk v.s. bashどっちが強い?@OSC2011Tokyo
awk v.s. bashどっちが強い?@OSC2011Tokyo
 
"Continuous Publication" with Python: Another Approach
"Continuous Publication" with Python: Another Approach"Continuous Publication" with Python: Another Approach
"Continuous Publication" with Python: Another Approach
 
C++11とゲーム製作
C++11とゲーム製作C++11とゲーム製作
C++11とゲーム製作
 
Puppet×docker 夢の競演
Puppet×docker 夢の競演Puppet×docker 夢の競演
Puppet×docker 夢の競演
 
簡易デプロイツール(スクリプト)を作ってみた話
簡易デプロイツール(スクリプト)を作ってみた話簡易デプロイツール(スクリプト)を作ってみた話
簡易デプロイツール(スクリプト)を作ってみた話
 

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

初心者向けAndroidゲーム開発ノウハウ
初心者向けAndroidゲーム開発ノウハウ初心者向けAndroidゲーム開発ノウハウ
初心者向けAndroidゲーム開発ノウハウ
Kentarou Mukunasi
 
HSPでおいしいスープを飲む方法
HSPでおいしいスープを飲む方法HSPでおいしいスープを飲む方法
HSPでおいしいスープを飲む方法
Hiroaki Murayama
 
Unity * スマートフォン開発で学んだこと
Unity * スマートフォン開発で学んだことUnity * スマートフォン開発で学んだこと
Unity * スマートフォン開発で学んだこと
Katsutoshi Makino
 

Similar to 『こなへん』ができるまで ☆リリース直前編☆ (20)

初心者向けAndroidゲーム開発ノウハウ
初心者向けAndroidゲーム開発ノウハウ初心者向けAndroidゲーム開発ノウハウ
初心者向けAndroidゲーム開発ノウハウ
 
密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境
 
SurfaceTextureとシェーダを使って遊んでみる
SurfaceTextureとシェーダを使って遊んでみるSurfaceTextureとシェーダを使って遊んでみる
SurfaceTextureとシェーダを使って遊んでみる
 
HSPでおいしいスープを飲む方法
HSPでおいしいスープを飲む方法HSPでおいしいスープを飲む方法
HSPでおいしいスープを飲む方法
 
ハードウェアを用いてPythonを学ぶ
ハードウェアを用いてPythonを学ぶハードウェアを用いてPythonを学ぶ
ハードウェアを用いてPythonを学ぶ
 
つぶLT20121215
つぶLT20121215つぶLT20121215
つぶLT20121215
 
2006-04-22 CLR/H #14 .NET and open source
2006-04-22 CLR/H #14 .NET and open source2006-04-22 CLR/H #14 .NET and open source
2006-04-22 CLR/H #14 .NET and open source
 
0621 ndk game
0621 ndk game0621 ndk game
0621 ndk game
 
AozoraYomite @InfoTalk 2012/12/21
AozoraYomite @InfoTalk 2012/12/21AozoraYomite @InfoTalk 2012/12/21
AozoraYomite @InfoTalk 2012/12/21
 
Apple審査を一発通過! iOS開発経験0でも出来る じげん流Swift開発のすべて
Apple審査を一発通過!iOS開発経験0でも出来るじげん流Swift開発のすべてApple審査を一発通過!iOS開発経験0でも出来るじげん流Swift開発のすべて
Apple審査を一発通過! iOS開発経験0でも出来る じげん流Swift開発のすべて
 
オープンソースで作るスマホ文字認識アプリ
オープンソースで作るスマホ文字認識アプリオープンソースで作るスマホ文字認識アプリ
オープンソースで作るスマホ文字認識アプリ
 
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
 
UE4モバイルブートキャンプ
UE4モバイルブートキャンプUE4モバイルブートキャンプ
UE4モバイルブートキャンプ
 
OpenAI の音声認識 AI「Whisper」をテストしてみた
OpenAI の音声認識 AI「Whisper」をテストしてみたOpenAI の音声認識 AI「Whisper」をテストしてみた
OpenAI の音声認識 AI「Whisper」をテストしてみた
 
Core Graphics on watchOS 2
Core Graphics on watchOS 2Core Graphics on watchOS 2
Core Graphics on watchOS 2
 
Unity * スマートフォン開発で学んだこと
Unity * スマートフォン開発で学んだことUnity * スマートフォン開発で学んだこと
Unity * スマートフォン開発で学んだこと
 
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜
 
【関東GPGPU勉強会#2】OpenCVのOpenCL実装oclMat
【関東GPGPU勉強会#2】OpenCVのOpenCL実装oclMat【関東GPGPU勉強会#2】OpenCVのOpenCL実装oclMat
【関東GPGPU勉強会#2】OpenCVのOpenCL実装oclMat
 
12.06.16 日本橋勉強会資料 公開用
12.06.16 日本橋勉強会資料 公開用12.06.16 日本橋勉強会資料 公開用
12.06.16 日本橋勉強会資料 公開用
 
邪道Jenkins
邪道Jenkins邪道Jenkins
邪道Jenkins
 

Recently uploaded

Recently uploaded (10)

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 

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