afonsolage / projekto

Voxel game made with Bevy Engine
MIT License
59 stars 4 forks source link

Updated chunk to have a height other than the same as X and Z axis #11

Closed afonsolage closed 2 years ago

afonsolage commented 2 years ago

Closes #10

afonsolage commented 2 years ago

Existing cache with chunk size: 16^3

update_landscape_system        avg:  8393μs, samples:    17, min:  7265μs, max: 12294μs, meta:     3μs
faces_merging                  avg:  4741μs, samples:  2144, min:  1884μs, max: 13358μs, meta:     0μs
generate_vertices              avg:  3477μs, samples:  8192, min:   360μs, max: 19108μs, meta:     1μs
process_batch                  avg:  2837μs, samples:  4096, min:  2600μs, max: 10218μs, meta:   175μs
load_chunk                     avg:  2831μs, samples:  4096, min:  2595μs, max: 10205μs, meta:     0μs
load_cache                     avg:  2805μs, samples:  4096, min:  2578μs, max:  4362μs, meta:     0μs
faces_occlusion                avg:  2178μs, samples:  8192, min:   301μs, max:  6959μs, meta:     0μs
update_chunk                   avg:   172μs, samples:  4096, min:    91μs, max:   346μs, meta:     0μs
vertices_computation           avg:    16μs, samples:  2144, min:     1μs, max:   133μs, meta:     0μs
merge_faces                    avg:    11μs, samples: 61957, min:     1μs, max:   526μs, meta:   152μs
spawn_chunks_system            avg:    10μs, samples:   229, min:     1μs, max:   944μs, meta:    12μs
update_world_system            avg:     3μs, samples:   744, min:     1μs, max:   544μs, meta:     1μs
update_chunks_system           avg:     1μs, samples:    23, min:     1μs, max:     7μs, meta:    72μs

No cache with chunk size 16^3


