我的引擎最近转换为使用SDL2运行输入和视频。但是,我很难让分辨率模式列表构建正常工作。我确实研究过SDL2的迁移指南,以及大量研究链接 - 我不知道如何去做,以后几次尝试失败。
因此,对于初学者,我有一个名为i_video.cc的文件,用于处理SDL2视频代码。 99%的引擎在OpenGL中运行,因此SDL仅用于初始化窗口并设置任何变量。
所以,这是在屏幕模式类中获取分辨率的旧方法。作为参考,屏幕模式类在r_modes.cc中定义。
话虽如此,这是基于SDL1的旧代码,它构建了屏幕模式列表,对于我的LIFE,我不能在SDL2下运行。此代码从i_video.cc中的第190行开始。作为参考,旧代码:
// -DS- 2005/06/27 Detect SDL Resolutions
const SDL_VideoInfo *info = SDL_GetVideoInfo();
SDL_Rect **modes = SDL_ListModes(info->vfmt,
SDL_OPENGL | SDL_DOUBLEBUF | SDL_FULLSCREEN);
if (modes && modes != (SDL_Rect **)-1)
{
for (; *modes; modes++)
{
scrmode_c test_mode;
test_mode.width = (*modes)->w;
test_mode.height = (*modes)->h;
test_mode.depth = info->vfmt->BitsPerPixel; // HMMMM ???
test_mode.full = true;
if ((test_mode.width & 15) != 0)
continue;
if (test_mode.depth == 15 || test_mode.depth == 16 ||
test_mode.depth == 24 || test_mode.depth == 32)
{
R_AddResolution(&test_mode);
}
}
}
// -ACB- 2000/03/16 Test for possible windowed resolutions
for (int full = 0; full <= 1; full++)
{
for (int depth = 16; depth <= 32; depth = depth + 16)
{
for (int i = 0; possible_modes[i].w != -1; i++)
{
scrmode_c mode;
mode.width = possible_modes[i].w;
mode.height = possible_modes[i].h;
mode.depth = depth;
mode.full = full;
int got_depth = SDL_VideoModeOK(mode.width, mode.height,
mode.depth, SDL_OPENGL | SDL_DOUBLEBUF |
(mode.full ? SDL_FULLSCREEN : 0));
if (R_DepthIsEquivalent(got_depth, mode.depth))
{
R_AddResolution(&mode);
}
}
}
}
它被注释掉了,您可以在其上方看到设置SDL_CreateWindow的SDL2代码。视频在游戏中很好,但是如果没有构建分辨率,我们无法在程序加载之前首先传递命令行参数,从而无法获得屏幕分辨率更改。我希望他们离开了某种兼容层,因为看起来SDL2在我总是在SDL1下处理它的方式上有一点学习曲线。
我知道ListModes和VideoInfo不再存在,我尝试用等效的SDL2函数替换它们,例如GetDisplayModes,但代码无法正常工作。我不确定我应该怎么做,或者如果r_modes.cc只需要完全重构,但我需要做的就是获取一个视频模式列表来填充我的scrmode_c类(在r_modes.cc中) 。
当我尝试用SDL2替换所有东西时,我从SDL_Rect *到SDL_Rect **得到了无效的转换,所以也许我只是这样做了。几个月来我一直在努力让它发挥作用,它只是不想。我不太关心设置每像素位数,因为现代机器现在可以默认为24,我们不需要任何理由将它设置为16或8(现在,每个人都有一张OpenGL卡可以去高于16位BPP);)
任何建议,帮助......此时的任何事情都将非常感激=)
谢谢! -Coraline
答案 0 :(得分:1)
使用SDL_GetNumDisplayModes和SDL_GetDisplayMode的组合,然后将它们推回到SDL_DisplayMode的向量中。
std::vector<SDL_DisplayMode> mResolutions;
int display_count = SDL_GetNumVideoDisplays();
SDL_Log("Number of displays: %i", display_count);
for (int display_index = 0; display_index <= display_count; display_index++)
{
SDL_Log("Display %i:", display_index);
int modes_count = SDL_GetNumDisplayModes(display_index);
for (int mode_index = 0; mode_index <= modes_count; mode_index++)
{
SDL_DisplayMode mode = { SDL_PIXELFORMAT_UNKNOWN, 0, 0, 0, 0 };
if (SDL_GetDisplayMode(display_index, mode_index, &mode) == 0)
{
SDL_Log(" %i bpp\t%i x %i @ %iHz",
SDL_BITSPERPIXEL(mode.format), mode.w, mode.h, mode.refresh_rate);
mResolutions.push_back(mode);
}
}
}