Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用C/C++;SDL2呢?_C++_C_Sdl 2 - Fatal编程技术网

C++ 如何使用C/C++;SDL2呢?

C++ 如何使用C/C++;SDL2呢?,c++,c,sdl-2,C++,C,Sdl 2,根据我学到的“最佳实践”,我们应该将程序所需的资源加载到RAM中,避免对用户硬盘驱动器的不必要请求。使用SDL2,我总是在将图像文件加载到RAM后释放它们。(文件->曲面->纹理->自由文件/曲面)。因此,如果我的其他应用程序更改了该文件,我的程序将忽略它,因为该文件不再被它使用 现在在第16课中,我正在学习使用附加组件SDL\u ttf 然而,使用SDL\u ttfaddon,我无法找到一种方法来释放font.ttf文件,并将其加载到RAM中。我只能通过指针才能看到它。在我看来,每次渲染文本时

根据我学到的“最佳实践”,我们应该将程序所需的资源加载到RAM中,避免对用户硬盘驱动器的不必要请求。使用SDL2,我总是在将图像文件加载到RAM后释放它们。(文件->曲面->纹理->自由文件/曲面)。因此,如果我的其他应用程序更改了该文件,我的程序将忽略它,因为该文件不再被它使用

现在在第16课中,我正在学习使用附加组件
SDL\u ttf

然而,使用
SDL\u ttf
addon,我无法找到一种方法来释放
font.ttf
文件,并将其加载到RAM中。我只能通过指针才能看到它。在我看来,每次渲染文本时,文件都会不断被读取

如何将其加载到RAM中,以便渲染调用RAM位置,而不是HD中的文件?

完整代码 失败原因: 我误解了文件的工作原理。该结构仅保存有关文件的信息,而不保存媒体本身的信息。 这种方法是无用的,在释放指针后会使程序崩溃(渲染尝试取消对
nullptr
的引用)

故障2: 使用内置函数释放资源

ptr_Font = TTF_OpenFontIndexRW(SDL_RWFromFile("FreeMono.ttf", "r"), 1, 72, 0);
失败原因: 我不明白为什么,因为第二个参数(非零)指定它应该在使用后释放资源。它也发生在上面完整的源代码中,我只是将函数分成两行

故障3: 创建结构以保存有关指针的信息

ptr_str_rwops = SDL_RWFromFile("FreeMono.ttf", "r");
str_rwops = *ptr_str_rwops;
SDL_RWclose(ptr_str_rwops); // crashes  the program
ptr_str_rwops = nullptr;
ptr_str_rwops = &str_rwops; // useless: file still in use.
失败原因: 结构RWops似乎不保存文件,只保存有关它的信息。因此,它是故障1和2的总和

故障4: 试图将文件作为对象加载

ptr_LoadObject = (TTF_Font*)SDL_LoadObject("FreeMono.ttf");
ptr_str_rwops = SDL_RWFromFile((const char *)ptr_LoadObject, "r");
失败原因: 此功能可用于共享操作系统文件。函数的错误使用


更新2019-04-05

失败5 试图使用memcpy将文件直接复制到RAM中

long int func_discover_file_size(char* file){

    long int var_file_size = 0;
    FILE * ptr_file = nullptr;

    ptr_file = fopen(file, "rb");
    fseek(ptr_file , 0L , SEEK_END);
    var_file_size = ftell(ptr_file);
    fclose(ptr_file);
    return var_file_size;

/*END func_discover_file_size*/}