update_landscape_system        avg:  9837μs, samples:    16, min:  7257μs, max: 12719μs, meta:     3μs
process_batch                  avg:  6014μs, samples:  4096, min:  5527μs, max: 14043μs, meta:   179μs
load_chunk                     avg:  6006μs, samples:  4096, min:  5520μs, max: 14020μs, meta:     0μs
generate_cache                 avg:  5970μs, samples:  4096, min:  5497μs, max:  9382μs, meta:     0μs
save_cache                     avg:  5751μs, samples:  4096, min:  5393μs, max:  9273μs, meta:     0μs
faces_merging                  avg:  4972μs, samples:  2144, min:  1849μs, max: 12940μs, meta:     0μs
generate_vertices              avg:  3642μs, samples:  8192, min:   359μs, max: 18732μs, meta:     2μs
faces_occlusion                avg:  2279μs, samples:  8192, min:   300μs, max:  6922μs, meta:     0μs
update_chunk                   avg:   176μs, samples:  4097, min:     5μs, max:   356μs, meta:     0μs
vertices_computation           avg:    17μs, samples:  2144, min:     1μs, max:   190μs, meta:     0μs
merge_faces                    avg:    12μs, samples: 63031, min:     1μs, max:   610μs, meta:   156μs
spawn_chunks_system            avg:     9μs, samples:   237, min:     1μs, max:   816μs, meta:    12μs
update_world_system            avg:     3μs, samples:  1527, min:     1μs, max:   561μs, meta:     1μs
update_chunks_system           avg:     1μs, samples:    24, min:     1μs, max:     6μs, meta:    74μs```
afonsolage commented 2 years ago

Existing cache with chunk size 16x16x128:

generate_vertices              avg: 36803μs, samples:   768, min: 17591μs, max: 72158μs, meta:    12μs
faces_merging                  avg: 21664μs, samples:   963, min: 13169μs, max: 48451μs, meta:     0μs
process_batch                  avg: 21291μs, samples:   512, min: 20568μs, max: 25490μs, meta:   867μs
load_chunk                     avg: 21281μs, samples:   512, min: 20560μs, max: 25478μs, meta:     0μs
load_cache                     avg: 21212μs, samples:   512, min: 20519μs, max: 24404μs, meta:     0μs
faces_occlusion                avg: 14884μs, samples:   963, min:  4065μs, max: 29692μs, meta:     0μs
update_landscape_system        avg:  1314μs, samples:    16, min:   895μs, max:  3540μs, meta:     3μs
update_chunk                   avg:   861μs, samples:   513, min:     1μs, max:  1407μs, meta:     0μs
vertices_computation           avg:    31μs, samples:   963, min:     2μs, max:   179μs, meta:     0μs
merge_faces                    avg:    12μs, samples: 55488, min:     1μs, max:  2952μs, meta:   363μs
spawn_chunks_system            avg:    10μs, samples:    22, min:     1μs, max:    97μs, meta:    16μs
update_world_system            avg:     3μs, samples:   683, min:     1μs, max:    79μs, meta:     2μs
update_chunks_system           avg:     1μs, samples:     1, min:     1μs, max:     1μs, meta:   206μs

No cache with chunk size 16x16x128

process_batch                  avg: 51617μs, samples:   512, min: 48691μs, max: 60692μs, meta:   882μs
load_chunk                     avg: 51606μs, samples:   512, min: 48682μs, max: 60681μs, meta:     0μs
generate_cache                 avg: 51534μs, samples:   512, min: 48631μs, max: 60624μs, meta:     0μs
save_cache                     avg: 50012μs, samples:   512, min: 47893μs, max: 58717μs, meta:     0μs
generate_vertices              avg: 37717μs, samples:   768, min: 17970μs, max: 74091μs, meta:    13μs
faces_merging                  avg: 22191μs, samples:   974, min: 13033μs, max: 49290μs, meta:     0μs
faces_occlusion                avg: 15300μs, samples:   974, min:  4236μs, max: 39427μs, meta:     0μs
update_landscape_system        avg:  1302μs, samples:    15, min:   936μs, max:  1941μs, meta:     3μs
update_chunk                   avg:   876μs, samples:   513, min:    13μs, max:  1407μs, meta:     0μs
vertices_computation           avg:    33μs, samples:   974, min:     2μs, max:   187μs, meta:     0μs
spawn_chunks_system            avg:    12μs, samples:    27, min:     1μs, max:    97μs, meta:    13μs
merge_faces                    avg:    12μs, samples: 57171, min:     1μs, max:  3374μs, meta:   365μs
update_world_system            avg:     2μs, samples:  1620, min:     1μs, max:   102μs, meta:     2μs
update_chunks_system           avg:     1μs, samples:     1, min:     1μs, max:     1μs, meta:   318μs
afonsolage commented 2 years ago

Even tho I was unable to see a performance gain, need to do better benchmarking, the PR is still relevant, since it's easier now to switch between chunk axis sizes.

afonsolage commented 2 years ago

I've made an optimization on chunk cmd queue to remove conflicting commands, based on the following rules:

 1. Skips any duplicated commands (*Load* -> *Load*, *Update* -> *Update*, *Unload* -> *Unload*).
 2. Skips *Load* and remove existing *Unload* cmd when chunk exists already.
 3. Skips *Unload* and remove existing *Load* cmd when chunk doesn't exists already.
 4. Skips *Unload* when chunk doesn't exists already.
 5. Skips *Load* when chunk exists already.
 6. Skips *Update* if the chunk doesn't exists already.
 7. Replaces *Update* by *Unload* if the chunk exists already.
 8. Replaces *Update* by *Load* if the chunk doesn't exists already. [Removed]
 9. Skips *Update* if there is an *Unload* cmd already.

Rule 8 was removed, since it's unnecessary due to Rule 6, but I kept it just to track

I need to do some tests and finish this PR, since it's going out of scope now :sweat_smile: