SlideShare ist ein Scribd-Unternehmen logo
1 von 60
どこでも動くゲームを作るための
   ベタープラクティス



       西山信行
      5mingame2
C++初心者で~
ゲームを作るのが大好き☆プログラマ

続きはWebで (「でらうま」で検索)
「こないだサターンでゲーム作ったんだ
けどさ…」「オレ持ってんのプレステな
んだよね」
ハイドライド(1984)        テグザー(1985)
PC-8801             PC-8001mkIISR
X1/turbo            PC-8801
FM7/77/77AV         X1
MZ-2000/2200/2500   FM-7/77/77AV
MSX MSX2            ファミリーコンピュータ
PC-6001MkII         MZ-2500
PC-9801U/F          PC-9801
ファミリーコンピュータ         MSX
                    PC/AT(PC-DOS)
                    AppleIIGS
                    Macintosh
Unity! WebGL! etc,etc…
Unity! WebGL! etc,etc…
今はやりの技術を使えばボクにも実現可能!
どうやら結論が出たようですね…
違います!
違います!
そういう正攻法じゃ満足できないんです…

今日集まってくれたみなさんも、もうちょっと
マゾいと信じています
OpenGL + OpenAL + C++
OpenGL + OpenAL + C++
• OpenGLは今やもっとも幅広く使える描画実装
    Windows/OSX/iOS/Linux/Android/ゲーム専用機…
•   OpenALもそれに近い
    Windows/OSX/iOS/Linux/Android…
• C++はCPUに近い言語なので実行速度的に有利
  (と思う)
• C、C++にもオープンソースの優秀なライブラ
  リが多数存在する
OpenGL + OpenAL + C++
• そして…OpenGLはMESAというソースの公開さ
  れた実装が存在する
予告内容
• 用意するもの~
• 実装のコツ~
• ハマった点

時間があれば…
• デバッグ手法
• 最適化
じゃあ始めましょうか!
• Windows
  VisualStudio2010
• OSX/iOS
  Xcode最新版
• Linux
  ターミナル

どの環境でもC++の標準ライブラリが使えます
じゃあ始めましょうか!
あと、こんだけ準備して。
•   glut
•   OpenAL
•   zlib
•   libpng
•   Freetype
•   FTGL
•   FTGLES
•   picojson
じゃあ始めましょうか!
•   Xcodeではデバッグビルド設定の「プリプロセッ
    サ」に「_DEBUG」を追加しておく
    #ifdef _DEBUG
    /* デバッグ時の実装 */
    #endif
•   iOSでのビルド設定「Compress PNG Files」はオ
    フっておいてね!ぜったいだよ!
コード書くよ。
•   ソースの文字コードはUTF-8 BOMあり
•   しかもVS2010では
    printf(“ほげほげ”); がcp932に勝手に変換され
    る(怒) ので #pragma
    execution_character_set(“utf-8”)
    で回避
•   プログラムからテキストデータを読み込む場合は
    UTF-8で用意
今回決めたたったひとつのルール
• ゲーム本体を.cppに書
  かないで全てヘッダフ
  ァイルに書く
• 僕はコード編集は専ら
  emacsなので問題な
  いです
• ファイルを追加しても
  プロジェクトを触らな
  くてイイ!
こんな感じになってます
#include “app.hpp“    // 芋づる式に18000行程度読み込まれる

App *app;

int main(int argc, char **argv)
{
  glutInit(&argc, argv);
  app = new App(/* 引数いろいろ */);

    /* 初期化いろいろ */

    glutMainLoop();
}
表示のコールバック
void displayCallback()
{
  glClear(GL_COLOR_BUFFER_BIT);

    app->update();
    glutSwapBuffers();
}
入力のコールバック
void mouseCallBack(const int button, const int state, const
int x, const int y)
{
  app->mouse.input(/* 引数いろいろ */);
}

void keyPushCallback(const u_char key, const int x, const
int y)
{
  app->key.input(/*引数いろいろ */);
}
それがiOSだと?
#include "app.hpp"

App *app;

- (void)awakeFromNib
{
  /* いろいろ初期化 */
  app = new App(/*引数いろいろ */);
}

ちなみにソースのファイル名を
ViewController.mm
にしないとC++のコードを混在させられないので注意!
- (void)drawFrame
{
  [(EAGLView *)self.view setFramebuffer];

    glClear(GL_COLOR_BUFFER_BIT);
    app->update();

    [(EAGLView *)self.view presentFramebuffer];
}
タッチ入力はこうします
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent
*)event
{
  app->mouse.input(/* 引数いろいろ */);
}
OpenGL → OpenGL ES 1.1
#if (TARGET_OS_IPHONE)

typedef GLfloat GLdouble;

#define glFrustum(left, right, bottom, top, znear, zfar)
glFrustumf(left, right, bottom, top, znear, zfar)

#define glOrtho(left, right, bottom, top, znear, zfar)
glOrthof(left, right, bottom, top, znear, zfar)

#define glFogi(pname, param) glFogx(pname, param)

#endif
OpenGL → OpenGL ES 1.1
さすがに gluUnProject() とか gluProject()
とか… glu系は実装されてない…

MESAの出番!
ソースが公開されているのでそれを見ながら自
分で実装
いったんまとめ
• 文字コード問題はだいたい収束
• ゲーム本体を1つのクラスと見立て、その内
  部をだいたいどんなコンパイラでも通るよう
  にお上品に書く。
• そのクラスを操作する箇所で入力とかセーブ
  とか画面の回転とか…環境依存な処理を行え
  ばよい。
• ちょっとした工夫でOpenGLとOpenGL ESの差
  異は充分吸収できる
バラバラな解像度をひとつにまとめる
バラバラな解像度をひとつにまとめる
• Windows/OSX/Linuxでは、「縦横非固定モー
  ド」を実装
• 初期サイズを960x640と決め、それより狭
  かった場合には起動時に調整するみたいな。
バラバラな解像度をひとつにまとめる
• iOSは320x480~1536x2048と、多種多様な解
  像度が存在するので「見た目固定モード」を
  実装
バラバラな解像度をひとつにまとめる
• カメラは2つ用意
3D
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(width, -width, -height, height, nearZ, farZ);

2D
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-width / 2.0, width / 2.0, height / 2.0, -height /
2.0, -1.0, 1.0);
バラバラな解像度をひとつにまとめる
• iPhone3GSは2Dのスケーリングを調整して見
  た目をiPhone4とあわせる
• 新しいiPadも同じように調整すれば対応でき
  る
width *= 0.5;
height *= 0.5;
glOrtho(-width / 2.0, width / 2.0, height / 2.0, -height /
2.0, -1.0, 1.0);
結局UIView
iOSの画面回転でメニューの表示が崩れるのは、
UIViewみたく「画面端基準」を自力で実装して
切り抜けた
そろそろ音周りも聞きたい!
そろそろ音周りも聞きたい!
• OpenALのサンプル通りに書いたら問題ないで
  す
• 自分はwav形式のデータを自力で読み込み、
  OpenALに渡してます
• ストリーミング関連よくわかんない
可搬性≒テキストファイル
可搬性≒テキストファイル
• GEOSPOTのセーブデータはすべての動作環境
  で互換性がある
• バイナリデータだと、とにかく環境依存に
  なってしまう。たとえばlong型。OSXのx64は
  8バイト。それ以外だと4バイト。
• 人間が読み書きできるので修正も楽
可搬性≒テキストファイル
• XML…ちょっと自分には読み書きできない
• JSON…素晴らしい!
可搬性≒テキストファイル
リプレイデータもプレイ内容をテキストで書き
出しているだけ

-21.16 1333466611
0.017 0.156676 -0.807913 -0.247557 0.511317 1955.81 0 0 0 0
0.0503333 0.156676 -0.807913 -0.247557 0.511317 1955.81 0 0
0 0
0.0836667 0.156676 -0.807913 -0.247557 0.511317 1955.81 0 0
0 0
0.100667 0.156676 -0.807913 -0.247557 0.511317 1955.81 0 0 0
0
ファイルはどこから読み込むの?
ファイルはどこから読み込むの?
Windows/Linuxの場合
実行ファイルがある場所がカレント

std::string path = “”;

read(path + “devdata/hoge.png”);
ファイルはどこから読み込むの?
OSXの場合
起動時に場所を取得
CFBundleRef mainBundle = CFBundleGetMainBundle();
CFURLRef resourcesURL =
CFBundleCopyResourcesDirectoryURL(mainBundle);
char str[PATH_MAX];
CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (UInt8
*)str, PATH_MAX);
std::string path = std::string(str) + std::string(“/”);

read(path + “devdata/hoge.png”);
ファイルはどこから読み込むの?
iOSの場合
起動時に場所を取得
std::string path = [[[NSBundle mainBundle] resourcePath]
UTF8String] + std::string("/");

read(path + “devdata/hoge.png”);
ファイルに関してのまとめ
• プログラムの開始時、OS別に読み込み時のパ
  スと書き出し時のパスを取得しておく
• iOSも、C++の標準ライブラリ関数を使った
  ファイルの読み書きができる
  fstream >> value;
  こういうファイル読み込みでいける
まさかの:乱数でハマった
まさかの:乱数でハマった
GEOSPOTではクイズの出題順序をランダムに
シャッフルしているのだが…デモプレイが環境
によって違う!
どうも、Widnowsとその他でrand()の実装が違
うっぽい?
まさかの:乱数でハマった
これは std::tr1::random を使う事で解決!

ただし…初期化時の引数はこうしとく
unsigned long seed = time(0) & 0x7fffffff;

OSXのx64はlongが8バイト、その他は4バイトなの
が原因で初期値が変わってしまうのを防ぐ
タイマー処理
60FPSで動かない場合でも、ゲーム内の時間経過
を正確に行うためにタイマーを使って時間を計
測してます

Windows
•   timeGetTime() ←精度が悪い(T T)

それ以外
• gettimeofday() ←最高!
ここまでのまとめ
• ファイルパスや型のサイズなど、実行環境の
  違いを吸収する必要のあるもの、必要ないも
  のを切り分けておけば怖くない!
• 週一くらいの間隔でよいので他の環境でもビ
  ルドが通るかの確認は怠らない。
もしかして:時間切れ?

デバッグ手法と最適化に関してはまた次の機会
にでも~
いまその瞬間のCPU
いまその瞬間のCPU
• VisualStudioもXcodeもデバッガが非常によ
  くできているので困る事はない。
• でもやっぱりプログラムからコンソールに文
  字を出力するのは手軽で便利
いまその瞬間のCPU
C++だとこう書きます

cout << “ほげほげ” << endl;
いまその瞬間のCPU
だがしかしWindowsでは出力されないのであった…!
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]);
     str_.clear();
     return 0;
   }
};
いまその瞬間のCPU
だがしかしWindowsでは出力されないのであった…!
Class Os {
   DbgStreambuf dbgStream_;
   std::streambuf *stream_;
public:
   Os() {
     stream_ = std::cout.rdbuf(&dbgStream_);
   }
   ~Os() {
     std::cout.rdbuf(stream_);
   }
};
いまその瞬間のCPU
だがしかしWindowsでは出力されないのであった…!
int main() {
  Os os;

    cout << “ほげほげ” << endl;

    return 0;
}
いまその瞬間のCPU
リリースビルドでcoutを一網打尽

#ifdef _DEBUG
DOUT std::cout
#else
DOUT 0 && std::cout
#endif

