La función PF acepta una ruta de archivo como su parámetro. El bucle táctil hace que el archivo (o al menos 4 kb porciones de él) se cargue en la memoria física.
¿Cómo createfilemaping en c ++?
-
29-07-2022 - |
Pregunta
Estoy codificando una precarga del juego (un programa simple que carga ciertos archivos [mapas] en caché antes de comenzar el programa. Me dijeron que usara CreateFilapaping que todavía no estoy seguro de si lo carga en la memoria física o virtual ...
De todos modos, ¿dónde pondría qué archivos necesito cargar?
Aquí está mi código (realmente codificado por alguien más en Stack Overflow que me dijo que lo usara)
#include <windows.h>
#include <cstdio>
void pf(const char* name) {
HANDLE file = CreateFile(name, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if(file == INVALID_HANDLE_VALUE) { printf("couldn't open %s\n", name); return; };
unsigned int len = GetFileSize(file, 0);
HANDLE mapping = CreateFileMapping(file, 0, PAGE_READONLY, 0, 0, 0);
if(mapping == 0) { printf("couldn't map %s\n", name); return; }
const char* data = (const char*) MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, 0);
if(data)
{
printf("prefetching %s... ", name);
// need volatile or need to use result - compiler will otherwise optimize out whole loop
volatile unsigned int touch = 0;
for(unsigned int i = 0; i < len; i += 4096)
touch += data[i];
}
else
printf("couldn't create view of %s\n", name);
UnmapViewOfFile(data);
CloseHandle(mapping);
CloseHandle(file);
}
int main(int argc, const char** argv)
{
if(argc >= 2) for(int i = 1; argv[i]; ++i) pf(argv[i]);
return 0;
}
Solución
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow