Speed up, remove a lot of calculations

Remove a lot of the CPU overhead for dense snowfall
This commit is contained in:
Andy Williams 2017-12-29 22:53:37 +00:00
parent 462243c4df
commit 0800497ab2
2 changed files with 25 additions and 15 deletions

View File

@ -3,6 +3,10 @@
#include "e_mod_main.h" #include "e_mod_main.h"
#include "e_mod_config.h" #include "e_mod_config.h"
#define SPEED_SLOW 6
#define SPEED_MED 4
#define SPEED_FAST 2
static int MAX_FRAMES = SPEED_SLOW * SPEED_MED * SPEED_FAST;
/* module private routines */ /* module private routines */
static Snow *_snow_init(E_Module *m); static Snow *_snow_init(E_Module *m);
static void _snow_shutdown(Snow *snow); static void _snow_shutdown(Snow *snow);
@ -270,13 +274,13 @@ _snow_flakes_load(char type, Snow *snow)
switch (type) switch (type)
{ {
case 's': case 's':
flake->speed = 1; flake->speed = SPEED_SLOW;
break; break;
case 'm': case 'm':
flake->speed = 2; flake->speed = SPEED_MED;
break; break;
case 'l': case 'l':
flake->speed = 3; flake->speed = SPEED_FAST;
break; break;
} }
snow->flakes = eina_list_append(snow->flakes, flake); snow->flakes = eina_list_append(snow->flakes, flake);
@ -290,10 +294,11 @@ _snow_cb_animator(void *data)
Snow *snow; Snow *snow;
Eina_List *next; Eina_List *next;
Evas_Coord ww; Evas_Coord ww;
double d; double time;
snow = data; snow = data;
evas_output_viewport_get(snow->canvas, NULL, NULL, &ww, NULL); evas_output_viewport_get(snow->canvas, NULL, NULL, &ww, NULL);
time = ecore_time_get();
next = snow->flakes; next = snow->flakes;
while (next) while (next)
@ -303,29 +308,33 @@ _snow_cb_animator(void *data)
int drift; int drift;
flake = next->data; flake = next->data;
d = ecore_time_get() - flake->start_time; next = eina_list_next(next);
y = 30 * d * flake->speed; if (snow->frame % flake->speed != 0)
switch (rand() % 22) continue;
switch (rand() % 50)
{ {
case 19: case 0:
drift = -1; drift = -1;
break; break;
case 20: case 1:
case 21: case 2:
drift = 1; drift = 1;
break; break;
default: default:
drift = 0; drift = 0;
} }
evas_object_geometry_get(flake->flake, &x, NULL, NULL, NULL); evas_object_geometry_get(flake->flake, &x, &y, NULL, NULL);
if (y > snow->height) if (++y > snow->height)
flake->start_time = ecore_time_get() + (double)(random() % 100) / (double)100; y = -1 * rand() % 100;
if (x + drift >= ww) if (x + drift >= ww)
x = 0; x = 0;
evas_object_move(flake->flake, x + drift, y); evas_object_move(flake->flake, x + drift, y);
next = eina_list_next(next);
} }
snow->frame++;
if (snow->frame > MAX_FRAMES)
snow->frame = 0;
return EINA_TRUE; return EINA_TRUE;
} }

View File

@ -27,6 +27,7 @@ struct _Snow
Eina_List *cons; Eina_List *cons;
Evas *canvas; Evas *canvas;
Ecore_Animator *animator; Ecore_Animator *animator;
int frame;
Eina_List *trees; Eina_List *trees;
Eina_List *flakes; Eina_List *flakes;