Speed up, remove a lot of calculations
Remove a lot of the CPU overhead for dense snowfall
This commit is contained in:
parent
462243c4df
commit
0800497ab2
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@ struct _Snow
|
|||
Eina_List *cons;
|
||||
Evas *canvas;
|
||||
Ecore_Animator *animator;
|
||||
int frame;
|
||||
Eina_List *trees;
|
||||
Eina_List *flakes;
|
||||
|
||||
|
|
Loading…
Reference in New Issue