Должен ли я загрузить все свои голосовые и графические ресурсы до того, как я начну воспроизводить повествование в своем движке Visual Novel?
Я разрабатываю движок Visual Novel с использованием C ++ и SFML, и сейчас мы загружаем все ресурсы с диска по мере необходимости. Хотя он отлично работал в целях создания прототипов, я заметил, что при загрузке голосовых файлов наблюдаются лаги, предположительно из-за того, сколько времени занимает чтение с диска.
Это побудило меня написать класс ResourceManager, который поможет загружать ресурсы в отдельный поток и управлять всеми загруженными активами во всей программе.
Я мог бы разработать некоторый алгоритм, чтобы предсказать, какие активы понадобятся в ближайшее время. Тем не менее, поскольку это визуальный роман с различными вариантами и переходами в сценарии, эти прогнозы никогда не могут быть совершенными (я не знаю, какие активы автор сценария будет включать в сценарий заранее, поэтому единственный способ выяснить это разобрать скрипт вручную). Это означает, что я все еще могу столкнуться с некоторыми задержками, если решу не загружать все активы сразу.
Мой вопрос сейчас заключается в том, должен ли я использовать его для загрузки всех ресурсов голоса / изображения сразу перед входом в основное игровое состояние, или я должен разрешать случайное отставание, загружая ресурсы партиями во время игры? Разве первый способ не занял бы слишком много места в памяти?
/*ResourceManager.h*/
#define RESOURCE ResourceManager::m_rscManagerPtr
...
/*MainState.h*/
void init()
{
// add the resource and start loading them
RESOURCE->addFont("font.tff");
RESOURCE->addTexture("screen.png");
RESOURCE->addAudio("sound.wav");
...
// change to loading state
changeState(STATE_LOADING);
}
/*LoadingState.h*/
void init()
{
// Start loading all the assets added previously
RESOURCE->startLoading();
}
void update()
{
// wait till the other thread has done loading assets
if (!RESOURCE->doneLoading()) { // do something }
// done loading, return to previous state, which is MainState here
else changeState(STATE_PREVIOUS);
}
/*MainState.h*/
void update()
{
// get and use the loaded resources
sf::Font* font = RESOURCE->getFont("font.tff");
sf::Texture* texture = RESOURCE->getTexture("screen.png");
sf::Audio* audio = RESOURCE->getAudio("sound.wav");
...
}