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_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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue