threads 2
This commit is contained in:
parent
314c647daf
commit
6a16d416a4
1 changed files with 33 additions and 30 deletions
|
@ -123,6 +123,24 @@ namespace
|
||||||
RiffFinishWriteFile();
|
RiffFinishWriteFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct Data
|
||||||
|
{
|
||||||
|
Emulator * emulator;
|
||||||
|
SDL_mutex * mutex;
|
||||||
|
bool quit;
|
||||||
|
};
|
||||||
|
|
||||||
|
Uint32 my_callbackfunc(Uint32 interval, void *param)
|
||||||
|
{
|
||||||
|
Data * data = static_cast<Data *>(param);
|
||||||
|
SDL_LockMutex(data->mutex);
|
||||||
|
SDirectSound::writeAudio();
|
||||||
|
data->emulator->processEvents(data->quit);
|
||||||
|
data->emulator->executeOneFrame();
|
||||||
|
SDL_UnlockMutex(data->mutex);
|
||||||
|
return interval;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int MessageBox(HWND, const char * text, const char * caption, UINT type)
|
int MessageBox(HWND, const char * text, const char * caption, UINT type)
|
||||||
|
@ -211,42 +229,26 @@ void run_sdl(int argc, const char * argv [])
|
||||||
|
|
||||||
Emulator emulator(win, ren, tex);
|
Emulator emulator(win, ren, tex);
|
||||||
|
|
||||||
int tot1 = 0;
|
std::shared_ptr<SDL_mutex> mutex(SDL_CreateMutex(), SDL_DestroyMutex);
|
||||||
int tot2 = 0;
|
|
||||||
int tot3 = 0;
|
|
||||||
int tot4 = 0;
|
|
||||||
|
|
||||||
const auto start = std::chrono::steady_clock::now();
|
Data data;
|
||||||
auto t0 = start;
|
data.quit = false;
|
||||||
|
data.mutex = mutex.get();
|
||||||
|
data.emulator = &emulator;
|
||||||
|
|
||||||
|
SDL_TimerID timer = SDL_AddTimer(1000 / 60, my_callbackfunc, &data);
|
||||||
|
|
||||||
bool quit = false;
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
SDirectSound::writeAudio();
|
SDL_LockMutex(data.mutex);
|
||||||
emulator.processEvents(quit);
|
|
||||||
const auto t1 = std::chrono::steady_clock::now();
|
|
||||||
tot1 += std::chrono::duration_cast<std::chrono::microseconds>(t1 - t0).count();
|
|
||||||
emulator.executeOneFrame();
|
|
||||||
const auto t2 = std::chrono::steady_clock::now();
|
|
||||||
tot2 += std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count();
|
|
||||||
const SDL_Rect rect = emulator.updateTexture();
|
const SDL_Rect rect = emulator.updateTexture();
|
||||||
const auto t3 = std::chrono::steady_clock::now();
|
SDL_UnlockMutex(data.mutex);
|
||||||
tot3 += std::chrono::duration_cast<std::chrono::microseconds>(t3 - t2).count();
|
|
||||||
emulator.refreshVideo(rect);
|
emulator.refreshVideo(rect);
|
||||||
const auto t4 = std::chrono::steady_clock::now();
|
} while (!data.quit);
|
||||||
tot4 += std::chrono::duration_cast<std::chrono::microseconds>(t4 - t3).count();
|
|
||||||
t0 = t4;
|
|
||||||
} while (!quit);
|
|
||||||
|
|
||||||
const auto end = std::chrono::steady_clock::now();
|
SDL_RemoveTimer(timer);
|
||||||
const int tot = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
|
SDL_LockMutex(data.mutex);
|
||||||
|
SDL_UnlockMutex(data.mutex);
|
||||||
std::cerr << "Total: " << tot << std::endl;
|
|
||||||
std::cerr << "1: " << tot1 << std::endl;
|
|
||||||
std::cerr << "2: " << tot2 << std::endl;
|
|
||||||
std::cerr << "3: " << tot3 << std::endl;
|
|
||||||
std::cerr << "4: " << tot4 << std::endl;
|
|
||||||
std::cerr << "T: " << tot1 + tot2 + tot3 + tot4 << std::endl;
|
|
||||||
|
|
||||||
SDirectSound::stop();
|
SDirectSound::stop();
|
||||||
stopEmulator();
|
stopEmulator();
|
||||||
|
@ -256,7 +258,8 @@ void run_sdl(int argc, const char * argv [])
|
||||||
int main(int argc, const char * argv [])
|
int main(int argc, const char * argv [])
|
||||||
{
|
{
|
||||||
//First we need to start up SDL, and make sure it went ok
|
//First we need to start up SDL, and make sure it went ok
|
||||||
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMECONTROLLER | SDL_INIT_AUDIO) != 0)
|
const Uint32 flags = SDL_INIT_VIDEO | SDL_INIT_GAMECONTROLLER | SDL_INIT_AUDIO | SDL_INIT_TIMER;
|
||||||
|
if (SDL_Init(flags) != 0)
|
||||||
{
|
{
|
||||||
std::cerr << "SDL_Init Error: " << SDL_GetError() << std::endl;
|
std::cerr << "SDL_Init Error: " << SDL_GetError() << std::endl;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
Loading…
Add table
Reference in a new issue