Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 31 additions & 2 deletions LuaSTG/LuaSTG/GameObject/GameObjectPool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -200,8 +200,8 @@ namespace luastg
}
dispatchOnAfterBatchDestroy();
}
void GameObjectPool::updateNext() {
tracy_zone_scoped_with_name("LOBJMGR.AfterFrame(New)");
void GameObjectPool::updateNextOld() {
tracy_zone_scoped_with_name("LOBJMGR.AfterFrame(V2)");
dispatchOnBeforeBatchDestroy();
auto const super_pause_time = UpdateSuperPause(); // 更新超级暂停
for (auto p = m_update_list.first(); p != nullptr;) {
Expand All @@ -218,6 +218,18 @@ namespace luastg
}
dispatchOnAfterBatchDestroy();
}
void GameObjectPool::updateNext() {
tracy_zone_scoped_with_name("LOBJMGR.UpdateXY(V2)");
auto const super_pause_time = UpdateSuperPause(); // 更新超级暂停
for (auto p = m_update_list.first(); p != nullptr;) {
if (super_pause_time > 0 && !p->ignore_super_pause) {
p = p->update_list_next;
continue;
}
p->UpdateLastV2();
p = p->update_list_next;
}
}
void GameObjectPool::detectOutOfWorldBoundLegacy() {
tracy_zone_scoped_with_name("LOBJMGR.BoundCheck");

Expand Down Expand Up @@ -470,6 +482,23 @@ namespace luastg
auto const has_callback_legacy_kill = legacy_kill_mode && object->features.has_callback_legacy_kill;
return has_callback_destroy || has_callback_legacy_kill;
}
void GameObjectPool::freeMarkedForDeletion() {
tracy_zone_scoped_with_name("LOBJMGR.AfterFrame(V3)");
dispatchOnBeforeBatchDestroy();
const auto super_pause_time = GetSuperPauseTime();
for (auto p = m_update_list.first(); p != nullptr;) {
if (super_pause_time > 0 && !p->ignore_super_pause) {
p = p->update_list_next;
continue;
}
if (p->status != GameObjectStatus::Active) {
p = freeWithCallbacks(p);
continue;
}
p = p->update_list_next;
}
dispatchOnAfterBatchDestroy();
}

void GameObjectPool::DrawCollider()
{
Expand Down
14 changes: 10 additions & 4 deletions LuaSTG/LuaSTG/GameObject/GameObjectPool.h
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,10 @@ namespace luastg
// 对象更新:传统模式新旧帧衔接
void updateNextLegacy();

// 对象更新:新旧帧衔接
// 对象更新:新旧帧衔接(带对象回收)
void updateNextOld();

// 对象更新:新旧帧衔接(不带对象回收)
void updateNext();

// 渲染所有游戏对象
Expand Down Expand Up @@ -354,10 +357,10 @@ namespace luastg
// 检测所有 -> 回调所有
void detectIntersection(std::pmr::vector<IntersectionDetectionGroupPair> const& group_pairs);

/// @brief 更新对象的XY坐标偏移量
// 更新对象的XY坐标偏移量
void UpdateXY() noexcept;

//重置对象的各项属性,并释放资源,保留uid和id
// 重置对象的各项属性,并释放资源,保留uid和id
void DirtResetObject(GameObject* p) noexcept;

// 修改游戏对象所在的碰撞组:从原碰撞组链表移除,插入到新碰撞组链表,并更新 group 属性
Expand All @@ -366,7 +369,10 @@ namespace luastg
// 修改游戏对象渲染图层:从有序渲染链表移除,更新 layer 属性,重新插入有序渲染链表
void setLayer(GameObject* object, double layer);

/// @brief 清空对象池
// 回收标记为删除的游戏对象
void freeMarkedForDeletion();

// 清空并重置对象池
void ResetPool() noexcept;

[[nodiscard]] GameObject* allocate() { return allocateWithCallbacks(nullptr); }
Expand Down
6 changes: 0 additions & 6 deletions LuaSTG/LuaSTG/LuaBinding/LW_GameObjectManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,6 @@ void luastg::binding::GameObjectManager::Register(lua_State* L) noexcept
);
return 0;
}
static int UpdateXY(lua_State* L) noexcept
{
LPOOL.UpdateXY();
return 0;
}
// EX+ 对象更新相关,影响 frame 回调函数以及对象更新
static int GetSuperPause(lua_State* L) noexcept
{
Expand Down Expand Up @@ -103,7 +98,6 @@ void luastg::binding::GameObjectManager::Register(lua_State* L) noexcept
// 对象管理器
{ "GetnObj", &Wrapper::GetnObj },
{ "SetBound", &Wrapper::SetBound },
{ "UpdateXY", &Wrapper::UpdateXY },
// EX+
{ "GetSuperPause", &Wrapper::GetSuperPause },
{ "SetSuperPause", &Wrapper::SetSuperPause },
Expand Down
35 changes: 32 additions & 3 deletions LuaSTG/LuaSTG/LuaBinding/modern/GameObject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -845,16 +845,44 @@ namespace luastg::binding {
ctx.push_value(has_callback);
return 1;
}
static int updateNext(lua_State* const vm) {

static int apiUpdateXY(lua_State* const vm) {
// TODO: 移动到 GameObjectManager 绑定
// version 2
if (lua::stack_t const ctx(vm); ctx.is_number(1)) {
if (auto const version = ctx.get_value<int32_t>(1); version == 2) {
const auto version = ctx.get_value<int32_t>(1);
if (version == 2) {
GameObjectManagerCallbacks::getInstance().lua_vm.push_back(vm);
LPOOL.updateNext();
GameObjectManagerCallbacks::getInstance().lua_vm.pop_back();
return 0;
}
else {
return luaL_error(vm, "unknown version number %d", version);
}
}
// version 1
LPOOL.UpdateXY();
return 0;
}
static int apiAfterFrame(lua_State* const vm) {
// TODO: 移动到 GameObjectManager 绑定
// version 2
if (lua::stack_t const ctx(vm); ctx.is_number(1)) {
const auto version = ctx.get_value<int32_t>(1);
if (version == 2) {
GameObjectManagerCallbacks::getInstance().lua_vm.push_back(vm);
LPOOL.updateNextOld();
GameObjectManagerCallbacks::getInstance().lua_vm.pop_back();
return 0;
}
else if (version == 3) {
LPOOL.freeMarkedForDeletion();
return 0;
}
else {
return luaL_error(vm, "unknown version number %d", version);
}
}
// version 1
GameObjectManagerCallbacks::getInstance().lua_vm.push_back(vm);
Expand Down Expand Up @@ -1091,7 +1119,8 @@ namespace luastg::binding {
ctx.set_map_value(lstg_table, "ResetObject"sv, &GameObjectBinding::dirtyReset); // TODO: WTF?
ctx.set_map_value(lstg_table, "_Del"sv, &GameObjectBinding::queueToFree);
ctx.set_map_value(lstg_table, "_Kill"sv, &GameObjectBinding::queueToFreeLegacyKillMode);
ctx.set_map_value(lstg_table, "AfterFrame"sv, &GameObjectBinding::updateNext);
ctx.set_map_value(lstg_table, "UpdateXY"sv, &GameObjectBinding::apiUpdateXY);
ctx.set_map_value(lstg_table, "AfterFrame"sv, &GameObjectBinding::apiAfterFrame);
ctx.set_map_value(lstg_table, "ResetPool"sv, &GameObjectBinding::resetGameObjectManager);
ctx.set_map_value(lstg_table, "ObjFrame"sv, &GameObjectBinding::updateGameObjectManager);
ctx.set_map_value(lstg_table, "ObjRender"sv, &GameObjectBinding::renderGameObjectManager);
Expand Down
Loading