DOUT << “ほげぴよ” << endl;
最適化は機械任せ☆
最適化は機械任せ☆
XcodeのInstrumentsやOpenGL ES Performance
Devectiveで計測すれば処理負荷の大きい場所が
特定できる。
最適化は機械任せ☆
GEOSPOTではCPUのコードは3GSでも120FPS超えて
るので、まったく最適化作業を行ってないてへ
ぺろ。

OpenGL ESは分析結果に「VBOとPVRTCテクスチャ
を使えばいいよ」と出たのでそうしたら、だい
たい60FPSになったが…iPhone4が一番重い。
終わりです

この場を与えてくださった岸川さんを始めお手
伝いの方々、今日ここに来てくださった皆さん、
聞いてくださったすべての人たちに感謝!

Weitere ähnliche Inhalte

Was ist angesagt?

マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)
マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)
マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)Kenichiro MATOHARA
 
Linuxで温度計測あれこれ
Linuxで温度計測あれこれLinuxで温度計測あれこれ
Linuxで温度計測あれこれKenichiro MATOHARA
 
Open Design Computer Project - Tsukuba.pm
Open Design Computer Project - Tsukuba.pmOpen Design Computer Project - Tsukuba.pm
Open Design Computer Project - Tsukuba.pmHirotaka Kawata
 
Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALegtra
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 
Prefixから始めるgentoo生活
Prefixから始めるgentoo生活Prefixから始めるgentoo生活
Prefixから始めるgentoo生活bontakun
 
自作x86エミュレータの終焉
自作x86エミュレータの終焉自作x86エミュレータの終焉
自作x86エミュレータの終焉Daisuke Kamikawa
 
Androidプログラミング初心者のためのゲームアプリ開発入門
Androidプログラミング初心者のためのゲームアプリ開発入門Androidプログラミング初心者のためのゲームアプリ開発入門
Androidプログラミング初心者のためのゲームアプリ開発入門Masahiko Mizuta
 
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法Yoshifumi Kawai
 
SoftlayerのCLIで遊ぼうとしたら
SoftlayerのCLIで遊ぼうとしたらSoftlayerのCLIで遊ぼうとしたら
SoftlayerのCLIで遊ぼうとしたら雄哉 吉田
 
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)parrotstudio
 
初めてのCPUを作ってみた
初めてのCPUを作ってみた初めてのCPUを作ってみた
初めてのCPUを作ってみたEric Sartre
 
Puppet×docker 夢の競演
Puppet×docker 夢の競演Puppet×docker 夢の競演
Puppet×docker 夢の競演Ryo Sugahara
 
Clojure で chatbot 作るライブラリ作った
Clojure で chatbot 作るライブラリ作ったClojure で chatbot 作るライブラリ作った
Clojure で chatbot 作るライブラリ作ったMasashi Iizuka
 
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftTomohiro Kumagai
 
簡易デプロイツール(スクリプト)を作ってみた話
簡易デプロイツール(スクリプト)を作ってみた話簡易デプロイツール(スクリプト)を作ってみた話
簡易デプロイツール(スクリプト)を作ってみた話yokoda_toshiaki
 
griffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jgguggriffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jggugkimukou_26 Kimukou
 
Programming camp Codereading
Programming camp CodereadingProgramming camp Codereading
Programming camp CodereadingHiro Yoshioka
 

Was ist angesagt? (20)

マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)
マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)
マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)
 
Linuxで温度計測あれこれ
Linuxで温度計測あれこれLinuxで温度計測あれこれ
Linuxで温度計測あれこれ
 
Open Design Computer Project - Tsukuba.pm
Open Design Computer Project - Tsukuba.pmOpen Design Computer Project - Tsukuba.pm
Open Design Computer Project - Tsukuba.pm
 
Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSAL
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
Prefixから始めるgentoo生活
Prefixから始めるgentoo生活Prefixから始めるgentoo生活
Prefixから始めるgentoo生活
 
Node native ext
Node native extNode native ext
Node native ext
 
自作x86エミュレータの終焉
自作x86エミュレータの終焉自作x86エミュレータの終焉
自作x86エミュレータの終焉
 
Androidプログラミング初心者のためのゲームアプリ開発入門
Androidプログラミング初心者のためのゲームアプリ開発入門Androidプログラミング初心者のためのゲームアプリ開発入門
Androidプログラミング初心者のためのゲームアプリ開発入門
 
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
 
SoftlayerのCLIで遊ぼうとしたら
SoftlayerのCLIで遊ぼうとしたらSoftlayerのCLIで遊ぼうとしたら
SoftlayerのCLIで遊ぼうとしたら
 
秀丸最強化計画
秀丸最強化計画秀丸最強化計画
秀丸最強化計画
 
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)
 
初めてのCPUを作ってみた
初めてのCPUを作ってみた初めてのCPUを作ってみた
初めてのCPUを作ってみた
 
Puppet×docker 夢の競演
Puppet×docker 夢の競演Puppet×docker 夢の競演
Puppet×docker 夢の競演
 
Clojure で chatbot 作るライブラリ作った
Clojure で chatbot 作るライブラリ作ったClojure で chatbot 作るライブラリ作った
Clojure で chatbot 作るライブラリ作った
 
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
 
簡易デプロイツール(スクリプト)を作ってみた話
簡易デプロイツール(スクリプト)を作ってみた話簡易デプロイツール(スクリプト)を作ってみた話
簡易デプロイツール(スクリプト)を作ってみた話
 
griffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jgguggriffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jggug
 
Programming camp Codereading
Programming camp CodereadingProgramming camp Codereading
Programming camp Codereading
 

Andere mochten auch

SurfaceTextureとシェーダを使って遊んでみる
SurfaceTextureとシェーダを使って遊んでみるSurfaceTextureとシェーダを使って遊んでみる
SurfaceTextureとシェーダを使って遊んでみるTatsuya Matsumoto
 
簡単!OpenGL ES 2.0フラグメントシェーダー
簡単!OpenGL ES 2.0フラグメントシェーダー簡単!OpenGL ES 2.0フラグメントシェーダー
簡単!OpenGL ES 2.0フラグメントシェーダーEiji Kamiya
 
FiltersでGLSLを楽しく学んじゃおう!
FiltersでGLSLを楽しく学んじゃおう!FiltersでGLSLを楽しく学んじゃおう!
FiltersでGLSLを楽しく学んじゃおう!Kazuya Hiruma
 
Live2Dの描画の裏側の話
Live2Dの描画の裏側の話Live2Dの描画の裏側の話
Live2Dの描画の裏側の話Naoki Aso
 
One Step Effects 解説
One Step Effects 解説One Step Effects 解説
One Step Effects 解説MakotoItoh
 
視野変換1(基礎編)
視野変換1(基礎編)視野変換1(基礎編)
視野変換1(基礎編)康弘 等々力
 
GLSLによるシェーダーアートことはじめ
GLSLによるシェーダーアートことはじめGLSLによるシェーダーアートことはじめ
GLSLによるシェーダーアートことはじめYoichi Hirata
 
Tabc vol3 テクニカルアーティストを始めるにあたって
Tabc vol3 テクニカルアーティストを始めるにあたってTabc vol3 テクニカルアーティストを始めるにあたって
Tabc vol3 テクニカルアーティストを始めるにあたってfumoto kazuhiro
 
MusicEngine for Unity/ADX2を使った簡単音楽同期ゲーム制作
MusicEngine for Unity/ADX2を使った簡単音楽同期ゲーム制作MusicEngine for Unity/ADX2を使った簡単音楽同期ゲーム制作
MusicEngine for Unity/ADX2を使った簡単音楽同期ゲーム制作Sho Iwamoto
 
中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~ProjectAsura
 
CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介
CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介
CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介Drecom Co., Ltd.
 
Introducing libpd -Pdをアプリのサウンドエンジンに-
Introducing libpd -Pdをアプリのサウンドエンジンに-Introducing libpd -Pdをアプリのサウンドエンジンに-
Introducing libpd -Pdをアプリのサウンドエンジンに-Yoichi Hirata
 