int main (void) {

    /*cut unrelated code*/

    void * ptr_load_file = nullptr;
    void * ptr_File_copy = nullptr;
    long int var_file_size = 0;

    /*cut unrelated code*/

    var_file_size = func_discover_file_size("FreeMono.ttf");
    // works fine and returns correct size of file.

    ptr_File_copy = (char*) calloc (1, var_file_size);
    // memory allocation works fine (tested)

    ptr_load_file = fopen("FreeMono.ttf", "rb");
    // file loaded correctly. Test with FOR LOOP shows content of file in console.

    memcpy(ptr_File_copy, ptr_load_file, var_file_size);
    // program crashes in line above
失败原因: 看起来我不知道如何正确使用memcpy。我尝试了许多对函数和指针的强制转换(void,char),尝试将指针类型更改为char,void,FILE,尝试输出到第三个指针

现在我正在寻找一个好的灵魂来照亮我的道路-p

注意:C被标记是因为SDL

而freetype(SDL_ttf使用)不会多次读取字体(它不能读取,因为它的API不提供
seek
功能),SDL_ttf在字体关闭之前不会关闭文件/RWops。您可以通过手动将文件加载到内存缓冲区并将该内存用作RWOP将数据馈送到SDL_ttf来实现您所描述的,例如(无错误检查、无空闲等-这只是一个示例):


关于memcpy的第二个问题可以通过以下方式解决:

memcpy
复制文件对象,而不是其内容。为了从中阅读:

使用
fread
功能读取
文件*
fread(ptr\u文件副本,1,
var\u file\u size,ptr\u load\u file)
而不是memcpy


我今天尝试过这种方法,但失败了。我将用此尝试更新我的问题。我试过使用memcpy,但看起来我不知道如何正确使用该功能。对于将来的问题,如果您的问题尚未解决,请不要接受答案。至于memcpy——这不是它,您复制的是文件对象(内部libc结构,通常我们甚至不知道它的大小),而不是文件内容。使用
fread
函数读取
文件*
fread(ptr\u文件副本,1,var\u文件大小,ptr\u加载文件)
而不是memcpy。但是问题已经解决了。。。我使用了上面的方法,在我发现如何释放内存后,程序运行得非常好。memcpy的使用将是另一个问题,与SDL_ttf或SDL2本身无关。现在我不知道我是否应该提出这个问题,因为你已经回答了我。(非常感谢,顺便说一句,你帮我省了一天的时间——从零开始自学有时很困难……特别是因为英语不是我的母语)。
ptr_LoadObject = (TTF_Font*)SDL_LoadObject("FreeMono.ttf");
ptr_str_rwops = SDL_RWFromFile((const char *)ptr_LoadObject, "r");
long int func_discover_file_size(char* file){

    long int var_file_size = 0;
    FILE * ptr_file = nullptr;

    ptr_file = fopen(file, "rb");
    fseek(ptr_file , 0L , SEEK_END);
    var_file_size = ftell(ptr_file);
    fclose(ptr_file);
    return var_file_size;

/*END func_discover_file_size*/}

int main (void) {

    /*cut unrelated code*/

    void * ptr_load_file = nullptr;
    void * ptr_File_copy = nullptr;
    long int var_file_size = 0;

    /*cut unrelated code*/

    var_file_size = func_discover_file_size("FreeMono.ttf");
    // works fine and returns correct size of file.

    ptr_File_copy = (char*) calloc (1, var_file_size);
    // memory allocation works fine (tested)

    ptr_load_file = fopen("FreeMono.ttf", "rb");
    // file loaded correctly. Test with FOR LOOP shows content of file in console.

    memcpy(ptr_File_copy, ptr_load_file, var_file_size);
    // program crashes in line above
    /* 'slurp' file (read entire file into memory buffer)
     * there are multiple ways to do so
     */
    SDL_RWops *file_rw = SDL_RWFromFile("font.ttf", "rb");
    Sint64 file_sz = file_rw->size(file_rw);
    void *membuf = malloc(file_sz);
    file_rw->read(file_rw, membuf, 1, file_sz);
    file_rw->close(file_rw);

    /* use memory buffer as RWops */
    SDL_RWops *mem_rw = SDL_RWFromConstMem(membuf, file_sz);
    TTF_Font *font = TTF_OpenFontRW(mem_rw, 1, font_size);

    /* free(membuf) when you're done with the font */