Ignore:
Timestamp:
Dec 5, 2011, 9:24:01 AM (9 years ago)
Author:
sam
Message:

test: unroll the Mandelbrot loop to gain a few milliseconds per frame, and
increase the maximum iteration count to 340.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/test/tutorial/tut03.cpp

    r1102 r1104  
    354354        {
    355355            f64cmplx z0 = m_center + TexelToWorldOffset(ivec2(i, j));
    356             f64cmplx r0 = z0;
     356            f64cmplx z1, z2, z3, r0 = z0;
    357357            //f64cmplx r0(0.28693186889504513, 0.014286693904085048);
    358358            //f64cmplx r0(0.001643721971153, 0.822467633298876);
     
    360360            //f64cmplx r0(-0.79192956889854, -0.14632423080102);
    361361            //f64cmplx r0(0.3245046418497685, 0.04855101129280834);
    362             f64cmplx z;
    363             int iter = MAX_ITERATIONS;
    364             for (z = z0; iter && z.sqlen() < maxsqlen; z = z * z + r0)
    365                 --iter;
     362            int iter = MAX_ITERATIONS - 4;
     363            for (;;)
     364            {
     365                /* Unroll the loop: tests are more expensive to do at each
     366                 * iteration than the few extra multiplications. */
     367                z1 = z0 * z0 + r0;
     368                z2 = z1 * z1 + r0;
     369                z3 = z2 * z2 + r0;
     370                z0 = z3 * z3 + r0;
     371                if (z0.sqlen() >= maxsqlen)
     372                    break;
     373                iter -= 4;
     374                if (iter < 4)
     375                    break;
     376            }
    366377
    367378            if (iter)
    368379            {
    369                 double f = iter;
    370                 double n = z.sqlen();
     380                double n = z0.sqlen();
     381
     382                if (z1.sqlen() >= maxsqlen) { iter += 3; n = z1.sqlen(); }
     383                else if (z2.sqlen() >= maxsqlen) { iter += 2; n = z2.sqlen(); }
     384                else if (z3.sqlen() >= maxsqlen) { iter += 1; n = z3.sqlen(); }
     385
    371386                if (n > maxsqlen * maxsqlen)
    372387                    n = maxsqlen * maxsqlen;
    373388
    374389                /* Approximate log(sqrt(n))/log(sqrt(maxsqlen)) */
     390                double f = iter;
    375391                union { double n; uint64_t x; } u = { n };
    376392                double k = (u.x >> 42) - (((1 << 10) - 1) << 10);
Note: See TracChangeset for help on using the changeset viewer.