Use one autorelease pool per frame

This way, nowhere else autorelease pools need to be managed.

FossilOrigin-Name: 489124a92fd2a7e6d543b58ce50e454f2cb1647c81b4ba637d6c252404012ddd
This commit is contained in:
Jonathan Schleifer 2025-03-16 10:11:39 +00:00
parent a67b134eb2
commit 875c395ce1
22 changed files with 1262 additions and 1443 deletions

View file

@ -107,21 +107,19 @@ static OFMutableArray<OFString *> *scoreLines;
void
renderscore(DynamicEntity *d)
{
@autoreleasepool {
OFString *lag = [OFString stringWithFormat:@"%d", d.plag];
OFString *name = [OFString stringWithFormat:@"(%@)", d.name];
OFString *line =
[OFString stringWithFormat:@"%d\t%@\t%d\t%@\t%@", d.frags,
(d.state == CS_LAGGED ? @"LAG" : lag), d.ping,
d.team, (d.state == CS_DEAD ? name : d.name)];
OFString *lag = [OFString stringWithFormat:@"%d", d.plag];
OFString *name = [OFString stringWithFormat:@"(%@)", d.name];
OFString *line =
[OFString stringWithFormat:@"%d\t%@\t%d\t%@\t%@", d.frags,
(d.state == CS_LAGGED ? @"LAG" : lag), d.ping, d.team,
(d.state == CS_DEAD ? name : d.name)];
if (scoreLines == nil)
scoreLines = [[OFMutableArray alloc] init];
if (scoreLines == nil)
scoreLines = [[OFMutableArray alloc] init];
[scoreLines addObject:line];
[scoreLines addObject:line];
menumanual(0, scoreLines.count - 1, line);
}
menumanual(0, scoreLines.count - 1, line);
}
static const int maxTeams = 4;
@ -132,20 +130,18 @@ static size_t teamsUsed;
void
addteamscore(DynamicEntity *d)
{
@autoreleasepool {
for (size_t i = 0; i < teamsUsed; i++) {
if ([teamName[i] isEqual:d.team]) {
teamScore[i] += d.frags;
return;
}
}
if (teamsUsed == maxTeams)
for (size_t i = 0; i < teamsUsed; i++) {
if ([teamName[i] isEqual:d.team]) {
teamScore[i] += d.frags;
return;
teamName[teamsUsed] = d.team;
teamScore[teamsUsed++] = d.frags;
}
}
if (teamsUsed == maxTeams)
return;
teamName[teamsUsed] = d.team;
teamScore[teamsUsed++] = d.frags;
}
void
@ -172,9 +168,7 @@ renderscores()
[teamScores appendFormat:@"[ %@: %d ]", teamName[j],
teamScore[j]];
menumanual(0, scoreLines.count, @"");
@autoreleasepool {
menumanual(0, scoreLines.count + 1, teamScores);
}
menumanual(0, scoreLines.count + 1, teamScores);
}
}
@ -183,38 +177,36 @@ renderscores()
void
sendmap(OFString *mapname)
{
@autoreleasepool {
if (mapname.length > 0)
save_world(mapname);
changemap(mapname);
mapname = getclientmap();
OFData *mapdata = readmap(mapname);
if (mapdata == nil)
return;
ENetPacket *packet = enet_packet_create(
NULL, MAXTRANS + mapdata.count, ENET_PACKET_FLAG_RELIABLE);
uchar *start = packet->data;
uchar *p = start + 2;
putint(p, SV_SENDMAP);
sendstring(mapname, p);
putint(p, mapdata.count);
if (65535 - (p - start) < mapdata.count) {
conoutf(@"map %@ is too large to send", mapname);
enet_packet_destroy(packet);
return;
}
memcpy(p, mapdata.items, mapdata.count);
p += mapdata.count;
*(ushort *)start = ENET_HOST_TO_NET_16(p - start);
enet_packet_resize(packet, p - start);
sendpackettoserv(packet);
conoutf(@"sending map %@ to server...", mapname);
OFString *msg =
[OFString stringWithFormat:@"[map %@ uploaded to server, "
@"\"getmap\" to receive it]",
mapname];
toserver(msg);
if (mapname.length > 0)
save_world(mapname);
changemap(mapname);
mapname = getclientmap();
OFData *mapdata = readmap(mapname);
if (mapdata == nil)
return;
ENetPacket *packet = enet_packet_create(
NULL, MAXTRANS + mapdata.count, ENET_PACKET_FLAG_RELIABLE);
uchar *start = packet->data;
uchar *p = start + 2;
putint(p, SV_SENDMAP);
sendstring(mapname, p);
putint(p, mapdata.count);
if (65535 - (p - start) < mapdata.count) {
conoutf(@"map %@ is too large to send", mapname);
enet_packet_destroy(packet);
return;
}
memcpy(p, mapdata.items, mapdata.count);
p += mapdata.count;
*(ushort *)start = ENET_HOST_TO_NET_16(p - start);
enet_packet_resize(packet, p - start);
sendpackettoserv(packet);
conoutf(@"sending map %@ to server...", mapname);
OFString *msg =
[OFString stringWithFormat:@"[map %@ uploaded to server, "
@"\"getmap\" to receive it]",
mapname];
toserver(msg);
}
void