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_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 */
static Snow *_snow_init(E_Module *m);
static void _snow_shutdown(Snow *snow);
@ -270,13 +274,13 @@ _snow_flakes_load(char type, Snow *snow)
switch (type)
{
case 's':
flake->speed = 1;
flake->speed = SPEED_SLOW;
break;
case 'm':
flake->speed = 2;
flake->speed = SPEED_MED;
break;
case 'l':
flake->speed = 3;
flake->speed = SPEED_FAST;
break;
}
snow->flakes = eina_list_append(snow->flakes, flake);
@ -290,10 +294,11 @@ _snow_cb_animator(void *data)
Snow *snow;
Eina_List *next;
Evas_Coord ww;
double d;
double time;
snow = data;
evas_output_viewport_get(snow->canvas, NULL, NULL, &ww, NULL);
time = ecore_time_get();
next = snow->flakes;
while (next)
@ -303,29 +308,33 @@ _snow_cb_animator(void *data)
int drift;
flake = next->data;
d = ecore_time_get() - flake->start_time;
y = 30 * d * flake->speed;
switch (rand() % 22)
next = eina_list_next(next);
if (snow->frame % flake->speed != 0)
continue;
switch (rand() % 50)
{
case 19:
case 0:
drift = -1;
break;
case 20:
case 21:
case 1:
case 2:
drift = 1;
break;
default:
drift = 0;
}
evas_object_geometry_get(flake->flake, &x, NULL, NULL, NULL);
if (y > snow->height)
flake->start_time = ecore_time_get() + (double)(random() % 100) / (double)100;
evas_object_geometry_get(flake->flake, &x, &y, NULL, NULL);
if (++y > snow->height)
y = -1 * rand() % 100;
if (x + drift >= ww)
x = 0;
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;
}

View File

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