昨日申請したねこマタですが、もうバージョンアップ完了して、アプリストアに反映されました。最近は審査早いな・・・。私が開発始めた2009年頃は2週間程度、ちょっと前までは1週間くらいかかったのにな・・・。
今日はバージョンアップ内容に合わせてアプリストアの説明文やWebサイトのアプリ紹介ページをちまちま直していました。
昨日申請したねこマタですが、もうバージョンアップ完了して、アプリストアに反映されました。最近は審査早いな・・・。私が開発始めた2009年頃は2週間程度、ちょっと前までは1週間くらいかかったのにな・・・。
今日はバージョンアップ内容に合わせてアプリストアの説明文やWebサイトのアプリ紹介ページをちまちま直していました。
今日はねこマタの新バージョンをアップルに申請しました。
変更は以下の2点です。
・対人戦の1日3回の制限が無くなりました。
・対人ステージ”P”を追加しました。
なんか難しそうなアプリだな・・・と思った方は、
しつこいくらい詳しく解説 — ねこマタ入門(JAPANESE ONLY)
をご覧ください。只今日本語限定で詳しく解説しています。日本人でよかったですね。
立った立った!
クララが立った!
\|/
⊂⌒⊃ ― ● ―
⊂⊃ /|\
⊂⊃ ⊂⊃
/~\へ/~\へヘ/~\
ハ`ハハハハ`ハハ`ハハハハハ`ハハハハ
” “””” “”” “””” “”””
∥=∥=∥=∥=∥=∥=∥
” “∧_∧” “”” “””” ”
” (´∀`) “e@@e”””
“⊂ ⊃” (・∀・)_ノ
○( ノ””とと__つ
“” )_)) “” ” “” “”ミ
“” “” ∧∧” “”” __
” “” (∀・;) “” | ∥
“””⊂⊂⌒ヽ “” |_∥
“” プル )) )○∠_/)
“” (( (_(_ノ ))プル ◎
||” “”||” “”||” “”||
||二二||二二||二二||
先日作成したC#(OpenTK)のコードをC++に変換し、共通のソースコードでMac,Ubuntu(Linux),Windowsの各種環境において3D図形を描画することに成功しました!Write once, run anywhere!
そして・・・
祝!脱MS環境依存!!
(੭ु ›ω‹ )੭ु⁾⁾♡
OSはもちろん、開発言語等もMSに依存しなくなったよ。
以下が完成したC++のコードです。
https://github.com/ukaapple/cubeTest-cpp/blob/master/CubeInsWindow.cpp
立方体を100x100x100で、合計100万描画します。
TriangleStripで、かつ Instancing使っているので高効率です。メモリ12MB程度しか使わずに済んでいます。
TriangleStripに関しては、過去の日記で記述しています。こんな感じでテクスチャを貼るやり方のことです。
InstancingとはOpenGLの用語で、同じ形状を、位置情報だけいっぱい与えていろんな場所に描画することです。描画速度向上や使用メモリ量削減が期待できます。
ちなみにInstancingを使わないとメモリ使用量が340MBに跳ね上がります。以下が使わない場合のソースです。
https://github.com/ukaapple/cubeTest-cpp/blob/master/CubeWindow.cpp
以下のコードで CubeInsWindow を CubeWindow に変更すると、Instancingを使わない描画に切り替えることが出来ます。
https://github.com/ukaapple/cubeTest-cpp/blob/master/Program.cpp
タイトルバーにfpsを表示するようにしてるので、OpenGLのベンチマーク目的でいろんな環境で実行するのも良いかもしれません。
ちなみに、ハードウェアが同じならば、OSが同じでもベンチマーク結果はほぼ同じでした。
ただし、Windowsを除いて。なぜかWindowsだけ、明らかにFPSが5〜8%低かったです。
これでSteamでの開発準備ができました。次のアプリ、iOSで出そうかな?それともSteamで出そうかな。
(੭ु ›ω‹ )੭ु⁾⁾♡
先日作成したマルチプラットフォーム対応のOpenGLコードを、mac、Linux(Ubuntu 18.04 LTS)に続いて、Windowsで動作させます。
Windows7で試しました。
さすが、過去にLinuxを癌だと言っていた会社です。邪悪な独自仕様を進化させたそのOSは、マルチプラットフォーム対応コードの動作を阻む高い壁の名残があるようです。動作させるために面倒な準備が必要になりました。
まずMinGW、CMake、Makeをインストールします。インストール後、PATHを適切に設定してください。
次に、glfwのソースを持ってきてビルドします。(バイナリ持ってきても動きませんでした)
CMakeでMinGW用のビルドファイルを生成し、makeコマンドを実行して、最終的に生成されるlibglfw3.aをMinGW\libフォルダの中にコピーします。また、ヘッダーファイルをMinGW\include\GLFWの中にコピーします。
さらに、glewのソースを持ってきてビルドします。(こちらもバイナリを持ってきても動きませんでした)
glfwと同様に、CMakeでMinGW用のビルドファイルを生成後、makeコマンドを実行して、最終的に生成されるlibglew32.aとlibglew32.dll.aをMinGW\libフォルダの中にコピーします。また、ヘッダーファイルをMinGW\include\GLの中にコピーします。更に、glew32.dllをパスの通っている場所にコピーしておきます。
尚、CMakeやMakeコマンドの実行時は、セキュリティソフトのリアルタイム保護を無効にしてください。
何故かウィルスと判断されて作業が失敗してしまいます。
うーん・・・
以上で準備完了です。目的のコードをコンパイルして実行しましょう。
g++ Program.cpp -lglfw3 -lglew32 -lgdi32 -lopengl32
やっと動きました。
え?Visual Studio?何それ?
マルチプラットフォーム対応のOpenGLコードの第一歩です。
とりあえずmacでC++を使ってウィンドウを表示します。
各種OSで動作させるためにGLFWを利用します。GLFWはオープンソースのマルチプラットフォーム対応ライブラリで、Window表示やコンテキスト、入力イベントなどを扱えます。GLEWはOpenGL拡張を手軽に用いることができる便利ツールで、こちらも利用します。インストールしましょう。
brew install glfw
brew install glew
コードは以下の通りです。徹夜で書き上げました。解説?初めて利用するライブラリなので解説できるほどの知識は持っていません・・・
#include <iostream>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
using namespace std;
int main() {
// GLFW init
if (glfwInit() == GL_FALSE) {
cout << "failed to glfwInit" << endl;
return 1;
}
atexit(glfwTerminate);
// create window
GLFWwindow *const window(glfwCreateWindow(1200, 720, "GameInsWindow", NULL, NULL));
if (NULL == window) {
cout << "failed to create window" << endl;
return 1;
}
// OpenGL 4.1
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
// make context
glfwMakeContextCurrent(window);
glfwSwapInterval(1);
// GLEW init
if (GLEW_OK != glewInit()) {
cout << "failed to glewInit" << endl;
return -1;
}
// clear
glClearColor(0.0f, 0.5f, 0.0f, 1.0f);
while (glfwWindowShouldClose(window) == GL_FALSE) {
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);
glfwPollEvents();
}
return 0;
}
コンパイルしましょう。IDE?CMake?なにそれ美味しいの?
g++ Program.cpp -lglfw -lglew -framework OpenGL
とりあえずmacで動作することを確認しました。
明日はLinux(Ubuntu)や、EdgeやCortanaの利用を強制してくる邪悪なWindowsでも動作確認を行なっていきます。
私の今の目標は、Steamでマルチプラットフォーム対応のゲームを公開することです。
出来れば共通のソースコードで各種環境に対応させたいと考え、先日、.NET CoreとOpenTKを使って、Mac/Linux(Ubuntu)/Windowsの各種環境で動作するOpenGLの共通ソースを書きましたが、この方法ではダメなようです。書き上げてから判明しました。
Steamでゲームを公開する際、Linux(Ubuntu)やMacに関しては利用できるライブラリが決まっており、.NET Coreなどは使えません。多分。
結論としては、C++でOpenGLを利用する形で行けば大部分は大丈夫な気がしています。
DirectXは論外です。Windowsでしか動きません。スマホ/Mac/Linuxが対象外になってしまいます。
と言うわけで、直近での次の作業はC#で書き上げたソースをC++に変更することとしました。その際、C++からOpenGLを利用するためfreeglutを使います。GUIに関してOpenTK(GameWindowクラス)は使えないので、GLFWなども利用予定です。
遂に成し遂げました。
海外に武者修行へ1年間行った結果、Unityなどのツールを使わずに、共通のソースコードでMac,Ubuntu(Linux),Windowsの各種環境において3D図形を描画することに成功しました!Write once, run anywhere!
・・・いや、違いました。.NET Core上でOpenTKを使っただけでした。
以下が環境に依存せず動く3D描画PGです。
https://github.com/ukaapple/cubeTest-OpenTK/blob/master/CubeInsWindow.cs
立方体を100x100x100で、合計100万描画します。
TriangleStripで、かつ Instancing使っているので高効率です。メモリ12MB程度しか使わずに済んでいます。
TriangleStripに関しては、過去の日記で記述しています。こんな感じでテクスチャを貼るやり方のことです。
InstancingとはOpenGLの用語で、同じ形状を、位置情報だけいっぱい与えていろんな場所に描画することです。描画速度向上や使用メモリ量削減が期待できます。
百万個は実際にソースコードを動かして確認して下さい。UbuntuやMacではライブラリのインストールが必要です。README.mdを参照して下さい。
目が痛くなることを保証します。
ちなみにInstancingを使わないとメモリ使用量が340MBに跳ね上がります。以下が使わない場合のソースです。
https://github.com/ukaapple/cubeTest-OpenTK/blob/master/CubeWindow.cs
以下のコードで CubeInsWindow を CubeWindow に変更すると、Instancingを使わない描画に切り替えることが出来ます。
https://github.com/ukaapple/cubeTest-OpenTK/blob/master/Program.cs
また、コンストラクタ引数の100の部分を変更することで描画する立方体の数を変更することが出来ます。あまりに描画数を多くしすぎてマシンのメモリを使い果たさないように気を付けて下さい。
タイトルバーにfpsを表示するようにしてるので、OpenGLのベンチマーク目的でいろんな環境で実行するのも良いかもしれません。
Ubuntuにおいて、.NET CoreでSystem.Drawing配下のライブラリを扱う方法を記述します。
OpenTKにおいて、テクスチャなどを扱う際に必要です。
UbuntuでSystem.Drawing配下のライブラリ利用時に、以下のようなエラーが発生した場合の対処方法となります。
例外が発生しました: CLR/System.TypeInitializationException
An unhandled exception of type ‘System.TypeInitializationException’ occurred in System.Drawing.Common.dll: ‘The type initializer for ‘Gdip’ threw an exception.’
Inner exceptions found, see $exception in variables window for more details.
Innermost exception System.DllNotFoundException : Unable to load DLL ‘libgdiplus’: The specified module could not be found.
$ sudo apt-get update
$ sudo apt-get install libgdiplus
これだけ!
macに比べるととっても簡単です。
OS Xにおいて、.NET CoreでSystem.Drawing配下のライブラリを扱う方法を記述します。
OpenTKにおいて、テクスチャなどを扱う際に必要だったので・・・
まずは、X11をインストールします。ここからdmgをダウンロードしてインストールします。
インストール後はシンボリックリンクを貼っておきます。
ln -s /opt/X11/include/X11 /usr/local/include/X11
VSCodeを立ち上げ、Shift(⇧)+Command(⌘)+Pを押して “nuget” と打ちます。リストから「NuGet Package Manager: Add Package」を選択します。※NuGetインストール済みを想定
続いて “System.Drawing.Common” と打ってリターンキーを押下し、「System.Drawing.Common」を選択します。すると、インストール可能なバージョンリストが表示されるので選びます。特に理由がなければいちばん新しいバージョンを選びます。
次に、ターミナルからlibgdiplusをインストールします。事前に色々な依存ライブラリを入れてから、ソースを持ってきてメイク&インストールです。エラーやワーニングが出るかもしれません。柔軟に対応する必要があります。
$ brew install autoconf
$ brew install pkg-config
$ brew install readline
$ brew install automake
$ brew install gettext
$ brew install glib
$ brew install intltool
$ brew install libtool
$ brew install cairo
$ brew install jpeg
$ brew install libtiff
$ git clone https://github.com/mono/libgdiplus.git
$ cd libgdiplus
$ CPPFLAGS="-I/usr/local/opt/libpng12/include -I/opt/X11/include" LDFLAGS="-L/usr/local/opt/libpng12/lib -L/usr/X11/lib" ./autogen.sh
$ ./configure
$ make && make install