在我开始在Visual Novel引擎中播放叙述之前,我应该加载所有语音和图像资源吗?
我正在使用C ++和SFML开发一个Visual Novel引擎,现在我们正在根据需要从磁盘加载所有资产。虽然它可以很好地用于原型设计,但我注意到加载语音文件时存在滞后,大概是因为从磁盘读取需要多长时间。
这促使我编写了一个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");
...
}
如果你的游戏很小,一开始加载一切都不会太糟糕,但随着它变得越来越大,你的初始加载时间会变长,并且保持ram中的所有内容也会导致你的ram使用率上升。
您提到您的资源管理器将文件加载到另一个线程上,因此您可以加载接下来的3-4行音频或图片,然后当用户收听您加载下一行的行时,当您加载分支时每个分支的前几个然后丢弃用户不选择的那个。
由于它不在同一个线程上运行,因此不应该妨碍你的游戏。