BsCoreObjectManager.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. #include "BsCoreObjectManager.h"
  2. #include "BsCoreObject.h"
  3. #include "BsCoreObjectCore.h"
  4. #include "BsException.h"
  5. #include "BsMath.h"
  6. #include "BsFrameAlloc.h"
  7. namespace BansheeEngine
  8. {
  9. CoreObjectManager::CoreObjectManager()
  10. :mNextAvailableID(1)
  11. {
  12. }
  13. CoreObjectManager::~CoreObjectManager()
  14. {
  15. #if BS_DEBUG_MODE
  16. BS_LOCK_MUTEX(mObjectsMutex);
  17. if(mObjects.size() > 0)
  18. {
  19. // All objects MUST be destroyed at this point, otherwise there might be memory corruption.
  20. // (Reason: This is called on application shutdown and at that point we also unload any dynamic libraries,
  21. // which will invalidate any pointers to objects created from those libraries. Therefore we require of the user to
  22. // clean up all objects manually before shutting down the application).
  23. BS_EXCEPT(InternalErrorException, "Core object manager shut down, but not all objects were released. Application must release ALL " \
  24. "engine objects before shutdown.");
  25. }
  26. #endif
  27. }
  28. UINT64 CoreObjectManager::registerObject(CoreObject* object)
  29. {
  30. assert(object != nullptr);
  31. BS_LOCK_MUTEX(mObjectsMutex);
  32. mObjects[mNextAvailableID] = object;
  33. return mNextAvailableID++;
  34. }
  35. void CoreObjectManager::unregisterObject(CoreObject* object)
  36. {
  37. assert(object != nullptr);
  38. BS_LOCK_MUTEX(mObjectsMutex);
  39. UINT64 internalId = object->getInternalID();
  40. mObjects.erase(internalId);
  41. {
  42. for (auto& syncData : mSimSyncData)
  43. {
  44. auto iterFind = syncData.entries.find(internalId);
  45. if (iterFind != syncData.entries.end())
  46. {
  47. UINT8* data = iterFind->second.syncData.getBuffer();
  48. if (data != nullptr && syncData.alloc != nullptr)
  49. syncData.alloc->dealloc(data);
  50. syncData.entries.erase(iterFind);
  51. }
  52. }
  53. }
  54. {
  55. for (auto& syncData : mCoreSyncData)
  56. {
  57. auto iterFind = syncData.entries.find(internalId);
  58. if (iterFind != syncData.entries.end())
  59. {
  60. UINT8* data = iterFind->second.syncData.getBuffer();
  61. if (data != nullptr && syncData.alloc != nullptr)
  62. syncData.alloc->dealloc(data);
  63. syncData.entries.erase(iterFind);
  64. }
  65. }
  66. }
  67. }
  68. void CoreObjectManager::syncDownload(CoreObjectSync type, FrameAlloc* allocator)
  69. {
  70. BS_LOCK_MUTEX(mObjectsMutex);
  71. if (type == CoreObjectSync::Sim)
  72. {
  73. mCoreSyncData.push_back(CoreStoredSyncData());
  74. CoreStoredSyncData& syncData = mCoreSyncData.back();
  75. syncData.alloc = allocator;
  76. for (auto& objectData : mObjects)
  77. {
  78. CoreObject* object = objectData.second;
  79. SPtr<CoreObjectCore> objectCore = object->getCore();
  80. if (objectCore != nullptr && object->isCoreDirty())
  81. {
  82. CoreSyncData objSyncData = object->syncToCore(allocator);
  83. object->markCoreClean();
  84. syncData.entries[object->getInternalID()] = CoreStoredSyncObjData(objectCore.get(), objSyncData);
  85. }
  86. }
  87. }
  88. else
  89. {
  90. mSimSyncData.push_back(SimStoredSyncData());
  91. SimStoredSyncData& syncData = mSimSyncData.back();
  92. syncData.alloc = allocator;
  93. for (auto& objectData : mObjects)
  94. {
  95. CoreObject* object = objectData.second;
  96. SPtr<CoreObjectCore> objectCore = object->getCore();
  97. if (objectCore != nullptr && objectCore->isCoreDirty())
  98. {
  99. CoreSyncData objSyncData = objectCore->syncFromCore(allocator);
  100. objectCore->markCoreClean();
  101. syncData.entries[object->getInternalID()] = SimStoredSyncObjData(object, objSyncData);
  102. }
  103. }
  104. }
  105. }
  106. void CoreObjectManager::syncUpload(CoreObjectSync type)
  107. {
  108. BS_LOCK_MUTEX(mObjectsMutex);
  109. if (type == CoreObjectSync::Sim)
  110. {
  111. if (mCoreSyncData.size() == 0)
  112. return;
  113. CoreStoredSyncData& syncData = mCoreSyncData.front();
  114. for (auto& objectData : syncData.entries)
  115. {
  116. const CoreStoredSyncObjData& objSyncData = objectData.second;
  117. objSyncData.destinationObj->syncToCore(objSyncData.syncData);
  118. UINT8* data = objSyncData.syncData.getBuffer();
  119. if (data != nullptr)
  120. syncData.alloc->dealloc(data);
  121. }
  122. syncData.entries.clear();
  123. mCoreSyncData.pop_front();
  124. }
  125. else
  126. {
  127. if (mSimSyncData.size() == 0)
  128. return;
  129. SimStoredSyncData& syncData = mSimSyncData.front();
  130. for (auto& objectData : syncData.entries)
  131. {
  132. const SimStoredSyncObjData& objSyncData = objectData.second;
  133. objSyncData.destinationObj->syncFromCore(objSyncData.syncData);
  134. UINT8* data = objSyncData.syncData.getBuffer();
  135. if (data != nullptr)
  136. syncData.alloc->dealloc(data);
  137. }
  138. syncData.entries.clear();
  139. mSimSyncData.pop_front();
  140. }
  141. }
  142. }