Skip to content

Commit 25cacf3

Browse files
committed
Eliminate unnecessary mem allocation in perlin
Resolves #147
1 parent 55e764a commit 25cacf3

File tree

2 files changed

+59
-45
lines changed

2 files changed

+59
-45
lines changed

books/RayTracingTheNextWeek.html

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1070,41 +1070,44 @@
10701070
}
10711071

10721072
public:
1073-
static double *ranfloat;
1074-
static int *perm_x;
1075-
static int *perm_y;
1076-
static int *perm_z;
1073+
static const int point_count = 256;
1074+
static double* ranfloat;
1075+
static int* perm_x;
1076+
static int* perm_y;
1077+
static int* perm_z;
10771078
};
10781079

10791080
static double* perlin_generate() {
1080-
auto p = new double[256];
1081-
for (int i = 0; i < 256; ++i)
1081+
auto p = new double[perlin::point_count];
1082+
for (int i = 0; i < perlin::point_count; ++i)
10821083
p[i] = random_double();
10831084
return p;
10841085
}
10851086

1086-
void permute(int *p, int n) {
1087+
void permute(int* p, int n) {
10871088
for (int i = n-1; i > 0; i--) {
10881089
int target = random_int(0, i);
10891090
int tmp = p[i];
10901091
p[i] = p[target];
10911092
p[target] = tmp;
10921093
}
1093-
return;
10941094
}
10951095

1096-
static int* perlin_generate_perm() {
1097-
int * p = new int[256];
1098-
for (int i = 0; i < 256; i++)
1096+
static int* perlin_generate_perm(int p[]) {
1097+
for (int i = 0; i < perlin::point_count; i++)
10991098
p[i] = i;
1100-
permute(p, 256);
1099+
1100+
permute(p, perlin::point_count);
1101+
11011102
return p;
11021103
}
11031104

1104-
double *perlin::ranfloat = perlin_generate();
1105-
int *perlin::perm_x = perlin_generate_perm();
1106-
int *perlin::perm_y = perlin_generate_perm();
1107-
int *perlin::perm_z = perlin_generate_perm();
1105+
double* perlin::ranfloat = perlin_generate();
1106+
1107+
int perlin_values[3][perlin::point_count];
1108+
int* perlin::perm_x = perlin_generate_perm(perlin_values[0]);
1109+
int* perlin::perm_y = perlin_generate_perm(perlin_values[1]);
1110+
int* perlin::perm_z = perlin_generate_perm(perlin_values[2]);
11081111
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
11091112
[Listing [perlin]: <kbd>[perlin.h]</kbd> A Perlin texture class and functions]
11101113
</div>
@@ -1206,9 +1209,10 @@
12061209
}
12071210

12081211
public:
1209-
static int *perm_x;
1210-
static int *perm_y;
1211-
static int *perm_z;
1212+
static const int point_count = 256;
1213+
static int* perm_x;
1214+
static int* perm_y;
1215+
static int* perm_z;
12121216
}
12131217
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
12141218
[Listing [perlin-trilinear]: <kbd>[perlin.h]</kbd> Perlin with trilienear interpolation]
@@ -1290,10 +1294,12 @@
12901294
max off the lattice. So, first we need to change the random floats to random vectors:
12911295

12921296
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
1293-
vec3 *perlin::ranvec = perlin_generate();
1294-
int *perlin::perm_x = perlin_generate_perm();
1295-
int *perlin::perm_y = perlin_generate_perm();
1296-
int *perlin::perm_z = perlin_generate_perm();
1297+
vec3* perlin::ranvec = perlin_generate();
1298+
1299+
int perlin_values[3][perlin::point_count];
1300+
int* perlin::perm_x = perlin_generate_perm(perlin_values[0]);
1301+
int* perlin::perm_y = perlin_generate_perm(perlin_values[1]);
1302+
int* perlin::perm_z = perlin_generate_perm(perlin_values[2]);
12971303
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
12981304
[Listing [perlin-randunit]: <kbd>[perlin.h]</kbd> Perlin with random unit translations]
12991305
</div>
@@ -1304,10 +1310,12 @@
13041310

13051311
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
13061312
static vec3* perlin_generate() {
1307-
vec3 *p = new vec3[256];
1308-
for (int i = 0; i < 256; ++i) {
1313+
static vec3 p[perlin::point_count];
1314+
1315+
for (int i = 0; i < perlin::point_count; ++i) {
13091316
p[i] = unit_vector(vec3::random(-1,1));
13101317
}
1318+
13111319
return p;
13121320
}
13131321
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -1340,10 +1348,11 @@
13401348
}
13411349

13421350
public:
1343-
static vec3 *ranvec;
1344-
static int *perm_x;
1345-
static int *perm_y;
1346-
static int *perm_z;
1351+
static const int point_count = 256;
1352+
static vec3* ranvec;
1353+
static int* perm_x;
1354+
static int* perm_y;
1355+
static int* perm_z;
13471356
}
13481357
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
13491358
[Listing [perlin-2]: <kbd>[perlin.h]</kbd> The perlin class so far]

src/common/perlin.h

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -63,46 +63,51 @@ class perlin {
6363
}
6464

6565
public:
66-
static vec3 *ranvec;
67-
static int *perm_x;
68-
static int *perm_y;
69-
static int *perm_z;
66+
static const int point_count = 256;
67+
static vec3* ranvec;
68+
static int* perm_x;
69+
static int* perm_y;
70+
static int* perm_z;
7071
};
7172

7273

7374
static vec3* perlin_generate() {
74-
vec3 *p = new vec3[256];
75-
for (int i = 0; i < 256; ++i) {
75+
static vec3 p[perlin::point_count];
76+
77+
for (int i = 0; i < perlin::point_count; ++i) {
7678
p[i] = unit_vector(vec3::random(-1,1));
7779
}
80+
7881
return p;
7982
}
8083

8184

82-
void permute(int *p, int n) {
85+
void permute(int* p, int n) {
8386
for (int i = n-1; i > 0; i--) {
8487
int target = random_int(0,i);
8588
int tmp = p[i];
8689
p[i] = p[target];
8790
p[target] = tmp;
8891
}
89-
return;
9092
}
9193

9294

93-
static int* perlin_generate_perm() {
94-
int * p = new int[256];
95-
for (int i = 0; i < 256; i++)
95+
static int* perlin_generate_perm(int p[]) {
96+
for (int i = 0; i < perlin::point_count; i++)
9697
p[i] = i;
97-
permute(p, 256);
98+
99+
permute(p, perlin::point_count);
100+
98101
return p;
99102
}
100103

101104

102-
vec3 *perlin::ranvec = perlin_generate();
103-
int *perlin::perm_x = perlin_generate_perm();
104-
int *perlin::perm_y = perlin_generate_perm();
105-
int *perlin::perm_z = perlin_generate_perm();
105+
vec3* perlin::ranvec = perlin_generate();
106+
107+
int perlin_values[3][perlin::point_count];
108+
int* perlin::perm_x = perlin_generate_perm(perlin_values[0]);
109+
int* perlin::perm_y = perlin_generate_perm(perlin_values[1]);
110+
int* perlin::perm_z = perlin_generate_perm(perlin_values[2]);
106111

107112

108113
#endif

0 commit comments

Comments
 (0)