mirror of
https://github.com/PixelGuys/Cubyz.git
synced 2025-09-07 11:10:52 -04:00
Fix data races.
This commit is contained in:
parent
b84332d426
commit
fc52ad22ef
@ -101,7 +101,7 @@ pub const ClientEntityManager = struct {
|
|||||||
fn update() void {
|
fn update() void {
|
||||||
std.debug.assert(!mutex.tryLock()); // The mutex should be locked when calling this function.
|
std.debug.assert(!mutex.tryLock()); // The mutex should be locked when calling this function.
|
||||||
var time = @truncate(i16, std.time.milliTimestamp());
|
var time = @truncate(i16, std.time.milliTimestamp());
|
||||||
time -%= timeDifference.difference;
|
time -%= timeDifference.difference.load(.Monotonic);
|
||||||
for(entities.items) |*ent| {
|
for(entities.items) |*ent| {
|
||||||
ent.update(time, lastTime);
|
ent.update(time, lastTime);
|
||||||
}
|
}
|
||||||
|
@ -493,13 +493,19 @@ pub const ClientItemDropManager = struct {
|
|||||||
vel[i][2] = @bitCast(f64, std.mem.readIntBig(u64, data[42..50]));
|
vel[i][2] = @bitCast(f64, std.mem.readIntBig(u64, data[42..50]));
|
||||||
data = data[50..];
|
data = data[50..];
|
||||||
}
|
}
|
||||||
|
self.super.mutex.lock();
|
||||||
|
defer self.super.mutex.unlock();
|
||||||
self.interpolation.updatePosition(@ptrCast(*[maxf64Capacity]f64, &pos), @ptrCast(*[maxf64Capacity]f64, &vel), time); // TODO: Only update the ones we actually changed.
|
self.interpolation.updatePosition(@ptrCast(*[maxf64Capacity]f64, &pos), @ptrCast(*[maxf64Capacity]f64, &vel), time); // TODO: Only update the ones we actually changed.
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn updateInterpolationData(self: *ClientItemDropManager) void {
|
pub fn updateInterpolationData(self: *ClientItemDropManager) void {
|
||||||
var time = @truncate(i16, std.time.milliTimestamp()) -% settings.entityLookback;
|
var time = @truncate(i16, std.time.milliTimestamp()) -% settings.entityLookback;
|
||||||
time -%= self.timeDifference.difference;
|
time -%= self.timeDifference.difference.load(.Monotonic);
|
||||||
self.interpolation.updateIndexed(time, self.lastTime, &self.super.indices, 4);
|
{
|
||||||
|
self.super.mutex.lock();
|
||||||
|
defer self.super.mutex.unlock();
|
||||||
|
self.interpolation.updateIndexed(time, self.lastTime, &self.super.indices, 4);
|
||||||
|
}
|
||||||
self.lastTime = time;
|
self.lastTime = time;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -731,7 +737,9 @@ pub const ItemDropRenderer = struct {
|
|||||||
c.glUniform3fv(itemUniforms.ambientLight, 1, @ptrCast([*c]const f32, &ambientLight));
|
c.glUniform3fv(itemUniforms.ambientLight, 1, @ptrCast([*c]const f32, &ambientLight));
|
||||||
c.glUniformMatrix4fv(itemUniforms.viewMatrix, 1, c.GL_FALSE, @ptrCast([*c]const f32, &game.camera.viewMatrix));
|
c.glUniformMatrix4fv(itemUniforms.viewMatrix, 1, c.GL_FALSE, @ptrCast([*c]const f32, &game.camera.viewMatrix));
|
||||||
c.glUniform1f(itemUniforms.sizeScale, @floatCast(f32, ItemDropManager.diameter/4.0));
|
c.glUniform1f(itemUniforms.sizeScale, @floatCast(f32, ItemDropManager.diameter/4.0));
|
||||||
const itemDrops = game.world.?.itemDrops.super;
|
var itemDrops = &game.world.?.itemDrops.super;
|
||||||
|
itemDrops.mutex.lock();
|
||||||
|
defer itemDrops.mutex.unlock();
|
||||||
for(itemDrops.indices[0..itemDrops.size]) |i| {
|
for(itemDrops.indices[0..itemDrops.size]) |i| {
|
||||||
if(itemDrops.list.items(.itemStack)[i].item) |item| {
|
if(itemDrops.list.items(.itemStack)[i].item) |item| {
|
||||||
var pos = itemDrops.list.items(.pos)[i];
|
var pos = itemDrops.list.items(.pos)[i];
|
||||||
|
@ -591,20 +591,20 @@ pub fn GenericInterpolation(comptime elements: comptime_int) type {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub const TimeDifference = struct {
|
pub const TimeDifference = struct {
|
||||||
difference: i16 = 0,
|
difference: std.atomic.Atomic(i16) = std.atomic.Atomic(i16).init(0),
|
||||||
firstValue: bool = true,
|
firstValue: bool = true,
|
||||||
|
|
||||||
pub fn addDataPoint(self: *TimeDifference, time: i16) void {
|
pub fn addDataPoint(self: *TimeDifference, time: i16) void {
|
||||||
const currentTime = @truncate(i16, std.time.milliTimestamp());
|
const currentTime = @truncate(i16, std.time.milliTimestamp());
|
||||||
const timeDifference = currentTime -% time;
|
const timeDifference = currentTime -% time;
|
||||||
if(self.firstValue) {
|
if(self.firstValue) {
|
||||||
self.difference = timeDifference;
|
self.difference.store(timeDifference, .Monotonic);
|
||||||
self.firstValue = false;
|
self.firstValue = false;
|
||||||
}
|
}
|
||||||
if(timeDifference -% self.difference > 0) {
|
if(timeDifference -% self.difference.load(.Monotonic) > 0) {
|
||||||
self.difference +%= 1;
|
_ = @atomicRmw(i16, &self.difference.value, .Add, 1, .Monotonic);
|
||||||
} else if(timeDifference -% self.difference < 0) {
|
} else if(timeDifference -% self.difference.load(.Monotonic) < 0) {
|
||||||
self.difference -%= 1;
|
_ = @atomicRmw(i16, &self.difference.value, .Add, -1, .Monotonic);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
Loading…
x
Reference in New Issue
Block a user