lua面接問題:ホット更新の概要、原理と例
1032 ワード
1、ホットアップデートとは?
ホットアップデートはダウンタイム更新とも呼ばれ、ゲームサーバの稼働中にゲームを更新します.ダウンタイムなしでバグを修正したり、ゲームデータを修正したりする操作を実現します.1台の車が時速150 kmで走っていて、突然パンクしたので、運転手は私が駐車しないと言って、タイヤを交換して、気をつけてください.うん
2、熱更新原理
1つ目:
luaのrequireは、同じモジュールを複数回ロードすることを阻止します.システムを更新する必要がある場合は、応答のモジュールをアンインストールします.(package.loadedの対応するモジュール名をnilに設定し、次回のrequireの再ロードを保証します)グローバルテーブルの対応するモジュールテーブルをnilに設定します.同時にデータを専用のグローバルテーブルの下に記録し、localで参照します.これらのデータを初期化するときは、まず初期化されたかどうかを確認する必要があります.これにより、データが更新プロセスによってリセットされないことを保証します.
コードの例:
問題は多く,古い参照モジュールは更新されず,この程度の熱更新は明らかに現在のゲーム開発のニーズを満たすことができない.
2つ目:
ホットアップデートはダウンタイム更新とも呼ばれ、ゲームサーバの稼働中にゲームを更新します.ダウンタイムなしでバグを修正したり、ゲームデータを修正したりする操作を実現します.1台の車が時速150 kmで走っていて、突然パンクしたので、運転手は私が駐車しないと言って、タイヤを交換して、気をつけてください.うん
2、熱更新原理
1つ目:
luaのrequireは、同じモジュールを複数回ロードすることを阻止します.システムを更新する必要がある場合は、応答のモジュールをアンインストールします.(package.loadedの対応するモジュール名をnilに設定し、次回のrequireの再ロードを保証します)グローバルテーブルの対応するモジュールテーブルをnilに設定します.同時にデータを専用のグローバルテーブルの下に記録し、localで参照します.これらのデータを初期化するときは、まず初期化されたかどうかを確認する必要があります.これにより、データが更新プロセスによってリセットされないことを保証します.
コードの例:
function reloadUp(module_name)
package.loaded[modulename] = nil
require(modulename)
end
このやり方は簡単で乱暴で、ホット更新はできますが、問題は多く,古い参照モジュールは更新されず,この程度の熱更新は明らかに現在のゲーム開発のニーズを満たすことができない.
2つ目:
function reloadUp(module_name)
local old_module = _G[module_name]
package.loaded[module_name] = nil
require (module_name)
local new_module = _G[module_name]
for k, v in pairs(new_module) do
old_module[k] = v
end
package.loaded[module_name] = old_module
end