From 853b8f8963f3697ee7ffc42c5902e993111d0d6e Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 30 Jun 2010 15:20:18 +0000 Subject: [PATCH] - did some profiling of P_InterceptVector. Here's the results I got: * the unaltered floating point version is 10% faster than the 64 bit integer version. * using doubles instead of floats increases performance by another 25%. * another 15% can be gained by manually optimizing the code. - P_InterceptVector now uses the optimized floating point version which is almost twice as fast as the 64bit integer version. SVN r2395 (trunk) --- src/p_maputl.cpp | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/src/p_maputl.cpp b/src/p_maputl.cpp index 14421fc50..f7874c345 100644 --- a/src/p_maputl.cpp +++ b/src/p_maputl.cpp @@ -63,21 +63,20 @@ fixed_t P_AproxDistance (fixed_t dx, fixed_t dy) // P_InterceptVector // // Returns the fractional intercept point along the first divline. -// This is only called by the addthings and addlines traversers. // //========================================================================== fixed_t P_InterceptVector (const divline_t *v2, const divline_t *v1) { -#if 1 // [RH] Use 64 bit ints, so long divlines don't overflow +#if 0 // [RH] Use 64 bit ints, so long divlines don't overflow - SQWORD den = ((SQWORD)v1->dy*v2->dx - (SQWORD)v1->dx*v2->dy) >> FRACBITS; + SQWORD den = ( ((SQWORD)v1->dy*v2->dx - (SQWORD)v1->dx*v2->dy) >> FRACBITS ); if (den == 0) return 0; // parallel SQWORD num = ((SQWORD)(v1->x - v2->x)*v1->dy + (SQWORD)(v2->y - v1->y)*v1->dx); return (fixed_t)(num / den); -#elif 1 // This is the original Doom version +#elif 0 // This is the original Doom version fixed_t frac; fixed_t num; @@ -97,19 +96,24 @@ fixed_t P_InterceptVector (const divline_t *v2, const divline_t *v1) return frac; -#else // UNUSED, float debug. +#else // optimized version of the float debug version. A lot faster on modern systens. - float frac; - float num; - float den; - float v1x = (float)v1->x/FRACUNIT; - float v1y = (float)v1->y/FRACUNIT; - float v1dx = (float)v1->dx/FRACUNIT; - float v1dy = (float)v1->dy/FRACUNIT; - float v2x = (float)v2->x/FRACUNIT; - float v2y = (float)v2->y/FRACUNIT; - float v2dx = (float)v2->dx/FRACUNIT; - float v2dy = (float)v2->dy/FRACUNIT; + + double frac; + double num; + double den; + + // There's no need to divide by FRACUNIT here. + // At the end both num and den will contain a factor + // 1/(FRACUNIT*FRACUNIT) so they'll cancel each other out. + double v1x = (double)v1->x; + double v1y = (double)v1->y; + double v1dx = (double)v1->dx; + double v1dy = (double)v1->dy; + double v2x = (double)v2->x; + double v2y = (double)v2->y; + double v2dx = (double)v2->dx; + double v2dy = (double)v2->dy; den = v1dy*v2dx - v1dx*v2dy; @@ -119,10 +123,11 @@ fixed_t P_InterceptVector (const divline_t *v2, const divline_t *v1) num = (v1x - v2x)*v1dy + (v2y - v1y)*v1dx; frac = num / den; - return frac*FRACUNIT; + return FLOAT2FIXED(frac); #endif } + //========================================================================== // // P_LineOpening