[PR]
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
vs2015のプロジェクトを立ち上げてすぐに目についた処理
プログラム |
create_task([this, deferral]()
{
m_deviceResources->Trim();
// ここにコードを挿入します。
deferral->Complete();
});
//----------------------------------------------------- // シーン オブジェクトを更新します。 m_timer.Tick([&]()
{
// TODO: これをアプリのコンテンツの更新関数で置き換えます。
m_sceneRenderer->Update(m_timer);
m_fpsTextRenderer->Update(m_timer);
});
|
プログラム |
// 15を返す式( キャプチャ:無し 引数:無し 実装:return 15 ) int val15 = [] () { return 15; } (); int val15 = [] { return 15; } (); // 引数部無しでも可 // 足し算( キャプチャ:無し 引数:int a, b; 実装:return a+b ) int a = 5, b = 7; [] (int a, int b) { return a+b; } ( a, b ); // テスト関数 int testFunc() { int a = 10, b = 2, c = 3; // aを20で上書きする( キャプチャ:参照 引数:なし 実装:a = 20) [&] { a = 20; } (); // ちなみにキャプチャがコピーのとき値の変更は不可能 // この例だとたとえ変更できてもコピーされた値を書き換えただけなので // 結局反映されないんですけどね。 //[=] { a = 20; } (); // コンパイルエラー return a*b - a*c; } |
やっと時間が出来始めたので制作開始。
さて、前方宣言の解決のメモ。
namespaceは普通にこう。
プログラム |
// 前方宣言 namespace MySpace { class MyClass; }; // 使用例 void func(const MySpace::MyClass& object); |
プログラム |
struct BaseClass { int a, b c; }; // typedef typedef BaseClass MyClass; |
プログラム |
// 前方宣言 struct BaseClass; typedef BaseClass MyClass; // 使用例 void func(const MyClass& object); |
基本的には普通にgl関数を呼ぶだけでいいみたいですが、いちおうメモ。
まず生成について。
GLSurfaceView.Rendererの継承関数内であれば正常に生成できます。
次に破棄、これも
生成と同タイミングで可能です。
プログラム |
public abstract class Scene { public abstract void Init(); // 初期化. ロードはしない. public abstract void Step(); // 毎ループの更新処理. public abstract void Draw();// 毎ループの描画処理. public abstract void Destroy(); // 全メンバ変数の解放 public abstract void DeleteTexture(); // Textureのみの破棄 public abstract void LoadResources( resources ); // 全リソースのロード public abstract void LoadTexture( resources ); // Textureのみのロード public abstract void TouchEvent( event ); // Androidの入力処理 } |
作業に没頭していると全然記事を書こうっていう気分にならないんですよねぇ。
日記はすぐ無くしますし……。
基本的に記録するのに向いてないのかもしれないなぁ。
まぁ忘備録もかねてますんで続けますけどね。
さて、今日はAndroidのプログラムをずっとしてました。しかもEclipceで。
Unityでやったほうが楽なんでしょうけど、一回やってみたかったんですよね。
javaとOpenGLによる開発です。
OpenGL触ったことあんまりなかったんで
取り敢えず3つほどのサイト調べつつ
Android公式リファレンス広げてふむふむと進めていきました。
慣れてない言語は手探り感がひどいですね。(笑)
***
まず嵌ったのがByteBufferの作成です。
ByteBuffer.allocate関数を呼んで救ったBufferはGLに使用できないんですね。
ByteBuffer.allocateDirect関数を使わねばなりません。
じゃないとエラーです。これはうっかりミス。
またglEnableClientStateで許可をだした場合その要素のnullは認められないようですね。
ログにエラーが出続けました。
nullチェックぐらいしてもよさそうなものですが……。
それともチェックした上でエラーを表示してるのかな?
glDisable、glDisableClientStateで無効にした場合はその要素が適用されなくなるのですが、
設定したBufferやObjectは参照し続けます。GCの対象外になりそうで怖いですね。
うっかり外し忘れると解放を忘れたオブジェクトが残りそうです。
***
とまぁこんな感覚でずっといじってました。
普段なら気にならないでしょうが、でっかいBufferを外し忘れると
占有サイズが大きくなりそうで怖いですね。まぁ滅多にない、ということなの…かな?
それにしてもホットミルクが美味しい季節ですね。
ではおやすみなさい。
本当にどうなってんのっていう寒さに体がついていきません。
運動しなきゃなぁ…。
皆さん突然の運動によるぎっくり腰には注意しましょうね。
はい、というわけで手作りアロケータ続きやっていきます。
メモリ確保のNew機能を実装しましょう。手順としては
1、メモリから空き要素を探す
2、空き要素を必要な分だけ使用中にする。
はい、これだけです。
んで、ここで問題です。ここでいうメモリはどこにあるんでしょうね。
この場合の正解は「どこにもない」です。作ってないですからね。
なのでまずメモリを作りましょう。
プログラム |
namespace Allocater{ class MemoryPool{ private: void* memoryPool; uint memoryPoolSize; public: // ポインタのNULL初期化は忘れない事。 MemoryPool() : memoryPool(NULL){} // 解放忘れてたら教えてもらう。 ~MemoryPool() { if( memoryPool ){ DEBUG_ERROR_PRINT("解放忘れ!"); } } // メモリを確保する void Init(uint size) { // どこかで使っているかもしれないので解放しない // NULLのときだけ確保を許可する if( memoryPool == NULL ){ memoryPoolSize = size; memoryPool = malloc(size); } }; // メモリを解放する void Release() { if( memoryPool ){ memoryPoolSize = 0; free( memoryPool ); memoryPool = NULL; } } }; }/* Allocater */ |