Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Develop::Client::Game
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Smith
August 18, 2016
Programming
1
31
Develop::Client::Game
Introduction of basic knowledge for mobile game development.
Smith
August 18, 2016
Tweet
Share
More Decks by Smith
See All by Smith
Zig なんもわからん 〜あるいは学びのモチベーション〜
dolow
0
360
Go に Generics がやってきた
dolow
0
580
NFT つくってみた
dolow
0
250
プロのエンジニアが1人日を捻出してレトロJRPGっぽいゲームを本気で作った
dolow
0
840
技術中間組織はじめました
dolow
0
95
About triangle
dolow
0
58
Cipher.Mobile
dolow
0
90
Other Decks in Programming
See All in Programming
今こそ知るべき耐量子計算機暗号(PQC)入門 / PQC: What You Need to Know Now
mackey0225
3
370
AIによる高速開発をどう制御するか? ガードレール設置で開発速度と品質を両立させたチームの事例
tonkotsuboy_com
7
2k
Lambda のコードストレージ容量に気をつけましょう
tattwan718
0
110
CSC307 Lecture 03
javiergs
PRO
1
490
Smart Handoff/Pickup ガイド - Claude Code セッション管理
yukiigarashi
0
130
開発者から情シスまで - 多様なユーザー層に届けるAPI提供戦略 / Postman API Night Okinawa 2026 Winter
tasshi
0
200
組織で育むオブザーバビリティ
ryota_hnk
0
170
Vibe Coding - AI 驅動的軟體開發
mickyp100
0
170
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
500
副作用をどこに置くか問題:オブジェクト指向で整理する設計判断ツリー
koxya
1
590
フルサイクルエンジニアリングをAI Agentで全自動化したい 〜構想と現在地〜
kamina_zzz
0
400
AI前提で考えるiOSアプリのモダナイズ設計
yuukiw00w
0
220
Featured
See All Featured
The Cost Of JavaScript in 2023
addyosmani
55
9.5k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
110
Building an army of robots
kneath
306
46k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
1
97
Statistics for Hackers
jakevdp
799
230k
Are puppies a ranking factor?
jonoalderson
1
2.7k
4 Signs Your Business is Dying
shpigford
187
22k
Faster Mobile Websites
deanohume
310
31k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
350
Making Projects Easy
brettharned
120
6.6k
The Curious Case for Waylosing
cassininazir
0
230
Transcript
Develop::Client::Game // 難易度別・これだけは覚えて帰って欲しい // クライアント開発知識
Employee* me = introduce();
#include <time.h> #include <Drecom/Employee.h> using namespace Drecom; Employee* introduce() {
Employee* me = new Employee<Hirashain>(); me->name = “Smith”; me->division = Division::ClientArchitect::GameArchitect; me->role = Occupation::Engineer::Client; { time_t rawtime; time(&rawtime); struct tm* timeinfo = localtime (&rawtime); timeinfo->tm_year = 2011 - 1900; // 正直、覚えてない timeinfo->tm_mon = 10 - 1; timeinfo->tm_mday = 1; me->hireDate = mktime(timeinfo); } return me; }
#include <time.h> #include <Drecom/Employee.h> using namespace Drecom; Employee* introduce() {
Employee* me = new Employee<Hirashain>(); me->name = “Smith”; me->division = Division::ClientArchitect::GameArchitect; me->role = Occupation::Engineer::Client; { time_t rawtime; time(&rawtime); struct tm* timeinfo = localtime (&rawtime); timeinfo->tm_year = 2011 - 1900; // 正直、覚えてない timeinfo->tm_mon = 10 - 1; timeinfo->tm_mday = 1; me->hireDate = mktime(timeinfo); } return me; }
アプリケーションの種別を問わない クライアントサイド技術に関する総合的な部署 ClientArchitect ClientArchitect::GameArchitect ゲーム製作に特化したクライアント開発環境・基盤の 提供、運用、サポートを行うグループ me 趣味は酒とゲームと睡眠
+ 隠しアカウントで3本くらい
AGENDA 1. はじめに 2. ユーザインタラクションとUI || メインループとパフォーマンスチューニング || ネイティヴ連携に挑戦
はじめに 本スライドは、C/C++ (cocos2d-x) での iOS/ Android 向け開発を前提として進行します Unity 環境については特に重要と思われる箇所 以外では言及しません
ユーザインタラクションとUI
- ユーザインタラクションって何? - OpenGL ってなに? - UIってなに?
ユーザインタラクション - タッチ操作 - キー入力 - センサリング など、ユーザ任意の行動による操作
OpenGL iOS/Androidがサポートするレンダリング エンジン 既存のゲームエンジンが対応している (というか他に選択肢がない) アプリのUIは全てOpenGL描画用の ビューコンテナに描画される OSのWebViewなどはOpenGLよりも上に 表示される App
UI OS OpenGL View Other OS View Components
Touch through OpenGL 1. タップ操作する 2. Java/ObjC層で受け取る 3. OpenGLビューに渡される 4.
タップ座標をOpenGL上の座標に 変換する 5. 変換された座標をアプリが受け取る 6. アプリ任意の処理 App UI OS OpenGL View X:342 Y:107 X:171 Y:515
Touch through OpenGL ゲームエンジンが頑張ってくれてる
Application UI
home unit gacha menu main unit news 1 B A
LV xx coin xxxx stone xxx
UI ただ表示して置いておくだけではなく 制御しなければならない
UI input/output 例 home unit gacha menu main unit news
1 B A LV xx coin xxxx stone xxx ホーム画面を表示する (news ボタンが押される) ボタンを押し込んでいる間は ボタン画像が変わる (news ボタンが押し終わる) ボタンを離すとボタン画像が元に戻り ポップアップが前面に表示され始める news 1 News close
UI input/output 例 ホーム画面を表示する (news ボタンが押される) ボタンを押し込んでいる間は ボタン画像が変わる (news ボタンが押し終わる)
ボタンを離すとボタン画像が元に戻り ポップアップが前面に表示され始める プログラム側で実装 (部品は用意されている)
よくあるトラブル - 異常系処理を忘れがち アニメーションの割り込み、同時押しなど - OS View の座標/サイズ合わせを忘れがち - ローカル座標とグローバル座標で混乱しがち
- 動くものができてからしかフィードバックされない
まとめ - ほとんどのゲームエンジンはOpenGLで描画している - OpenGLはOSでサポートされ、 専用のビューコンポーネントに描画される - アニメーションやユーザインタラクションの制御は 全てプログラムから行う -
ユーザ操作がOSからアプリに届くまでは ゲームエンジンが面倒見てくれる - 仕様について不明瞭な点は、キッチリコミュニケーションしておく
メインループと パフォーマンスチューニング
メインループって? - アプリ起動中は継続的に一定周期で走る処理 1/60秒毎のループが一般的 - このループでの計算結果を描画に反映するケースが多い (=ループの末端で描画処理をする) - メインループでのボトルネックはパフォーマンスに直結 いわゆるカクつきと呼ばれるものが生じる
ボトルネック - I/O などの各種 wait - 過多な/不要な計算 - ドローコール過多
よくある解消方法 - 重い処理はアプリ起動時やシーン切替時に行う - 値の変更をストレージに反映する時は ある程度メモリに載せてからまとめて反映する - 別スレッドに処理を逃がす - そもそものロジック・設計を見直す
クライアントアプリのメモリ
server client transaction main loop memory space memory space transaction
memory space transaction memory space transaction memory space main loop main loop main loop main loop main loop main loop
main loop main loop main loop item = new Item();
itemName = item->name; delete item; item = nullptr; itemName = item->name; // error!
メモリ - 一度割り当てたメモリは生き続ける (=手動で破棄しなければならない) - メモリ不足だと何もできない
対策 - メモリ割り当てやリークについて理解しよう - heap の理解をしておこう - メモリ使用量を確認する手段を知っておこう
余談 - UnityではGCが走るので、意識的なメモリ開放をする 機会はあまりない というか、GCが走ってもメモリ領域を開放せず再利用する
まとめ - メインループは 1/60 秒毎に描画処理をしている - 割り当てられたメモリは自動的に破棄されない - 時間のかかる処理を把握する -
メモリを意識したプログラミングをしよう
ネイティヴ連携に挑戦
- スマフォアプリ作ったことある人? - iOS/Android は何の言語で動いている? - クロスプラットフォーム開発って何? - SDK ってなに?
ネイティヴアプリ OS ネイティヴAPI プラットフォーム機能 ネイティヴ用ライブラリ アプリ/ゲーム実装 - ネイティヴ言語で記述 iOS :
Objective-C Android : Java - OSが提供する諸々と OSに提供された諸々が使える - そのOSでしか動かない
クロスプラットフォーム OS ネイティヴAPI プラットフォーム機能 ネイティヴ用ライブラリ アプリ/ゲーム実装 - C/C++ など、ポータビリティの 高い言語で記述
- 複数のプラットフォームで動く - ネイティヴ層と分離される
Java (Android API) Objective-C (Cocoa) Android iOS C/C++ C/C++ JNI
Java SDK Objective-C SDK ネイティヴ連携って? * Swift のフローは割愛
ネイティヴ連携って必要? - サードパーティSDKはほぼ間違いなく入れる 広告系、計測系、配信系、SNS系など ほとんどがJava/Objective-C のライブラリの提供である - プラットフォーム固有機能もほぼ間違いなく入れる 課金、プッシュ通知、実績など これらもネイティヴ言語での実装のみ
- ネイティヴAPIを利用する場合がある パッケージ名/Bundle ID、バージョン番号取得など アップデートチェックや外部アプリ連携で利用するケースが多い
ネイティヴ連携って必要? C/C++ 向けのAPIがなく Java や Objective-C のAPIを 叩かないと実現できない機能の提供
ネイティヴ言語と プラットフォームを理解する
iOS 言語 : Objective-C (or Swift) プラットフォーム機能 : iOS SDK
同梱 IAP や GameCenter、プッシュ通知などの ライブラリは全て含まれている
Android 言語 : Java JNI を経由して C と Java の連携ができる
プラットフォーム機能 : Android SDK 同梱 IAB や Game Play Service、プッシュ通知などの ライブラリは全て含まれているが低レイヤのみ 公式のサンプルコードをコピペして使うことが推奨されている
ネイティヴ連携手段を理解する
iOS Objective-C のソースには C/C++ が書ける C/C++ header (.h) Obj-C header
(.h) C/C++ Obj-C implements (.mm)
iOS Objective-C のソースには C/C++ が書ける C/C++ header (.h) Obj-C header
(.h) C/C++ Obj-C bridge (.mm) Obj-C implements (.m)
Android C/C++ と Java の間のやりとりには JNI を介す C/C++ header (.h)
Java implements (.java) C/C++ bridge (.cpp) JNI C Interface / implements (.c/.cpp)
iOS // call ObjC method void CppClass::doSomeObjCThing() { [ObjCClass doSomeObjCThing];
} // call cpp method + (void) doSomeCppThing { CppClass::doSomeCppThing(); } Ultra extremely Easy !
Android // call Java method void CppClass::doSomeJavaThing() { const char*
className = "jp/co/drecom/JavaClass”; const char* methodName = "doSomeJavaThing”; const char* signature = "()V”; PluginJniMethodInfo info; if (PluginJniHelper::getStaticMethodInfo(info, className, methodName, signature)) { info.env->CallStaticObjectMethod(info.classID, info.methodID); } }
Android class JavaClass { // call cpp method public static
native void doSomeCppThing(); } … JavaClass. doSomeCppThing();
Android extern "C" { // receive JNI native call and
do cpp thing JNIEXPORT void JNICALL Java_jp_co_drecom_JavaClass_doSomeCppThing(JNIEnv* env, jobject obj) { CppClass::doSomeCppThing(); } }; Ultra extremely bothering !
余談 サードパーティSDKでは iOS版とAndroid版でAPIが異なる場合がある e.g. ある値を取得するメソッド iOS : 返り値として返却 Android :
Listener 経由で受け取る この場合、C/C++ のインターフェイスは Listener で受け取るように統一する (逆は不可)
余談 Unity もおんなじ感じ
まとめ - クロスプラットフォーム開発におけるネイティヴ連携は必須 - OS毎に連携方法が異なる - JNIの利用方法を覚えよう - 一度組めば他のアプリに転用できる