11#include " Renderer.h"
2+ #include " IDrawable.h"
23
34#include < cassert>
45namespace sh ::render
@@ -31,24 +32,25 @@ namespace sh::render
3132 {
3233 if (drawable == nullptr )
3334 return ;
34- if (drawList.empty ()) // 카메라가 없다.
35+ if (drawList[ GAME_THREAD ] .empty ()) // 카메라가 없다.
3536 return ;
3637 if (cam >= camHandles.size ())
3738 return ;
3839 if (camHandles[cam] == nullptr )
3940 return ;
4041
41- if (auto it = drawList.find (*camHandles[cam]); it != drawList.end ())
42+ auto & map = drawList[GAME_THREAD ];
43+ if (auto it = map.find (*camHandles[cam]); it != map.end ())
4244 {
43- it->second .push (drawable);
45+ it->second .push_back (drawable);
4446 }
4547 }
4648
4749 void Renderer::ClearDrawList ()
4850 {
4951 emptyHandle = std::queue<CameraHandle>{};
5052 camHandles.clear ();
51- drawList.clear ();
53+ drawList[ GAME_THREAD ] .clear ();
5254 AddCamera (0 );
5355 }
5456
@@ -76,8 +78,13 @@ namespace sh::render
7678 {
7779 id = nextCameraId++;
7880 Camera cam{ id, depth };
79- auto result = drawList.insert ({cam , std::queue<IDrawable*>{} });
80- if (drawList.size () == 1 )
81+ auto result = drawList[GAME_THREAD ].insert ({ cam , std::vector<IDrawable*>{} });
82+
83+ drawListMutex.lock ();
84+ drawList[RENDER_THREAD ].insert ({ cam, std::vector<IDrawable*>{} });
85+ drawListMutex.unlock ();
86+
87+ if (drawList[GAME_THREAD ].size () == 1 )
8188 mainCamera = id;
8289
8390 camHandles.push_back (&result.first ->first );
@@ -87,8 +94,13 @@ namespace sh::render
8794 id = emptyHandle.front ();
8895 emptyHandle.pop ();
8996 Camera cam{ id, depth };
90- auto result = drawList.insert ({ cam , std::queue<IDrawable*>{} });
91- if (drawList.size () == 1 )
97+ auto result = drawList[GAME_THREAD ].insert ({ cam , std::vector<IDrawable*>{} });
98+
99+ drawListMutex.lock ();
100+ drawList[RENDER_THREAD ].insert ({ cam , std::vector<IDrawable*>{} });
101+ drawListMutex.unlock ();
102+
103+ if (drawList[GAME_THREAD ].size () == 1 )
92104 mainCamera = id;
93105
94106 camHandles[id] = &result.first ->first ;
@@ -105,18 +117,22 @@ namespace sh::render
105117
106118 const Camera* camera = camHandles[cam];
107119
108- auto it = drawList.find (*camera);
109- if (it == drawList.end ())
120+ auto it = drawList[ GAME_THREAD ] .find (*camera);
121+ if (it == drawList[ GAME_THREAD ] .end ())
110122 return ;
111123
112124 emptyHandle.push (it->first .id );
113- drawList.erase (it);
125+ drawList[GAME_THREAD ].erase (it);
126+
127+ drawListMutex.lock ();
128+ drawList[RENDER_THREAD ].erase (*camera);
129+ drawListMutex.unlock ();
114130
115131 if (mainCamera == cam)
116132 {
117- if (drawList.empty ())
133+ if (drawList[ GAME_THREAD ] .empty ())
118134 return ;
119- mainCamera = drawList.begin ()->first .id ;
135+ mainCamera = drawList[ GAME_THREAD ] .begin ()->first .id ;
120136 }
121137 }
122138
@@ -132,16 +148,38 @@ namespace sh::render
132148 if (camHandles[cam] == nullptr )
133149 return ;
134150
135- auto it = drawList.find (*camHandles[cam]);
136- if (it == drawList.end ())
151+ auto it = drawList[ GAME_THREAD ] .find (*camHandles[cam]);
152+ if (it == drawList[ GAME_THREAD ] .end ())
137153 return ;
138154
139- auto queue = std::move ( it->second ) ;
155+ auto & vec = it->second ;
140156
141157 Camera tempCam{ it->first .id , depth };
142158
143- drawList.erase (it);
144- auto result = drawList.insert ({ tempCam, std::move (queue) });
159+ drawList[GAME_THREAD ].erase (it);
160+ auto result = drawList[GAME_THREAD ].insert ({ tempCam, std::move (vec) });
161+
162+ drawListMutex.lock ();
163+ drawList[RENDER_THREAD ].erase (*camHandles[cam]);
164+ drawList[RENDER_THREAD ].insert ({ tempCam, std::vector<IDrawable*>{} });
165+ drawListMutex.unlock ();
166+
145167 camHandles[cam] = &result.first ->first ;
146168 }
169+
170+ void Renderer::SyncGameThread ()
171+ {
172+ std::swap (drawList[GAME_THREAD ], drawList[RENDER_THREAD ]);
173+ for (auto & pair : drawList[GAME_THREAD ])
174+ {
175+ pair.second .clear ();
176+ }
177+ for (auto & pair : drawList[RENDER_THREAD ])
178+ {
179+ for (auto drawable : pair.second )
180+ {
181+ drawable->SyncGameThread ();
182+ }
183+ }
184+ }
147185}
0 commit comments