bigdataviewer / bigdataviewer-core

ImgLib2-based viewer for registered SPIM stacks and more
BSD 2-Clause "Simplified" License
33 stars 35 forks source link

Tiled renderer for more efficient rendering of many partially overlapping sources #134

Closed tpietzsch closed 2 years ago

tpietzsch commented 2 years ago

New renderer that splits the target area into tiles, aligned along projected source bounding boxes. Every tile contains only the sources that overlap the tile. This dramatically reduces the number of sources that have to be blended at every output pixel.

Here is rendering 30x30 partially overlapping sources with the current renderer:

https://user-images.githubusercontent.com/622070/165179165-40711122-fb3f-4e6c-923a-3eaf28e635f8.mp4

Here is rendering the same setup with the tiled renderer:

https://user-images.githubusercontent.com/622070/165179194-b3528f79-45ee-4c59-928f-475c161a0b2a.mp4

mkitti commented 2 years ago

Wow, that's a big difference.

tpietzsch commented 2 years ago

Benchmarks:

(Java 8, Macbook Air M1) baseline:

Benchmark                             (numRenderingThreads)  Mode  Cnt    Score    Error  Units
Rendering25SourcesBenchmark.bench                         1  avgt    5  718.141 ± 11.326  ms/op
Rendering25SourcesBenchmark.bench                         8  avgt    5  168.347 ± 24.386  ms/op
RenderingSingleSourceBenchmark.bench                      1  avgt    5   29.832 ±  0.902  ms/op
RenderingSingleSourceBenchmark.bench                      8  avgt    5    6.867 ±  1.168  ms/op
RenderingWithEmptyBenchmark.bench                         1  avgt    5   89.228 ±  1.462  ms/op
RenderingWithEmptyBenchmark.bench                         8  avgt    5   17.614 ±  2.205  ms/op

thousand-sources:

Benchmark                             (numRenderingThreads)  Mode  Cnt   Score   Error  Units
Rendering25SourcesBenchmark.bench                         1  avgt    5  99.976 ± 4.295  ms/op
Rendering25SourcesBenchmark.bench                         8  avgt    5  27.956 ± 1.479  ms/op
RenderingSingleSourceBenchmark.bench                      1  avgt    5  30.953 ± 1.064  ms/op
RenderingSingleSourceBenchmark.bench                      8  avgt    5   7.488 ± 0.563  ms/op
RenderingWithEmptyBenchmark.bench                         1  avgt    5  27.937 ± 1.011  ms/op
RenderingWithEmptyBenchmark.bench                         8  avgt    5   7.518 ± 0.607  ms/op

(Java 11, Macbook Air M1) baseline:

Benchmark                             (numRenderingThreads)  Mode  Cnt    Score    Error  Units
Rendering25SourcesBenchmark.bench                         1  avgt    5  841,733 ± 21,853  ms/op
Rendering25SourcesBenchmark.bench                         8  avgt    5  191,477 ± 10,712  ms/op
RenderingSingleSourceBenchmark.bench                      1  avgt    5   18,659 ±  0,118  ms/op
RenderingSingleSourceBenchmark.bench                      8  avgt    5    7,374 ±  0,398  ms/op
RenderingWithEmptyBenchmark.bench                         1  avgt    5   86,158 ±  0,098  ms/op
RenderingWithEmptyBenchmark.bench                         8  avgt    5   19,520 ±  0,852  ms/op

thousand-sources:

Benchmark                             (numRenderingThreads)  Mode  Cnt    Score   Error  Units
Rendering25SourcesBenchmark.bench                         1  avgt    5  105,908 ± 1,165  ms/op
Rendering25SourcesBenchmark.bench                         8  avgt    5   21,424 ± 0,388  ms/op
RenderingSingleSourceBenchmark.bench                      1  avgt    5   33,123 ± 0,299  ms/op
RenderingSingleSourceBenchmark.bench                      8  avgt    5    8,018 ± 0,076  ms/op
RenderingWithEmptyBenchmark.bench                         1  avgt    5   31,920 ± 0,311  ms/op
RenderingWithEmptyBenchmark.bench                         8  avgt    5    7,286 ± 1,048  ms/op
imagesc-bot commented 2 years ago

This pull request has been mentioned on Image.sc Forum. There might be relevant details there:

https://forum.image.sc/t/new-bigdataviewer-version-10-4-1/68818/1