テクニカルアーティストの仕事とスキル ~パイプライン系TAの事例~
テクニカルアーティストの仕事とスキル ~パイプライン系TAの事例~テクニカルアーティストの仕事とスキル ~パイプライン系TAの事例~
テクニカルアーティストの仕事とスキル ~パイプライン系TAの事例~Manabu Murakami
 
OpenGLと行列
OpenGLと行列OpenGLと行列
OpenGLと行列miyosuda
 

Andere mochten auch (16)

SurfaceTextureとシェーダを使って遊んでみる
SurfaceTextureとシェーダを使って遊んでみるSurfaceTextureとシェーダを使って遊んでみる
SurfaceTextureとシェーダを使って遊んでみる
 
ネイティブ原理主義
ネイティブ原理主義ネイティブ原理主義
ネイティブ原理主義
 
簡単!OpenGL ES 2.0フラグメントシェーダー
簡単!OpenGL ES 2.0フラグメントシェーダー簡単!OpenGL ES 2.0フラグメントシェーダー
簡単!OpenGL ES 2.0フラグメントシェーダー
 
FiltersでGLSLを楽しく学んじゃおう!
FiltersでGLSLを楽しく学んじゃおう!FiltersでGLSLを楽しく学んじゃおう!
FiltersでGLSLを楽しく学んじゃおう!
 
OpenGL 3DCG
OpenGL 3DCGOpenGL 3DCG
OpenGL 3DCG
 
Live2Dの描画の裏側の話
Live2Dの描画の裏側の話Live2Dの描画の裏側の話
Live2Dの描画の裏側の話
 
One Step Effects 解説
One Step Effects 解説One Step Effects 解説
One Step Effects 解説
 
視野変換1(基礎編)
視野変換1(基礎編)視野変換1(基礎編)
視野変換1(基礎編)
 
GLSLによるシェーダーアートことはじめ
GLSLによるシェーダーアートことはじめGLSLによるシェーダーアートことはじめ
GLSLによるシェーダーアートことはじめ
 
Tabc vol3 テクニカルアーティストを始めるにあたって
Tabc vol3 テクニカルアーティストを始めるにあたってTabc vol3 テクニカルアーティストを始めるにあたって
Tabc vol3 テクニカルアーティストを始めるにあたって
 
MusicEngine for Unity/ADX2を使った簡単音楽同期ゲーム制作
MusicEngine for Unity/ADX2を使った簡単音楽同期ゲーム制作MusicEngine for Unity/ADX2を使った簡単音楽同期ゲーム制作
MusicEngine for Unity/ADX2を使った簡単音楽同期ゲーム制作
 
中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~
 
CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介
CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介
CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介
 
Introducing libpd -Pdをアプリのサウンドエンジンに-
Introducing libpd -Pdをアプリのサウンドエンジンに-Introducing libpd -Pdをアプリのサウンドエンジンに-
Introducing libpd -Pdをアプリのサウンドエンジンに-
 
テクニカルアーティストの仕事とスキル ~パイプライン系TAの事例~
テクニカルアーティストの仕事とスキル ~パイプライン系TAの事例~テクニカルアーティストの仕事とスキル ~パイプライン系TAの事例~
テクニカルアーティストの仕事とスキル ~パイプライン系TAの事例~
 
OpenGLと行列
OpenGLと行列OpenGLと行列
OpenGLと行列
 

Ähnlich wie どこでも動くゲームを作るためのベタープラクティス

スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0Kiwamu Okabe
 
OpenGLプログラミング
OpenGLプログラミングOpenGLプログラミング
OpenGLプログラミング幸雄 村上
 
Unityの夕べ in Fukuoka
Unityの夕べ in FukuokaUnityの夕べ in Fukuoka
Unityの夕べ in FukuokaShinobu Izumi
 
Android起動周りのノウハウ
Android起動周りのノウハウAndroid起動周りのノウハウ
Android起動周りのノウハウchancelab
 
