Разработка Visual Novel. Должен ли я загружать все ресурсы голоса и изображения одновременно? - PullRequest
0 голосов
/ 23 марта 2019

Должен ли я загрузить все свои голосовые и графические ресурсы до того, как я начну воспроизводить повествование в своем движке 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");
      ...
    }

1 Ответ

0 голосов
/ 23 марта 2019

Хотя загрузка всего в начале не будет слишком плохой, если ваша игра маленькая, но по мере того, как она будет увеличиваться, начальное время загрузки будет увеличиваться, а хранение всего в оперативной памяти приведет к увеличению использования памяти.

Вы упоминаете, что ваш менеджер ресурсов загружает файлы в другой поток, так что вы можете загружать следующие 3-4 строки аудио или изображений, когда пользователь слушает строку, которую вы загружаете, следующую, когда дело доходит до ветви, которые вы загружаете в первые несколько веток, а затем отбрасываете ту, которую пользователь не выбирает.

Поскольку он не работает в одном потоке, он не должен влиять на вашу игру.

...