@@ -279,17 +279,17 @@ void LBMManager::applyLBMs(ServerEnvironment *env, MapBlock *block, u32 stamp)
279
279
280
280
void fillRadiusBlock (v3s16 p0, s16 r, std::set<v3s16> &list)
281
281
{
282
+ const s16 r2 = r * r;
282
283
v3s16 p;
283
- for (p.X =p0.X -r; p.X <=p0.X +r; p.X ++)
284
- for (p.Y =p0.Y -r; p.Y <=p0.Y +r; p.Y ++)
285
- for (p.Z =p0.Z -r; p.Z <=p0.Z +r; p.Z ++)
286
- {
287
- // limit to a sphere
288
- if (p.getDistanceFrom (p0) <= r) {
289
- // Set in list
290
- list.insert (p);
291
- }
292
- }
284
+ for (p.X = p0.X - r; p.X <= p0.X + r; p.X ++)
285
+ for (p.Y = p0.Y - r; p.Y <= p0.Y + r; p.Y ++)
286
+ for (p.Z = p0.Z - r; p.Z <= p0.Z + r; p.Z ++) {
287
+ // limit to a sphere
288
+ if (p.getDistanceFromSQ (p0) <= r2) {
289
+ // Set in list
290
+ list.insert (p);
291
+ }
292
+ }
293
293
}
294
294
295
295
void fillViewConeBlock (v3s16 p0,
@@ -364,10 +364,7 @@ void ActiveBlockList::update(std::vector<PlayerSAO*> &active_players,
364
364
/*
365
365
Update m_list
366
366
*/
367
- m_list.clear ();
368
- for (v3s16 p : newlist) {
369
- m_list.insert (p);
370
- }
367
+ m_list = newlist;
371
368
}
372
369
373
370
/*
@@ -1230,14 +1227,16 @@ void ServerEnvironment::step(float dtime)
1230
1227
}
1231
1228
}
1232
1229
1230
+ // placeholder for the "real" time passed
1231
+ float elapsed_time;
1232
+
1233
1233
/*
1234
1234
Mess around in active blocks
1235
1235
*/
1236
- if (m_active_blocks_nodemetadata_interval.step (dtime, m_cache_nodetimer_interval)) {
1236
+ if (m_active_blocks_nodemetadata_interval.step (dtime, m_cache_nodetimer_interval,
1237
+ &elapsed_time)) {
1237
1238
ScopeProfiler sp (g_profiler, " SEnv: mess in act. blocks avg per interval" , SPT_AVG);
1238
1239
1239
- float dtime = m_cache_nodetimer_interval;
1240
-
1241
1240
for (const v3s16 &p: m_active_blocks.m_list ) {
1242
1241
MapBlock *block = m_map->getBlockNoCreateNoEx (p);
1243
1242
if (!block)
@@ -1255,7 +1254,7 @@ void ServerEnvironment::step(float dtime)
1255
1254
MOD_REASON_BLOCK_EXPIRED);
1256
1255
1257
1256
// Run node timers
1258
- std::vector<NodeTimer> elapsed_timers = block->m_node_timers .step (dtime );
1257
+ std::vector<NodeTimer> elapsed_timers = block->m_node_timers .step (elapsed_time );
1259
1258
if (!elapsed_timers.empty ()) {
1260
1259
MapNode n;
1261
1260
v3s16 p2;
@@ -1271,18 +1270,14 @@ void ServerEnvironment::step(float dtime)
1271
1270
}
1272
1271
}
1273
1272
1274
- if (m_active_block_modifier_interval.step (dtime, m_cache_abm_interval))
1273
+ if (m_active_block_modifier_interval.step (dtime,
1274
+ m_cache_abm_interval * m_active_block_interval_overload_skip, &elapsed_time))
1275
1275
do { // breakable
1276
- if (m_active_block_interval_overload_skip > 0 ) {
1277
- ScopeProfiler sp (g_profiler, " SEnv: ABM overload skips" );
1278
- m_active_block_interval_overload_skip--;
1279
- break ;
1280
- }
1281
1276
ScopeProfiler sp (g_profiler, " SEnv: modify in blocks avg per interval" , SPT_AVG);
1282
1277
TimeTaker timer (" modify in active blocks per interval" );
1283
1278
1284
1279
// Initialize handling of ActiveBlockModifiers
1285
- ABMHandler abmhandler (m_abms, m_cache_abm_interval , this , true );
1280
+ ABMHandler abmhandler (m_abms, elapsed_time , this , true );
1286
1281
1287
1282
for (const v3s16 &p : m_active_blocks.m_abm_list ) {
1288
1283
MapBlock *block = m_map->getBlockNoCreateNoEx (p);
@@ -1296,13 +1291,16 @@ void ServerEnvironment::step(float dtime)
1296
1291
abmhandler.apply (block);
1297
1292
}
1298
1293
1299
- u32 time_ms = timer.stop (true );
1300
- u32 max_time_ms = 200 ;
1294
+ const u32 time_ms = timer.stop (true );
1295
+ // allow up to 10% of the budget interval
1296
+ const u32 max_time_ms = m_cache_abm_interval * 1000 .0f * 0 .1f ;
1301
1297
if (time_ms > max_time_ms) {
1302
- warningstream<<" active block modifiers took "
1303
- <<time_ms<<" ms (longer than "
1304
- <<max_time_ms<<" ms)" <<std::endl;
1305
- m_active_block_interval_overload_skip = (time_ms / max_time_ms) + 1 ;
1298
+ warningstream << " active block modifiers took "
1299
+ << time_ms << " ms (longer than "
1300
+ << max_time_ms << " ms)" << std::endl;
1301
+ m_active_block_interval_overload_skip = ((float )time_ms / max_time_ms);
1302
+ } else {
1303
+ m_active_block_interval_overload_skip = 1 .0f ;
1306
1304
}
1307
1305
}while (0 );
1308
1306
@@ -1314,15 +1312,17 @@ void ServerEnvironment::step(float dtime)
1314
1312
/*
1315
1313
Step active objects
1316
1314
*/
1317
- {
1315
+ if (m_active_object_interval.step (dtime,
1316
+ m_cache_ao_interval * m_active_object_interval_overload_skip, &elapsed_time)) {
1317
+
1318
1318
ScopeProfiler sp (g_profiler, " SEnv: step act. objs avg" , SPT_AVG);
1319
- // TimeTaker timer("Step active objects");
1319
+ TimeTaker timer (" Step active objects" );
1320
1320
1321
1321
g_profiler->avg (" SEnv: num of objects" , m_active_objects.size ());
1322
1322
1323
1323
// This helps the objects to send data at the same time
1324
1324
bool send_recommended = false ;
1325
- m_send_recommended_timer += dtime ;
1325
+ m_send_recommended_timer += elapsed_time ;
1326
1326
if (m_send_recommended_timer > getSendRecommendedInterval ())
1327
1327
{
1328
1328
m_send_recommended_timer -= getSendRecommendedInterval ();
@@ -1335,13 +1335,28 @@ void ServerEnvironment::step(float dtime)
1335
1335
continue ;
1336
1336
1337
1337
// Step object
1338
- obj->step (dtime , send_recommended);
1338
+ obj->step (elapsed_time , send_recommended);
1339
1339
// Read messages from object
1340
1340
while (!obj->m_messages_out .empty ()) {
1341
1341
m_active_object_messages.push (obj->m_messages_out .front ());
1342
1342
obj->m_messages_out .pop ();
1343
1343
}
1344
1344
}
1345
+
1346
+ // calculate a simple moving average
1347
+ m_avg_ao_time = m_avg_ao_time * 0 .9f + timer.stop (true ) * 0 .1f ;
1348
+
1349
+ // allow up to 20% of the budget interval
1350
+ const float max_time_ms = m_cache_ao_interval * 1000 .0f * 0 .2f ;
1351
+ if (m_avg_ao_time > max_time_ms) {
1352
+ warningstream << " active objects took "
1353
+ << m_avg_ao_time << " ms (longer than "
1354
+ << max_time_ms << " ms)" << std::endl;
1355
+ // skip a few steps
1356
+ m_active_object_interval_overload_skip = m_avg_ao_time / max_time_ms;
1357
+ } else {
1358
+ m_active_object_interval_overload_skip = 1 .0f ;
1359
+ }
1345
1360
}
1346
1361
1347
1362
/*
0 commit comments