A thirty minute presentation I gave at Agile Sapporo 2018 #1 (on 2018/2/28) describing in detail how Cold Fusion uses buildbot for Continuous Integration for development, and fastlane to easily deploy updated binaries and metadata to iTunes Connect and Google Play for our flagship game, Crystal Clash. I also cover a few interesting issues related to GPU differences, and OS/tool bugs that I've run into while developing our mobile game engine on both iOS and Android.
(Note: This presentation is only in Japanese, sorry.)
25. CFでfastlaneの事例
➤ 完成したビルドは各ストアのWeb UIで公開
➤ Google Play Developer Consoleは「Promote to Production
」ボタン1つで約1時間で世界中に公開
➤ iTunes Connectはアップルの審査あるため、サブミットし
てから1〜2日間が必要
➤ Web UI使わずにfastlaneでできるけど、大した作業ではない
26. CFでfastlaneの事例
➤ 残念ながらAmazon Developer ConsoleのAPIがまだ公開さ
れてないので、Kindleへのデプロイはすべて手動・・・
➤ 完成したビルドは各ストアのWeb UIで公開
➤ Google Play Developer Consoleは「Promote to Production
」ボタン1つで約1時間で世界中に公開
➤ iTunes Connectはアップルの審査あるため、サブミットし
てから1〜2日間が必要
➤ Web UI使わずにfastlaneでできるけど、大した作業ではない
36. ゲーム/スマホ開発での苦労
② Androidで memset() のスタックオーバーフロー
➤ Androidの新しいOSバージョンではnativeコードの負担を減らすためOS側で色
々とサポートしてくれてる(いいこと)
➤ __aeabi_memset() という新しい関数はAPI 24から対応
➤ 普通のlibcの memset() 関数は直接 __aeabi_memset() を呼ぶ
➤ API 24より前の端末では当然存在しない(実行時dynamicリンクエラー発生)
➤ API 24より前の端末を対応するには・・・
37. ゲーム/スマホ開発での苦労
② Androidで memset() のスタックオーバーフロー
void __aeabi_memset(void *dest, size_t n, int c)
__attribute__ ((weak))
{
u8 *pdst = static_cast<u8 *>(dest);
while (n--)
*pdst++ = c;
}
➤ API 24より前の端末を対応するにはweak関数を用意し、初期テストのためにシンプルなループで対応
38. ゲーム/スマホ開発での苦労
② Androidで memset() のスタックオーバーフロー
➤ API 24より前の端末を対応するにはweak関数を用意し、初期テストのためにシンプルなループで対応
void __aeabi_memset(void *dest, size_t n, int c)
__attribute__ ((weak))
{
u8 *pdst = static_cast<u8 *>(dest);
while (n--)
*pdst++ = c;
}
➤ デバッグ版で正常に動いたけど、リリース版で即クラッシュ・・・
39. ゲーム/スマホ開発での苦労
② Androidで memset() のスタックオーバーフロー
➤ clangの最適化がループは memset() と同じコードと判断し、実際 memset() に置き換えられた
void __aeabi_memset(void *dest, size_t n, int c)
__attribute__ ((weak))
{
u8 *pdst = static_cast<u8 *>(dest);
while (n--)
*pdst++ = c;
memset(dest, n, c); // clang最適化
}
40. ゲーム/スマホ開発での苦労
② Androidで memset() のスタックオーバーフロー
➤ clangの最適化がループは memset() と同じコードと判断し、実際 memset() に置き換えられた
void __aeabi_memset(void *dest, size_t n, int c)
__attribute__ ((weak))
{
u8 *pdst = static_cast<u8 *>(dest);
while (n--)
*pdst++ = c;
memset(dest, n, c); // clang最適化
}
➤ memset() → __aeabi_memset() → memset() → ・・・ → スタックオーバーフロー!