1

iOS および OSX 用の Lua でローグライクを開発しています。Lua はかなり新しく、自分のプラットフォームで math.random が非ランダムであることに がっかりしました。関数を介して設定された乱数の呼び出しを既に設定していました。

function rollD(max)
   return math.random(max)
end

だから私はこの投稿に応えて素晴らしい答えを見つけました。それは私の問題を解決すると思います(ゲームが毎回異なることはローグライクにとって非常に重要です)しかし、次の微調整機能を作成するために:

function rollD(max)
    return srandom(seedobj,1,max)
end

仕事、私はしなければならなかった:

local seedobj = { seed = -232343 }

Donati の Knuth 適応から、もうローカルではなく、実際に (os.time()*-1) を使用するように変更しました。これは実際のところ、これまでのところ完全に機能しており、私の (非常に初歩的な) ローグライク ゲームは、思いどおりにランダムな悪者やダンジョンを巻き上げています。でも、うまくいくと不安…。

srandomへの呼び出しの数が多い場合(おそらくレベルごとに 1000 回以上の呼び出し)、seedobjをグローバルにすることで何らかのパフォーマンス ヒットが発生するでしょうか? テーブルにネストされているので、そのシードは参照であり、何も心配していないと思いたいです。しかし、それ以外の場合:この関数をより効率的に呼び出すことができるように変更する方法はありますか?

4

1 に答える 1

2

Lua でグローバル変数にアクセスすることは、テーブル フィールドにアクセスすることに似ています。グローバルの場合seedobj、次のコード:

function rollD(max)
    return srandom(seedobj,1,max)
end

Lua 5.2 では、次と同等です。

function rollD(max)
    return srandom(_ENV.seedobj,1,max)
end

またはLua 5.1では(おおよそ)同等です

function rollD(max)
    return srandom(_G.seedobj,1,max)
end

_ENVは現在の環境テーブルを保持する変数で_Gあり、はグローバル テーブルを保持する変数です。

したがって、呼び出すたびrollDに、ローカル変数と比較して、その間接アクセスのパフォーマンスがわずかに低下します。一般に、このペナルティは、 を呼び出すときに実行される他の操作の複雑さに応じて、重要であるかどうかに依存しますrollD

srandomあなたの特定のケースでは、実装はすでにはるかに集中的な計算を実行しているため(その中には、一部のテーブルにもアクセスするため)、ペナルティが目立つ可能性は低いです。

于 2013-10-19T07:46:24.900 に答える