スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

カテゴリ : スポンサー広告

tjsで循環参照とか

tjsのガベコレは単純な参照カウント方式です。
循環参照があるとメモリリークします。
詳細は参照カウント、循環参照などで検索してください。

tjsを使っていると結構簡単に起きます。
吉里吉里製のゲームをずっと起動していると使用メモリがどんどん増えていったりします。

例えば以下の短いコードでもメモリリークします。
class C {
  var t = new Timer(this);
}
for (var i = 0; i < 10000; ++i)
  var obj = new C();
クラスCとTimerの間で循環参照しているためです。
Cをnewしたら明示的にinvalidateしなければなりません。
スポンサーサイト

タグ : 吉里吉里 TJS

カテゴリ : 雑記

隠れ機能メモSystem.exitOnNoWindowStartup

吉里吉里ドキュメントには載っていませんがSystem.exitOnNoWindowStartupというプロパティがあります。
trueのとき、最初のスクリプト実行中にWindowが生成されなければそのまま終了します。
falseのときは終了せずプロセスに残ります。
デフォルトではtrueです。

これまで使ったこともなく、これからも使いそうにありません。
System.exitOnWindowCloseにちょっと似てます。

カテゴリ : 吉里吉里

tjsで名前空間を使うメモ

Scripts.execStorageのコンテキスト指定によって名前空間らしきものが使えます。
コンテキスト指定ができるのは開発版のみです
参考:吉里吉里安定版と開発版の違いメモ

以下サンプル。startup.tjs, a.tjs, b.tjsの3つにわかれています。
// startup.tjs
Plugins.link("ScriptsEx.dll"); // Scripts.getObjectContextを使う
class Namespace {} // ネームスペースとして使うクラス

Scripts.execStorage("a.tjs",,Namespace);
Scripts.execStorage("b.tjs",,Namespace);

Debug.message("new Namespace.A()");
var a = new Namespace.A();

Debug.message("new Namespace.B()");
var b = new Namespace.B();

Debug.message('a instanceof "Namespace.A" == ' + (a instanceof "Namespace.A"));
Debug.message('a instanceof "A" == ' + (a instanceof "A"));
Debug.message('Scripts.getClassNames(a).join(", ") == ' + Scripts.getClassNames(a).join(", "));
Debug.message('Scripts.getClassNames(b).join(", ") == ' + Scripts.getClassNames(b).join(", "));

// a.tjs
if (Scripts.getObjectContext(this) != Namespace) { throw new Exception(); }
class A {
  function A() { Debug.message("A()"); }
}

// b.tjs
if (Scripts.getObjectContext(this) != Namespace) { throw new Exception(); }
class B extends Namespace.A {
  function B() { super.A(); Debug.message("B()"); }
}

コンテキストにNamespaceを指定しているので、AとBはNamespaceの中で定義されます。

a.tjsとb.tjsではScripts.getObjectContextを使ってNamespaceコンテキストで呼ばれているかチェックしています。
ミスがないようにチェックしているだけなので無くても動きます。

あとはNamespace.AやNamespace.Bで使えます。
ただしinstanceofでは"Namespace.A"ではなく"A"となります。
少し面倒なのでinstanceofの代わりに適当な関数を作ってもいいかもしれません。

このスクリプトを実行すると、Debug.messageの出力は以下のようになります。
new Namespace.A()
A()
new Namespace.B()
A()
B()
a instanceof "Namespace.A" == 0
a instanceof "A" == 1
Scripts.getClassNames(a).join(", ") == A
Scripts.getClassNames(b).join(", ") == B, A

実際はこんなことをせずにNamespace_Aのようなクラス名にしてしまうのがいいと思います。

続きを閉じる▲

タグ : 吉里吉里 TJS

カテゴリ : TJS

最新記事
カテゴリ

openclose

記事一覧
Twitter
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。