Ever since the first Filter Forge release 10 years ago we have been reprimanded for slow rendering. Unfortunately our renderer architecture is not very suitable for speed improvements – this is a downside of storing filters in an open XML format that allows every user to look at the internals of a filter and quickly modify it for their purpose. Well, things have improved a bit.
In Filter Forge 7 we overhauled the renderer, particularly the logic of sampling and sample caches. Our original sample cache architecture didn’t take into account cases where a single component was used in multiple filter subtrees: every time the sample function of a component was called from a different subtree, the cache was invalidated. Filter Forge 7 takes a different approach: all samples are preserved in separate bins, which eliminates the need to re-calculate the sample which has been already requested before.
The obvious benefit of the new sample cache architecture is increased rendering speed for most filters. In quite a few lucky cases the improvement is in double digits. Here are our benchmark results:
3000x3000 px | 6.0 | 7.0 | Improvement |
![]() |
59 s | 34 s | 42,4% |
![]() |
1383 s | 673 s | 51,3% |
![]() |
298 s | 162 s | 45,6% |
![]() |
166 s | 136 s | 18,1% |
![]() |
1326 s | 750 s | 43,4% |
![]() |
2558 s | 1856 s | 27,4% |
![]() |
3701 s | 1944 s | 47,5% |
![]() |
54 s | 34 s | 37% |
– Wait, my favorite filter doesn’t show any improvement!
This means your filter was already optimized. Our new algorithm can only speed things up if a filter uses sample cache ineffectively. You can console yourself by thinking that the filter author maxed out filter performance long before we implemented it in Filter Forge.