Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitdd95fed

Browse files
committed
RenderDevice: Use mutex for image loading threads
This allows us to start creating SDL_Textures while other SDL_Surfacesare being created. Extremely tiny speed increase, but what's moreimportant is that we're guarding the data access with a mutex now. I hadgotten a few freezes that I suspect were due to a race condition (Iunfortunately wasn't running the debugger).
1 parent027a3d6 commitdd95fed

File tree

4 files changed

+47
-9
lines changed

4 files changed

+47
-9
lines changed

‎src/RenderDevice.h‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,11 +178,15 @@ class QueuedImage {
178178
void* surface;
179179
int error_type;
180180
std::string filename;
181+
SDL_mutex* mutex;
182+
SDL_cond* loaded;
181183

182184
QueuedImage()
183185
: surface(NULL)
184186
, error_type(0)
185187
, filename()
188+
, mutex(NULL)
189+
, loaded(NULL)
186190
{}
187191
};
188192

‎src/SDLHardwareRenderDevice.cpp‎

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -738,7 +738,10 @@ unsigned short SDLHardwareRenderDevice::getRefreshRate() {
738738

739739
intSDLHardwareRenderDevice::loadQueuedImage(void* data) {
740740
QueuedImage* image =static_cast<QueuedImage*>(data);
741+
SDL_LockMutex(image->mutex);
741742
image->surface =IMG_Load(mods->locate(image->filename).c_str());
743+
SDL_CondSignal(image->loaded);
744+
SDL_UnlockMutex(image->mutex);
742745
return0;
743746
}
744747

@@ -747,17 +750,20 @@ void SDLHardwareRenderDevice::loadQueuedImages() {
747750

748751
for (size_t i =0; i < image_queue.size(); ++i) {
749752
std::string thread_name ="Image queue:" + image_queue[i].filename;
753+
image_queue[i].mutex =SDL_CreateMutex();
754+
image_queue[i].loaded =SDL_CreateCond();
750755
threads[i] =SDL_CreateThread(loadQueuedImage, thread_name.c_str(), &image_queue[i]);
751756
}
752757

753-
for (size_t i =0; i < threads.size(); ++i) {
754-
SDL_WaitThread(threads[i],NULL);
755-
}
756-
757758
for (size_t i =0; i < image_queue.size(); ++i) {
759+
SDL_LockMutex(image_queue[i].mutex);
758760
SDLHardwareImage *image =newSDLHardwareImage(this, renderer);
759761
if (!image)return;
760762

763+
if (!image_queue[i].surface) {
764+
SDL_CondWait(image_queue[i].loaded, image_queue[i].mutex);
765+
}
766+
761767
if (image_queue[i].surface) {
762768
image->surface =SDL_CreateTextureFromSurface(renderer,static_cast<SDL_Surface*>(image_queue[i].surface));
763769
SDL_FreeSurface(static_cast<SDL_Surface*>(image_queue[i].surface));
@@ -780,6 +786,17 @@ void SDLHardwareRenderDevice::loadQueuedImages() {
780786
cacheStore(image_queue[i].filename, image);
781787
image_queue_cleanup.push_back(static_cast<Image*>(image));
782788
}
789+
790+
SDL_UnlockMutex(image_queue[i].mutex);
791+
792+
SDL_DestroyMutex(image_queue[i].mutex);
793+
SDL_DestroyCond(image_queue[i].loaded);
794+
image_queue[i].mutex =NULL;
795+
image_queue[i].loaded =NULL;
796+
}
797+
798+
for (size_t i =0; i < threads.size(); ++i) {
799+
SDL_WaitThread(threads[i],NULL);
783800
}
784801

785802
image_queue.clear();

‎src/SDLSoftwareRenderDevice.cpp‎

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -718,7 +718,10 @@ unsigned short SDLSoftwareRenderDevice::getRefreshRate() {
718718

719719
intSDLSoftwareRenderDevice::loadQueuedImage(void* data) {
720720
QueuedImage* image =static_cast<QueuedImage*>(data);
721+
SDL_LockMutex(image->mutex);
721722
image->surface =IMG_Load(mods->locate(image->filename).c_str());
723+
SDL_CondSignal(image->loaded);
724+
SDL_UnlockMutex(image->mutex);
722725
return0;
723726
}
724727

@@ -727,17 +730,20 @@ void SDLSoftwareRenderDevice::loadQueuedImages() {
727730

728731
for (size_t i =0; i < image_queue.size(); ++i) {
729732
std::string thread_name ="Image queue:" + image_queue[i].filename;
733+
image_queue[i].mutex =SDL_CreateMutex();
734+
image_queue[i].loaded =SDL_CreateCond();
730735
threads[i] =SDL_CreateThread(loadQueuedImage, thread_name.c_str(), &image_queue[i]);
731736
}
732737

733-
for (size_t i =0; i < threads.size(); ++i) {
734-
SDL_WaitThread(threads[i],NULL);
735-
}
736-
737738
for (size_t i =0; i < image_queue.size(); ++i) {
739+
SDL_LockMutex(image_queue[i].mutex);
738740
SDLSoftwareImage *image =newSDLSoftwareImage(this);
739741
if (!image)return;
740742

743+
if (!image_queue[i].surface) {
744+
SDL_CondWait(image_queue[i].loaded, image_queue[i].mutex);
745+
}
746+
741747
if (image_queue[i].surface) {
742748
image->surface =static_cast<SDL_Surface*>(image_queue[i].surface);
743749
}
@@ -758,6 +764,17 @@ void SDLSoftwareRenderDevice::loadQueuedImages() {
758764
cacheStore(image_queue[i].filename, image);
759765
image_queue_cleanup.push_back(static_cast<Image*>(image));
760766
}
767+
768+
SDL_UnlockMutex(image_queue[i].mutex);
769+
770+
SDL_DestroyMutex(image_queue[i].mutex);
771+
SDL_DestroyCond(image_queue[i].loaded);
772+
image_queue[i].mutex =NULL;
773+
image_queue[i].loaded =NULL;
774+
}
775+
776+
for (size_t i =0; i < threads.size(); ++i) {
777+
SDL_WaitThread(threads[i],NULL);
761778
}
762779

763780
image_queue.clear();

‎src/Version.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ FLARE. If not, see http://www.gnu.org/licenses/
3030

3131
#include<SDL.h>
3232

33-
VersionVersionInfo::ENGINE(1,14,182);
33+
VersionVersionInfo::ENGINE(1,14,183);
3434
VersionVersionInfo::MIN(0,0,0);
3535
VersionVersionInfo::MAX(USHRT_MAX, USHRT_MAX, USHRT_MAX);
3636

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp