ローカル変数の罠2
昨日の問題はlua_getstackをあらかじめ行っておくことで解決できるかと思ったんだけど、
lua_getstackで取ってくるスタックの位置が相対的な状態で結局参照できなかった。
ファイル単位でのグローバルスコープにあるローカル変数は、
参照がない時はほとんどグローバル変数と同じ状態なのでずっと残りっぱなし。
しかもグローバル変数と違いCからのアクセスは(できたとしても)非常に困難な上、
同じファイルを評価した際に再びローカル変数領域が確保されてしまうようなのでとにかくすごい扱いづらい。
ローカル参照テーブルがでかくなれば参照するだけでもものすごい時間がかかるようになってしまうみたいだし。
名前にユニーク性を持たせられるならグローバルの方が100倍よい。というのが結論。
一度定義した変数そのものを削除する方法もよく分からないし。
よく、"Luaは重い"って書く人が居るけど
- 変数が残りっぱなしで内部の変数参照テーブルが超巨大になってしまっている。
- lua_newthreadでスレッド作りまくってyeildしまくっている。
というのが主な原因なんじゃないんだろうか。
大体、1オブジェクト1スレッドなんかにしたら重くなるのは想像に難くないと思うんだけど。
30オブジェクトで60fpsで回したら、1秒間に1800回のluaコンテキストの切り替えが発生するわけで、
それこそ10000オブジェクト作ったらすごい重いよとか書いてる人はちょっと想像力が足りてないというか、
そういう人は最適化をする時とか、全体の処理の数%の部分の最適化を必死こいてやっちゃうようなうっかり屋さんなんだろうね。
結局大域的な処理の制御に使うのがLuaの一番正しい使い方なんだろう。
でもローカル変数管理はどうにかして欲しい。ほんとやばい。とにかくやばい。
11/25追記
ごめん。うそ。増えない。
tofunctionしたのがreleaseしてくれてなかったみたい。。。
local変数で同じスコープの場合は上書きされてるからブリブリは増えていかない。シンボルが残っちゃうのはどうにもならないっぽいけどね。
ということでtofunctionしたらreleaseは絶対やること!約束だよ!?