{examples,Audio}: optimize needless setComponent calls away
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
This commit is contained in:
parent
57767c2f9f
commit
6feaad630e
5 changed files with 19 additions and 15 deletions
|
|
@ -162,10 +162,10 @@ fn tick(
|
||||||
var q = try entities.query(.{
|
var q = try entities.query(.{
|
||||||
.ids = mach.Entities.Mod.read(.id),
|
.ids = mach.Entities.Mod.read(.id),
|
||||||
.followers = Mod.read(.follower),
|
.followers = Mod.read(.follower),
|
||||||
.positions = Renderer.Mod.read(.position),
|
.positions = Renderer.Mod.write(.position),
|
||||||
});
|
});
|
||||||
while (q.next()) |v| {
|
while (q.next()) |v| {
|
||||||
for (v.ids, v.positions) |id, position| {
|
for (v.ids, v.positions) |id, *position| {
|
||||||
// Nested query to find all the other follower entities that we should move away from.
|
// Nested query to find all the other follower entities that we should move away from.
|
||||||
// We will avoid all other follower entities if we're too close to them.
|
// We will avoid all other follower entities if we're too close to them.
|
||||||
// This is not very efficient, but it works!
|
// This is not very efficient, but it works!
|
||||||
|
|
@ -204,7 +204,7 @@ fn tick(
|
||||||
new_position = new_position.lerp(&vec3(0, 0, 0), move_speed / avoidance_div);
|
new_position = new_position.lerp(&vec3(0, 0, 0), move_speed / avoidance_div);
|
||||||
|
|
||||||
// Finally, update our entity position.
|
// Finally, update our entity position.
|
||||||
try renderer.set(id, .position, new_position);
|
position.* = new_position;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -135,37 +135,36 @@ fn audioTick(entities: *mach.Entities.Mod, audio: *Mod) !void {
|
||||||
|
|
||||||
var did_state_change = false;
|
var did_state_change = false;
|
||||||
var q = try entities.query(.{
|
var q = try entities.query(.{
|
||||||
.ids = mach.Entities.Mod.read(.id),
|
|
||||||
.samples_slices = Mod.read(.samples),
|
.samples_slices = Mod.read(.samples),
|
||||||
.channels = Mod.read(.channels),
|
.channels = Mod.read(.channels),
|
||||||
.playings = Mod.read(.playing),
|
.playings = Mod.write(.playing),
|
||||||
.indexes = Mod.read(.index),
|
.indexes = Mod.write(.index),
|
||||||
});
|
});
|
||||||
while (q.next()) |v| {
|
while (q.next()) |v| {
|
||||||
for (v.ids, v.samples_slices, v.channels, v.playings, v.indexes) |id, samples, channels, playing, index| {
|
for (v.samples_slices, v.channels, v.playings, v.indexes) |samples, channels, *playing, *index| {
|
||||||
if (!playing) continue;
|
if (!playing.*) continue;
|
||||||
|
|
||||||
const channels_diff = player_channels - channels + 1;
|
const channels_diff = player_channels - channels + 1;
|
||||||
const to_read = @min(samples.len - index, mixing_buffer.items.len) / channels_diff;
|
const to_read = @min(samples.len - index.*, mixing_buffer.items.len) / channels_diff;
|
||||||
if (channels == 1 and player_channels > 1) {
|
if (channels == 1 and player_channels > 1) {
|
||||||
// Duplicate samples for mono sounds
|
// Duplicate samples for mono sounds
|
||||||
var i: usize = 0;
|
var i: usize = 0;
|
||||||
for (samples[index..][0..to_read]) |sample| {
|
for (samples[index.*..][0..to_read]) |sample| {
|
||||||
mixSamplesDuplicate(mixing_buffer.items[i..][0..player_channels], sample);
|
mixSamplesDuplicate(mixing_buffer.items[i..][0..player_channels], sample);
|
||||||
i += player_channels;
|
i += player_channels;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
mixSamples(mixing_buffer.items[0..to_read], samples[index..][0..to_read]);
|
mixSamples(mixing_buffer.items[0..to_read], samples[index.*..][0..to_read]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (index + to_read >= samples.len) {
|
if (index.* + to_read >= samples.len) {
|
||||||
// No longer playing, we've read all samples
|
// No longer playing, we've read all samples
|
||||||
did_state_change = true;
|
did_state_change = true;
|
||||||
try audio.set(id, .playing, false);
|
playing.* = false;
|
||||||
try audio.set(id, .index, 0);
|
index.* = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
try audio.set(id, .index, index + to_read);
|
index.* = index.* + to_read;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (audio.state().on_state_change) |on_state_change_event| {
|
if (audio.state().on_state_change) |on_state_change_event| {
|
||||||
|
|
|
||||||
|
|
@ -96,6 +96,7 @@ fn updatePipeline(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: optimize by removing this component set call and instead use a .write() query
|
||||||
try sprite_pipeline.set(pipeline_id, .num_sprites, num_sprites);
|
try sprite_pipeline.set(pipeline_id, .num_sprites, num_sprites);
|
||||||
if (num_sprites > 0) {
|
if (num_sprites > 0) {
|
||||||
encoder.writeBuffer(built.transforms, 0, gfx.SpritePipeline.cp_transforms[0..i]);
|
encoder.writeBuffer(built.transforms, 0, gfx.SpritePipeline.cp_transforms[0..i]);
|
||||||
|
|
|
||||||
|
|
@ -155,6 +155,8 @@ fn buildPipeline(
|
||||||
pipeline_id: mach.EntityID,
|
pipeline_id: mach.EntityID,
|
||||||
texture: *gpu.Texture,
|
texture: *gpu.Texture,
|
||||||
) !void {
|
) !void {
|
||||||
|
// TODO: optimize by removing the component get/set calls in this function where possible
|
||||||
|
// and instead use .write() queries
|
||||||
const opt_texture2 = sprite_pipeline.get(pipeline_id, .texture2);
|
const opt_texture2 = sprite_pipeline.get(pipeline_id, .texture2);
|
||||||
const opt_texture3 = sprite_pipeline.get(pipeline_id, .texture3);
|
const opt_texture3 = sprite_pipeline.get(pipeline_id, .texture3);
|
||||||
const opt_texture4 = sprite_pipeline.get(pipeline_id, .texture4);
|
const opt_texture4 = sprite_pipeline.get(pipeline_id, .texture4);
|
||||||
|
|
|
||||||
|
|
@ -179,6 +179,8 @@ fn buildPipeline(
|
||||||
text_pipeline: *Mod,
|
text_pipeline: *Mod,
|
||||||
pipeline_id: mach.EntityID,
|
pipeline_id: mach.EntityID,
|
||||||
) !void {
|
) !void {
|
||||||
|
// TODO: optimize by removing the component get/set calls in this function where possible
|
||||||
|
// and instead use .write() queries
|
||||||
const opt_shader = text_pipeline.get(pipeline_id, .shader);
|
const opt_shader = text_pipeline.get(pipeline_id, .shader);
|
||||||
const opt_texture_sampler = text_pipeline.get(pipeline_id, .texture_sampler);
|
const opt_texture_sampler = text_pipeline.get(pipeline_id, .texture_sampler);
|
||||||
const opt_blend_state = text_pipeline.get(pipeline_id, .blend_state);
|
const opt_blend_state = text_pipeline.get(pipeline_id, .blend_state);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue