From fc35f25d3ee02a28d408443e533d6f8bae0d6989 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20=E2=80=98Touky=E2=80=99=20Huet?= Date: Thu, 23 Apr 2015 02:19:50 +0000 Subject: [PATCH] Fixed the scene destroy crash --- build/Lol (vs2013).sln | 94 ++++++++++++++++++++---------------------- src/ticker.cpp | 48 ++++++++++++++++----- 2 files changed, 82 insertions(+), 60 deletions(-) diff --git a/build/Lol (vs2013).sln b/build/Lol (vs2013).sln index b95729d2..e07b8717 100644 --- a/build/Lol (vs2013).sln +++ b/build/Lol (vs2013).sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.31101.0 +VisualStudioVersion = 12.0.21005.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "deushax", "..\games\deushax\deushax.vcxproj", "{EF1A4E80-63FA-4EB0-B834-12B6C500F31C}" EndProject @@ -757,97 +757,91 @@ Global {81C83B42-D00A-4FA3-9A3D-80F9D46524BF}.Release|x64.ActiveCfg = Release|x64 {81C83B42-D00A-4FA3-9A3D-80F9D46524BF}.Release|x64.Build.0 = Release|x64 {81C83B42-D00A-4FA3-9A3D-80F9D46524BF}.Release|Xbox 360.ActiveCfg = Release|Win32 - {B9A255A0-2B92-4801-AF6C-354535A6E105}.Debug|ORBIS.ActiveCfg = Debug|ORBIS - {B9A255A0-2B92-4801-AF6C-354535A6E105}.Debug|ORBIS.Build.0 = Debug|ORBIS + {B9A255A0-2B92-4801-AF6C-354535A6E105}.Debug|ORBIS.ActiveCfg = Debug|Win32 {B9A255A0-2B92-4801-AF6C-354535A6E105}.Debug|Win32.ActiveCfg = Debug|Win32 {B9A255A0-2B92-4801-AF6C-354535A6E105}.Debug|Win32.Build.0 = Debug|Win32 {B9A255A0-2B92-4801-AF6C-354535A6E105}.Debug|x64.ActiveCfg = Debug|x64 {B9A255A0-2B92-4801-AF6C-354535A6E105}.Debug|x64.Build.0 = Debug|x64 - {B9A255A0-2B92-4801-AF6C-354535A6E105}.Debug|Xbox 360.ActiveCfg = Debug|Xbox 360 - {B9A255A0-2B92-4801-AF6C-354535A6E105}.Debug|Xbox 360.Build.0 = Debug|Xbox 360 - {B9A255A0-2B92-4801-AF6C-354535A6E105}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360 - {B9A255A0-2B92-4801-AF6C-354535A6E105}.Release|ORBIS.ActiveCfg = Release|ORBIS - {B9A255A0-2B92-4801-AF6C-354535A6E105}.Release|ORBIS.Build.0 = Release|ORBIS + {B9A255A0-2B92-4801-AF6C-354535A6E105}.Debug|Xbox 360.ActiveCfg = Debug|Win32 + {B9A255A0-2B92-4801-AF6C-354535A6E105}.Release|ORBIS.ActiveCfg = Release|Win32 {B9A255A0-2B92-4801-AF6C-354535A6E105}.Release|Win32.ActiveCfg = Release|Win32 {B9A255A0-2B92-4801-AF6C-354535A6E105}.Release|Win32.Build.0 = Release|Win32 {B9A255A0-2B92-4801-AF6C-354535A6E105}.Release|x64.ActiveCfg = Release|x64 {B9A255A0-2B92-4801-AF6C-354535A6E105}.Release|x64.Build.0 = Release|x64 - {B9A255A0-2B92-4801-AF6C-354535A6E105}.Release|Xbox 360.ActiveCfg = Release|Xbox 360 - {B9A255A0-2B92-4801-AF6C-354535A6E105}.Release|Xbox 360.Build.0 = Release|Xbox 360 - {B9A255A0-2B92-4801-AF6C-354535A6E105}.Release|Xbox 360.Deploy.0 = Release|Xbox 360 + {B9A255A0-2B92-4801-AF6C-354535A6E105}.Release|Xbox 360.ActiveCfg = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution + {928A359C-9C41-400A-8D2D-A054B33A79F5} = {5F1AAF03-7202-4C07-B99F-EB397105B1B7} + {9EA99B18-D352-47F6-BC04-A0B49CAA2772} = {5F1AAF03-7202-4C07-B99F-EB397105B1B7} + {0A1651FC-322B-4B04-82CB-28E9046D9383} = {5F1AAF03-7202-4C07-B99F-EB397105B1B7} + {E27FDF36-50C4-4ED2-8CF5-A20FED016910} = {5F1AAF03-7202-4C07-B99F-EB397105B1B7} + {B583BBFF-BE97-4F4E-BA1E-1F978A31EAB0} = {5F1AAF03-7202-4C07-B99F-EB397105B1B7} + {454DE15C-9063-4EB1-AD6C-77D7150F15DF} = {5F1AAF03-7202-4C07-B99F-EB397105B1B7} + {2F87CEAB-4818-443C-A5E3-6C34E7D967EC} = {1DFE1729-4F1B-47CA-9819-72431FE14E25} + {33704AA4-F2B5-4138-A40D-E3E77F89ED46} = {1DFE1729-4F1B-47CA-9819-72431FE14E25} + {8C77EAA8-1077-4EF7-AE53-97C6C60A3601} = {1DFE1729-4F1B-47CA-9819-72431FE14E25} + {50509BA3-D27B-4FAC-9772-9EC76146F709} = {1DFE1729-4F1B-47CA-9819-72431FE14E25} + {65114D40-9450-4B2D-B051-7A75E97C88E1} = {1DFE1729-4F1B-47CA-9819-72431FE14E25} + {08C6A854-533D-4A1E-924E-C4A62281869F} = {928A359C-9C41-400A-8D2D-A054B33A79F5} + {9C66B179-0737-4BDA-AB42-2ADE478A9008} = {08C6A854-533D-4A1E-924E-C4A62281869F} {EF1A4E80-63FA-4EB0-B834-12B6C500F31C} = {08C6A854-533D-4A1E-924E-C4A62281869F} {17F0F184-4436-4D08-B8AA-16572EA238DB} = {2F87CEAB-4818-443C-A5E3-6C34E7D967EC} - {9C66B179-0737-4BDA-AB42-2ADE478A9008} = {08C6A854-533D-4A1E-924E-C4A62281869F} - {08C6A854-533D-4A1E-924E-C4A62281869F} = {928A359C-9C41-400A-8D2D-A054B33A79F5} - {2F87CEAB-4818-443C-A5E3-6C34E7D967EC} = {1DFE1729-4F1B-47CA-9819-72431FE14E25} - {9E62F2FE-3408-4EAE-8238-FD84238CEEDA} = {1AFD580B-98B8-4689-B661-38C41132C60E} {83D3B207-C601-4025-8F41-01DEDC354661} = {1AFD580B-98B8-4689-B661-38C41132C60E} {D84021CA-B233-4E0F-8A52-071B83BBCCC4} = {1AFD580B-98B8-4689-B661-38C41132C60E} - {8F59A635-0240-4D7F-A80D-050C3F1670C2} = {E4DFEBF9-C310-462F-9876-7EB59C1E4D4E} + {E4DFEBF9-C310-462F-9876-7EB59C1E4D4E} = {1AFD580B-98B8-4689-B661-38C41132C60E} + {9E62F2FE-3408-4EAE-8238-FD84238CEEDA} = {1AFD580B-98B8-4689-B661-38C41132C60E} {962D4E25-45D3-4ACE-8C02-69FA3713ABD4} = {E4DFEBF9-C310-462F-9876-7EB59C1E4D4E} {1782F849-B6E1-466D-9F02-A751F3F8712C} = {E4DFEBF9-C310-462F-9876-7EB59C1E4D4E} {5A27FF18-A1EC-49BE-9455-415F1C701153} = {E4DFEBF9-C310-462F-9876-7EB59C1E4D4E} {D7F6C2CA-5A13-4FD0-8468-1833923E3EE3} = {E4DFEBF9-C310-462F-9876-7EB59C1E4D4E} - {B1E10086-A1DA-401A-834D-969C9DBB5CC1} = {B6297FF2-63D0-41EE-BE13-EFF720C9B0FA} + {8F59A635-0240-4D7F-A80D-050C3F1670C2} = {E4DFEBF9-C310-462F-9876-7EB59C1E4D4E} {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} = {65FD48E9-C936-4A23-AD46-BF738B6D4733} + {B6297FF2-63D0-41EE-BE13-EFF720C9B0FA} = {65FD48E9-C936-4A23-AD46-BF738B6D4733} {B92ABADC-45BE-4CC5-B724-9426053123A1} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} {7B083DA2-FE08-4F6D-BFDD-195D5C2783EB} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} {1C5B8702-290C-42DA-AA9E-671348F5B747} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} {6BF81B39-EDC2-4227-9992-C2D8ABEA95AF} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} - {33704AA4-F2B5-4138-A40D-E3E77F89ED46} = {1DFE1729-4F1B-47CA-9819-72431FE14E25} + {BCEE0132-8E24-49BE-AFEB-96DAD14396BA} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} + {B0A53D75-CBB4-4FDF-93AC-2D12A79ADA0E} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} + {834852DB-EDB6-4FD0-BCF9-45CD01126962} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} + {6BF81B39-EDC2-4227-9982-C2D8ABEA95AF} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} + {572E5B9C-7E19-489C-BD8A-E8401CFBBC47} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} + {E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} + {F59FA82C-DDB9-4EE2-80AE-CB0E4C6567A4} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} + {81C83B42-D00A-4FA3-9A3D-80F9D46524BF} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} {32F3F8CF-D22E-45E4-BEB8-AD909E8C5515} = {33704AA4-F2B5-4138-A40D-E3E77F89ED46} - {8C77EAA8-1077-4EF7-AE53-97C6C60A3601} = {1DFE1729-4F1B-47CA-9819-72431FE14E25} {EE203B88-44CF-4859-9D42-7A5F40FECB52} = {8C77EAA8-1077-4EF7-AE53-97C6C60A3601} {B357514A-7881-422D-8358-161B689E7620} = {3D341D8A-E400-4B1D-BC05-B5C35487D9B5} + {2195FB18-53BF-48AF-96B6-9BD242924EA5} = {3D341D8A-E400-4B1D-BC05-B5C35487D9B5} + {4C4BD478-3767-4C27-BD91-DAAFE7CD03A2} = {3D341D8A-E400-4B1D-BC05-B5C35487D9B5} {587FCCE9-1D8D-4398-B8B6-E8F4E9A92233} = {B357514A-7881-422D-8358-161B689E7620} - {9EA99B18-D352-47F6-BC04-A0B49CAA2772} = {5F1AAF03-7202-4C07-B99F-EB397105B1B7} {EE203B88-44CF-4859-9D42-7A5F43FECB52} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772} + {25493FC8-75AC-4703-AD58-AB0C4A0FB79C} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772} + {6BF81B39-EDC2-4127-9982-C2D8ABEA95AF} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772} + {EE203B88-44CF-4829-9D42-7A5F43FECB52} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772} + {7422B977-CA61-49BF-A586-F57B6FF9BD64} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772} + {DB344310-4938-4294-AEE2-18512454585D} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772} + {EE203B88-44CF-4859-9D42-7A5F45FEDB52} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772} + {EE203B88-44CF-4859-9D42-7A4F43FEDB52} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772} + {7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E} = {B6297FF2-63D0-41EE-BE13-EFF720C9B0FA} {EE203B88-44CF-4859-9D42-7A1F43FECB52} = {B6297FF2-63D0-41EE-BE13-EFF720C9B0FA} - {BCEE0132-8E24-49BE-AFEB-96DAD14396BA} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} - {0A1651FC-322B-4B04-82CB-28E9046D9383} = {5F1AAF03-7202-4C07-B99F-EB397105B1B7} + {B1E10086-A1DA-401A-834D-969C9DBB5CC1} = {B6297FF2-63D0-41EE-BE13-EFF720C9B0FA} {A69411B3-6DE8-404E-8E70-0D3375A7492A} = {0A1651FC-322B-4B04-82CB-28E9046D9383} - {928A359C-9C41-400A-8D2D-A054B33A79F5} = {5F1AAF03-7202-4C07-B99F-EB397105B1B7} - {E27FDF36-50C4-4ED2-8CF5-A20FED016910} = {5F1AAF03-7202-4C07-B99F-EB397105B1B7} - {C2E01551-B636-4324-8461-71811DF6FBB5} = {E27FDF36-50C4-4ED2-8CF5-A20FED016910} - {B0A53D75-CBB4-4FDF-93AC-2D12A79ADA0E} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} {5A77DCDD-2CBA-43E9-8B45-00C281443F77} = {0A1651FC-322B-4B04-82CB-28E9046D9383} - {834852DB-EDB6-4FD0-BCF9-45CD01126962} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} - {B583BBFF-BE97-4F4E-BA1E-1F978A31EAB0} = {5F1AAF03-7202-4C07-B99F-EB397105B1B7} + {C2E01551-B636-4324-8461-71811DF6FBB5} = {E27FDF36-50C4-4ED2-8CF5-A20FED016910} {FAF82AD2-D9F4-4694-9A01-103BC5B771B4} = {B583BBFF-BE97-4F4E-BA1E-1F978A31EAB0} - {7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E} = {B6297FF2-63D0-41EE-BE13-EFF720C9B0FA} - {25493FC8-75AC-4703-AD58-AB0C4A0FB79C} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772} - {6BF81B39-EDC2-4227-9982-C2D8ABEA95AF} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} - {6BF81B39-EDC2-4127-9982-C2D8ABEA95AF} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772} - {AA376B9B-484B-4DC4-982F-6CFA645E441E} = {F7D4A671-612F-4FF4-883F-2097697694B7} - {F7D4A671-612F-4FF4-883F-2097697694B7} = {E5C5E320-C077-4362-9A3F-3920C6447601} - {572E5B9C-7E19-489C-BD8A-E8401CFBBC47} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} - {E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} {52493826-AC00-470B-A745-4F602529B3B0} = {B583BBFF-BE97-4F4E-BA1E-1F978A31EAB0} {9F291982-8C81-4105-BF39-16844648E55F} = {B583BBFF-BE97-4F4E-BA1E-1F978A31EAB0} {950EDCC1-DF6A-4A75-B083-DFE98E7DD34F} = {B583BBFF-BE97-4F4E-BA1E-1F978A31EAB0} - {50509BA3-D27B-4FAC-9772-9EC76146F709} = {1DFE1729-4F1B-47CA-9819-72431FE14E25} + {F7D4A671-612F-4FF4-883F-2097697694B7} = {E5C5E320-C077-4362-9A3F-3920C6447601} + {AA376B9B-484B-4DC4-982F-6CFA645E441E} = {F7D4A671-612F-4FF4-883F-2097697694B7} {5D994A3B-83BF-4FCB-9AC1-E7B642B46FEA} = {50509BA3-D27B-4FAC-9772-9EC76146F709} - {454DE15C-9063-4EB1-AD6C-77D7150F15DF} = {5F1AAF03-7202-4C07-B99F-EB397105B1B7} {C3E2D690-F2B4-4A11-B317-D5CB8EF9561A} = {454DE15C-9063-4EB1-AD6C-77D7150F15DF} - {EE203B88-44CF-4829-9D42-7A5F43FECB52} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772} - {7422B977-CA61-49BF-A586-F57B6FF9BD64} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772} - {DB344310-4938-4294-AEE2-18512454585D} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772} - {2195FB18-53BF-48AF-96B6-9BD242924EA5} = {3D341D8A-E400-4B1D-BC05-B5C35487D9B5} {FFF58874-D460-41E6-AD65-DBFEC6E47A94} = {2195FB18-53BF-48AF-96B6-9BD242924EA5} - {E4DFEBF9-C310-462F-9876-7EB59C1E4D4E} = {1AFD580B-98B8-4689-B661-38C41132C60E} - {EE203B88-44CF-4859-9D42-7A5F45FEDB52} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772} - {F59FA82C-DDB9-4EE2-80AE-CB0E4C6567A4} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} - {4C4BD478-3767-4C27-BD91-DAAFE7CD03A2} = {3D341D8A-E400-4B1D-BC05-B5C35487D9B5} {73F1A804-1116-46C3-922A-9C0ADEB33F52} = {4C4BD478-3767-4C27-BD91-DAAFE7CD03A2} - {B6297FF2-63D0-41EE-BE13-EFF720C9B0FA} = {65FD48E9-C936-4A23-AD46-BF738B6D4733} - {EE203B88-44CF-4859-9D42-7A4F43FEDB52} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772} - {81C83B42-D00A-4FA3-9A3D-80F9D46524BF} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} - {65114D40-9450-4B2D-B051-7A75E97C88E1} = {1DFE1729-4F1B-47CA-9819-72431FE14E25} {B9A255A0-2B92-4801-AF6C-354535A6E105} = {65114D40-9450-4B2D-B051-7A75E97C88E1} EndGlobalSection EndGlobal diff --git a/src/ticker.cpp b/src/ticker.cpp index 03b81fee..ed8fa3c7 100644 --- a/src/ticker.cpp +++ b/src/ticker.cpp @@ -295,6 +295,8 @@ void TickerData::GameThreadTick() /* Garbage collect objects that can be destroyed. We can do this * before inserting awaiting objects, because only objects already * in the tick lists can be marked for destruction. */ + array destroy_list; + bool do_reserve = true; for (int g = 0; g < Entity::ALLGROUP_END; ++g) { for (ptrdiff_t i = data->m_list[g].Count(); i--;) @@ -303,18 +305,37 @@ void TickerData::GameThreadTick() if (e->m_destroy && g < Entity::GAMEGROUP_END) { - /* If entity is to be destroyed, remove it from the - * game tick list. */ + /* Game tick list: + * If entity is to be destroyed, remove it */ data->m_list[g].RemoveSwap(i); + if (do_reserve) + { + do_reserve = false; + destroy_list.reserve(data->nentities); //Should it be less ? + } + destroy_list.push_unique(e); } else if (e->m_destroy) { - /* If entity is to be destroyed, remove it from the - * draw tick list and destroy it. */ + /* Draw tick list: + * If entity is to be destroyed, + * remove it and store it. */ data->m_list[g].RemoveSwap(i); - delete e; - - data->nentities--; + ptrdiff_t removal_count = 0; + for (ptrdiff_t i = 0; i < Scene::GetCount(); i++) + { + //If entity is concerned by this scene, add it in the list + if (Scene::GetScene(i)->IsRelevant(e)) + removal_count++; + //Update scene index + data->m_scenes[e->m_drawgroup][i] -= removal_count; + } + if (do_reserve) + { + do_reserve = false; + destroy_list.reserve(data->nentities); //Should it be less ? + } + destroy_list.push_unique(e); } else { @@ -323,6 +344,12 @@ void TickerData::GameThreadTick() } } } + if (!!destroy_list.count()) + { + data->nentities -= destroy_list.count(); + for (Entity* e : destroy_list) + delete e; + } /* Insert waiting objects into the appropriate lists */ while (data->m_todolist.Count()) @@ -342,17 +369,17 @@ void TickerData::GameThreadTick() if (data->m_scenes[e->m_drawgroup].count() < Scene::GetCount()) data->m_scenes[e->m_drawgroup].resize(Scene::GetCount()); - ptrdiff_t add = 0; + ptrdiff_t added_count = 0; for (ptrdiff_t i = 0; i < Scene::GetCount(); i++) { //If entity is concerned by this scene, add it in the list if (Scene::GetScene(i)->IsRelevant(e)) { data->m_list[e->m_drawgroup].insert(e, data->m_scenes[e->m_drawgroup][i]); - add++; + added_count++; } //Update scene index - data->m_scenes[e->m_drawgroup][i] += add; + data->m_scenes[e->m_drawgroup][i] += added_count; } } @@ -443,6 +470,7 @@ void TickerData::DrawThreadTick() Scene::RenderTiles(); Scene::RenderLines(data->deltatime); } + //Scene::GetScene[scene_idx]->DisableDisplay(); //TODO Profiler::Stop(Profiler::STAT_TICK_DRAW); }