file_access_enhanced.txt
来自「quake1 dos源代码最新版本」· 文本 代码 · 共 120 行
TXT
120 行
================================================================
Title : Tutorial: Enhancing FrikaC's QuakeC file access tutorial
(and the included QuakeC string manipulation functions)
Date : 2001-11-01
Filename : FILE_ACCESS_ENHANCED.TXT
Author : Matthias "Maddes" Buecher
Ryan "FrikaC" Smith
Email Address : maddes@go.to
kryten@adelphia.net
Homepage : Quake Info Pool
http://www.quake-info-pool.net/
FrikBot
http://www.inside3d.com/frikbot/
Quake Standards Group (short QSG)
http://www.quakesrc.org/
Complexity : Low
================================================================
This will combine FrikaC's file access tutorial with its string functions and my
enhanced zone handling tutorial. If you haven't implemented those tutorials in your
engine yet, then do it now.
FrikaC's functions will be modified to use a separate zone for the created
strings. There will also be a cvar "pr_zone_min_strings" to define the size in
KB of this zone, which can be set through the QuakeC code in worldspawn(). The
zone will be allocated when it is accessed the first time.
First we define a new zone just for QuakeC created strings at the top of PR_CMDS.C...
memzone_t *zone_progstrings; // 2001-09-20 QuakeC string zone by Maddes
The memory for the zone is allocated in a separate function which must be placed
before FrikaC's string and file access functions...
// 2001-09-20 QuakeC string zone by Maddes start
/*
=================
PF_allocate_zone_progstrings
=================
*/
void PF_allocate_zone_progstrings (void)
{
int zonesize_progstrings;
if (pr_zone_min_strings.value < 64) // rangecheck/minimum
{
Cvar_Set("pr_zone_min_strings", "64");
}
if (pr_zone_min_strings.value > 8192) // rangecheck/maximum (8MB)
{
Cvar_Set("pr_zone_min_strings", "8192");
}
zonesize_progstrings = pr_zone_min_strings->value * 1024;
zone_progstrings = Hunk_AllocName (zonesize_progstrings, "qcstrings"); // note only 8 chars copied
Z_ClearZone (zone_progstrings, zonesize_progstrings);
}
// 2001-09-20 QuakeC string zone by Maddes end
The new function must be called whenever a new string is created and the zone
isn't allocated. So place the following code at top of PF_strzone, PF_strunzone
and the start of the append case in PF_fopen...
// 2001-09-20 QuakeC string zone by Maddes start
if (!zone_progstrings)
{
PF_allocate_zone_progstrings();
}
// 2001-09-20 QuakeC string zone by Maddes end
Now you can change all Z_Malloc and Z_Free calls in these three routines to use
the new zone.
Another important thing is to initialize the zone pointer before the PROGS.DAT
is processed in SV_SpawnServer() of SV_MAIN.C, so before(!)...
ED_LoadFromFile (sv.worldmodel->entities);
... place ...
zone_progstrings = NULL; // 2001-09-20 QuakeC string zone by Maddes
The cvar "pr_zone_min_strings" will be defined in PR_EDICT.C by placing the
following definition at top of it...
cvar_t pr_zone_min_strings = {"pr_zone_min_strings", "0", false, false}; // 2001-09-20 QuakeC string zone by Maddes
... and registering it in PR_Init with ...
Cvar_RegisterVariable (&pr_zone_min_strings); // 2001-09-20 QuakeC string zone by Maddes
As the cvar and the zone pointer are used in several files, they must be
declared in PROGS.H...
// 2001-09-20 QuakeC string zone by Maddes start
extern cvar_t pr_zone_min_strings;
extern memzone_t *zone_progstrings;
// 2001-09-20 QuakeC string zone by Maddes end
Engine done.
QuakeC coders can now easily define how much mem they need for strings.
Here's an example code:
void() worldspawn =
{
local float strzone;
strzone = cvar("pr_zone_min_strings");
if (strzone < 128) // check minimum, if user wants more then let him get it
{
cvar_set("pr_zone_min_strings", "128");
}
...
};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?