Skip to content

Commit 3c97b0c

Browse files
committed
New feature Target update FPS for particles (optimization)
1 parent 3d9a394 commit 3c97b0c

File tree

1 file changed

+131
-113
lines changed

1 file changed

+131
-113
lines changed

scripts/AdvancedParticleSystem/AdvancedParticleSystem.gml

Lines changed: 131 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//Advanced particle system by Limekys (This script has MIT Licence)
2-
#macro LIMEKYS_ADVANCED_PARTICLE_SYSTEM_VERSION "2024.02.23"
2+
#macro LIMEKYS_ADVANCED_PARTICLE_SYSTEM_VERSION "2024.02.26"
33

44
#macro _APS_DT global.particle_system_deltatime //This is a delta time variable, you can replace it with your own if you use your delta time system in the game
55

@@ -25,7 +25,12 @@ function advanced_part_system() constructor {
2525
part_system_max_count = 1000;
2626
part_system_debug_mode = false;
2727

28-
//update_interval = aps_update_interval; //not completed
28+
//Update timer (a little bit more optimization stuff)
29+
//You can specify a target FPS for the particles
30+
//for example at a value of 30 the particles will update 30 times per second
31+
//when the rest of the game will update at your specified frame rate of 60, 120 ....
32+
part_system_update_timer = 0;
33+
part_system_update_fps = 60;
2934

3035
//DELTATIME SYSTEM INIT
3136
part_system_deltatime_is_enabled = false;
@@ -63,6 +68,13 @@ function advanced_part_system() constructor {
6368
return self;
6469
}
6570

71+
///@func set_update_fps(update_fps = 60)
72+
///@desc Set target update fps for particle system
73+
static set_update_fps = function(update_fps = 60) {
74+
part_system_update_fps = update_fps;
75+
return self;
76+
}
77+
6678
///@func clear()
6779
///@desc Delete all exists particles
6880
static clear = function() {
@@ -116,148 +128,154 @@ function advanced_part_system() constructor {
116128
//Update all particles
117129
var _delta_time = part_system_deltatime_is_enabled ? _APS_DT : 1;
118130
var i = _length - 1;
119-
repeat (_length) {
120-
var _particle = particle_array[i];
121-
if is_struct(_particle) {
122-
//Update every particle
123-
with(_particle) {
131+
var _multiplier = max(1, fps / part_system_update_fps);
132+
_delta_time *= _multiplier;
133+
part_system_update_timer++;
134+
if part_system_update_timer >= _multiplier {
135+
part_system_update_timer -= _multiplier;
136+
repeat (_length) {
137+
var _particle = particle_array[i];
138+
if is_struct(_particle) {
139+
//Update every particle
140+
with(_particle) {
124141

125-
//Moving
126-
var _x_speed = dcos(direction) * speed * _delta_time;
127-
var _y_speed = -dsin(direction) * speed * _delta_time;
142+
//Moving
143+
var _x_speed = dcos(direction) * speed * _delta_time;
144+
var _y_speed = -dsin(direction) * speed * _delta_time;
128145

129-
if gravity_speed != 0 {
130-
gravity += gravity_speed * _delta_time;
131-
_x_speed += dcos(gravity_direction) * gravity * _delta_time;
132-
_y_speed += -dsin(gravity_direction) * gravity * _delta_time;
133-
}
134-
if point_gravity_speed != 0 {
135-
point_gravity += point_gravity_speed * _delta_time;
136-
var point_gravity_dir = point_direction(x, y, point_gravity_x, point_gravity_y);
137-
_x_speed += dcos(point_gravity_dir) * point_gravity * _delta_time;
138-
_y_speed += -dsin(point_gravity_dir) * point_gravity * _delta_time;
139-
}
146+
if gravity_speed != 0 {
147+
gravity += gravity_speed * _delta_time;
148+
_x_speed += dcos(gravity_direction) * gravity * _delta_time;
149+
_y_speed += -dsin(gravity_direction) * gravity * _delta_time;
150+
}
151+
if point_gravity_speed != 0 {
152+
point_gravity += point_gravity_speed * _delta_time;
153+
var point_gravity_dir = point_direction(x, y, point_gravity_x, point_gravity_y);
154+
_x_speed += dcos(point_gravity_dir) * point_gravity * _delta_time;
155+
_y_speed += -dsin(point_gravity_dir) * point_gravity * _delta_time;
156+
}
140157

141-
x_previous = x;
142-
y_previous = y;
158+
x_previous = x;
159+
y_previous = y;
143160

144-
x += _x_speed;
145-
y += _y_speed;
161+
x += _x_speed;
162+
y += _y_speed;
146163

147-
life -= _delta_time;
164+
life -= _delta_time;
148165

149-
//Custom step function
150-
if is_method(step_function) {
151-
step_function();
152-
}
166+
//Custom step function
167+
if is_method(step_function) {
168+
step_function();
169+
}
153170

154-
//Changing color
155-
if colors_enabled {
156-
var _percent = 1 - (life / life_max);
171+
//Changing color
172+
if colors_enabled {
173+
var _percent = 1 - (life / life_max);
157174

158-
if _percent <= 0.5 {
159-
color = merge_colour(color1, color2, _percent * 2);
160-
} else {
161-
color = merge_colour(color2, color3, _percent * 2 - 1);
175+
if _percent <= 0.5 {
176+
color = merge_colour(color1, color2, _percent * 2);
177+
} else {
178+
color = merge_colour(color2, color3, _percent * 2 - 1);
179+
}
162180
}
163-
}
164181

165-
//Changing alpha
166-
if alpha_blend_enabled {
167-
var _percent = 1 - (life / life_max);
182+
//Changing alpha
183+
if alpha_blend_enabled {
184+
var _percent = 1 - (life / life_max);
168185

169-
if _percent <= 0.5 {
170-
alpha = lerp(alpha1, alpha2, _percent * 2);
171-
} else {
172-
alpha = lerp(alpha2, alpha3, _percent * 2 - 1);
186+
if _percent <= 0.5 {
187+
alpha = lerp(alpha1, alpha2, _percent * 2);
188+
} else {
189+
alpha = lerp(alpha2, alpha3, _percent * 2 - 1);
190+
}
173191
}
174-
}
175192

176-
//Changing direction (direction_increase)
177-
if direction_increase != 0 {
178-
direction += direction_increase * _delta_time;
179-
}
180-
if direction_wiggle != 0 { //???//
181-
var _wiggle = direction_wiggle;
182-
direction = direction + wiggle(-_wiggle, _wiggle, 0.2 * _delta_time, life);
183-
}
193+
//Changing direction (direction_increase)
194+
if direction_increase != 0 {
195+
direction += direction_increase * _delta_time;
196+
}
197+
if direction_wiggle != 0 { //???//
198+
var _wiggle = direction_wiggle;
199+
direction = direction + wiggle(-_wiggle, _wiggle, 0.2 * _delta_time, life);
200+
}
184201

185-
//Changing speed (speed_increase)
186-
if speed_increase != 0 && speed > 0 {
187-
speed += speed_increase * _delta_time;
188-
}
189-
if speed_wiggle != 0 && speed > 0 { //???//
190-
var _wiggle = speed_wiggle;
191-
speed = speed + wiggle(-_wiggle, _wiggle, 0.2 * _delta_time, life);
192-
}
202+
//Changing speed (speed_increase)
203+
if speed_increase != 0 && speed > 0 {
204+
speed += speed_increase * _delta_time;
205+
}
206+
if speed_wiggle != 0 && speed > 0 { //???//
207+
var _wiggle = speed_wiggle;
208+
speed = speed + wiggle(-_wiggle, _wiggle, 0.2 * _delta_time, life);
209+
}
193210

194-
//Changing angle (angle_increase, angle_relative)
195-
if angle_relative {
196-
angle = direction;
197-
} else if angle_increase != 0 {
198-
angle += angle_increase * _delta_time;
199-
}
200-
if angle_wiggle != 0 { //???//
201-
var _wiggle = angle_wiggle;
202-
angle = angle + wiggle(-_wiggle, _wiggle, 0.2 * _delta_time, life);
203-
}
211+
//Changing angle (angle_increase, angle_relative)
212+
if angle_relative {
213+
angle = direction;
214+
} else if angle_increase != 0 {
215+
angle += angle_increase * _delta_time;
216+
}
217+
if angle_wiggle != 0 { //???//
218+
var _wiggle = angle_wiggle;
219+
angle = angle + wiggle(-_wiggle, _wiggle, 0.2 * _delta_time, life);
220+
}
204221

205-
//Changing size (size_increase)
206-
if size_increase != 0 {
207-
x_size += size_increase * _delta_time;
208-
y_size += size_increase * _delta_time;
209-
}
210-
if size_wiggle != 0 { //???//
211-
var _wiggle = size_wiggle;
212-
x_size = x_size + wiggle(-_wiggle, _wiggle, 0.2 * _delta_time, life);
213-
y_size = y_size + wiggle(-_wiggle, _wiggle, 0.2 * _delta_time, life);
214-
}
222+
//Changing size (size_increase)
223+
if size_increase != 0 {
224+
x_size += size_increase * _delta_time;
225+
y_size += size_increase * _delta_time;
226+
}
227+
if size_wiggle != 0 { //???//
228+
var _wiggle = size_wiggle;
229+
x_size = x_size + wiggle(-_wiggle, _wiggle, 0.2 * _delta_time, life);
230+
y_size = y_size + wiggle(-_wiggle, _wiggle, 0.2 * _delta_time, life);
231+
}
215232

216-
//Step particles // NOT COMPLETED! //
217-
if part_type.part_step_number != 0 {
218-
//Burst particles with deltatime (create numbers of particles within a second) if ps.part_system_deltatime_is_enabled == true
219-
//And burst particles without deltatime (create numbers of particles each step) if ps.part_system_deltatime_is_enabled == false
220-
var _spawn_interval = 1 / part_type.part_step_number;
221-
if (other.part_system_deltatime_is_enabled == true) part_type.spawn_timer += _APS_DT;
222-
var _count = other.part_system_deltatime_is_enabled ? floor(part_type.spawn_timer / _spawn_interval) : part_type.part_step_number;
233+
//Step particles // NOT COMPLETED! //
234+
if part_type.part_step_number != 0 {
235+
//Burst particles with deltatime (create numbers of particles within a second) if ps.part_system_deltatime_is_enabled == true
236+
//And burst particles without deltatime (create numbers of particles each step) if ps.part_system_deltatime_is_enabled == false
237+
var _spawn_interval = 1 / part_type.part_step_number;
238+
if (other.part_system_deltatime_is_enabled == true) part_type.spawn_timer += _APS_DT;
239+
var _count = other.part_system_deltatime_is_enabled ? floor(part_type.spawn_timer / _spawn_interval) : part_type.part_step_number;
223240

224-
repeat (_count) {
225-
var _step_particle = new particle(part_type.part_step_type);
226-
with(_step_particle) {
227-
x = other.x;
228-
y = other.y;
241+
repeat (_count) {
242+
var _step_particle = new particle(part_type.part_step_type);
243+
with(_step_particle) {
244+
x = other.x;
245+
y = other.y;
246+
}
247+
array_push(other.particle_array, _step_particle);
248+
part_type.spawn_timer = part_type.spawn_timer mod _spawn_interval;
229249
}
230-
array_push(other.particle_array, _step_particle);
231-
part_type.spawn_timer = part_type.spawn_timer mod _spawn_interval;
232250
}
233-
}
234251

235-
//Destroy particles
236-
if life <= 0 {
237-
if death_part != undefined {
238-
var _death_particle = new particle(death_part);
239-
with(_death_particle) {
240-
emitter = other.emitter;
241-
x = other.x;
242-
y = other.y;
243-
}
244-
other.particle_array[i] = _death_particle;
245-
repeat (death_number - 1) {
246-
_death_particle = new particle(death_part);
252+
//Destroy particles
253+
if life <= 0 {
254+
if death_part != undefined {
255+
var _death_particle = new particle(death_part);
247256
with(_death_particle) {
248257
emitter = other.emitter;
249258
x = other.x;
250259
y = other.y;
251260
}
252-
array_push(other.particle_array, _death_particle);
261+
other.particle_array[i] = _death_particle;
262+
repeat (death_number - 1) {
263+
_death_particle = new particle(death_part);
264+
with(_death_particle) {
265+
emitter = other.emitter;
266+
x = other.x;
267+
y = other.y;
268+
}
269+
array_push(other.particle_array, _death_particle);
270+
}
271+
} else {
272+
array_delete(other.particle_array, i, 1);
253273
}
254-
} else {
255-
array_delete(other.particle_array, i, 1);
256274
}
257275
}
258276
}
277+
--i;
259278
}
260-
--i;
261279
}
262280
}
263281
}

0 commit comments

Comments
 (0)