OpenCLに触れてみよう
OpenCLに触れてみようOpenCLに触れてみよう
OpenCLに触れてみようYou&I
 
StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件yaegashi
 
Tizen 2.0 alpha でサポートされなかった native api
Tizen 2.0 alpha でサポートされなかった native apiTizen 2.0 alpha でサポートされなかった native api
Tizen 2.0 alpha でサポートされなかった native apiNaruto TAKAHASHI
 
Cell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始めCell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始めYou&I
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門sandai
 
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成Izumi Tsutsui
 
とある帽子の大蛇料理Ⅱ
とある帽子の大蛇料理Ⅱとある帽子の大蛇料理Ⅱ
とある帽子の大蛇料理ⅡMasami Ichikawa
 
Build 番号の自動更新スクリプトについて #cocoa_kansai
Build 番号の自動更新スクリプトについて #cocoa_kansaiBuild 番号の自動更新スクリプトについて #cocoa_kansai
Build 番号の自動更新スクリプトについて #cocoa_kansaiTomohiro Kumagai
 
初心者向けAndroidゲーム開発ノウハウ
初心者向けAndroidゲーム開発ノウハウ初心者向けAndroidゲーム開発ノウハウ
初心者向けAndroidゲーム開発ノウハウKentarou Mukunasi
 
Python東海GAEやってみた
Python東海GAEやってみたPython東海GAEやってみた
Python東海GAEやってみたMori Shingo
 
PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門Yosuke Onoue
 
PF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsolaPF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsolaandroid sola
 
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。Satoshi Mimura
 

Ähnlich wie どこでも動くゲームを作るためのベタープラクティス (20)

スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0
 
OpenGLプログラミング
OpenGLプログラミングOpenGLプログラミング
OpenGLプログラミング
 
Unityの夕べ in Fukuoka
Unityの夕べ in FukuokaUnityの夕べ in Fukuoka
Unityの夕べ in Fukuoka
 
Android起動周りのノウハウ
Android起動周りのノウハウAndroid起動周りのノウハウ
Android起動周りのノウハウ
 
OpenCLに触れてみよう
OpenCLに触れてみようOpenCLに触れてみよう
OpenCLに触れてみよう
 
StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件
 
Tizen 2.0 alpha でサポートされなかった native api
Tizen 2.0 alpha でサポートされなかった native apiTizen 2.0 alpha でサポートされなかった native api
Tizen 2.0 alpha でサポートされなかった native api
 
Cell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始めCell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始め
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門
 
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
 
とある帽子の大蛇料理Ⅱ
とある帽子の大蛇料理Ⅱとある帽子の大蛇料理Ⅱ
とある帽子の大蛇料理Ⅱ
 
Build 番号の自動更新スクリプトについて #cocoa_kansai
Build 番号の自動更新スクリプトについて #cocoa_kansaiBuild 番号の自動更新スクリプトについて #cocoa_kansai
Build 番号の自動更新スクリプトについて #cocoa_kansai
 
初心者向けAndroidゲーム開発ノウハウ
初心者向けAndroidゲーム開発ノウハウ初心者向けAndroidゲーム開発ノウハウ
初心者向けAndroidゲーム開発ノウハウ
 
Python東海GAEやってみた
Python東海GAEやってみたPython東海GAEやってみた
Python東海GAEやってみた
 
about DakotagUI
about DakotagUIabout DakotagUI
about DakotagUI
 
PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門
 
カーネルモジュールプログラミング超入門 #1(仮)
カーネルモジュールプログラミング超入門 #1(仮)カーネルモジュールプログラミング超入門 #1(仮)
カーネルモジュールプログラミング超入門 #1(仮)
 
PF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsolaPF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsola
 
Ansible2.0と実用例
Ansible2.0と実用例Ansible2.0と実用例
Ansible2.0と実用例
 
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
 

どこでも動くゲームを作るためのベタープラクティス