Memoize the return value of characterVisiblePositions to a new, semi-abstracted "memo" field on the GameState, recalcuclated if the character position ever changes. I'm 90% sure that the perf issues we were encountering were actually caused by characterVisiblePositions getting called once for *every tile* on draw, but this slightly larger change also makes the game perform relatively-usably again. Since this is only recalculated if the character position changes, if we ever get non-transparent entities moving around without the characters influence (maybe something building or knocking down walls?) we'll have an issue there where the vision won't be updated as a result of those changes if they happen while the character is taking a non-moving action - but we can cross that bridge when we come to it. Change-Id: I3fc745ddf0014d6f164f735ad7e5080da779b92a Reviewed-on: https://cl.tvl.fyi/c/depot/+/3185 Reviewed-by: grfn <grfn@gws.fyi> Tested-by: BuildkiteCI
		
			
				
	
	
		
			19 lines
		
	
	
	
		
			706 B
		
	
	
	
		
			Haskell
		
	
	
	
	
	
			
		
		
	
	
			19 lines
		
	
	
	
		
			706 B
		
	
	
	
		
			Haskell
		
	
	
	
	
	
| --------------------------------------------------------------------------------
 | |
| module Xanthous.Data.MemoSpec (main, test) where
 | |
| --------------------------------------------------------------------------------
 | |
| import Test.Prelude
 | |
| import Test.QuickCheck.Instances.Text ()
 | |
| --------------------------------------------------------------------------------
 | |
| import Xanthous.Data.Memo
 | |
| --------------------------------------------------------------------------------
 | |
| 
 | |
| main :: IO ()
 | |
| main = defaultMain test
 | |
| 
 | |
| test :: TestTree
 | |
| test = testGroup "Xanthous.Data.MemoSpec"
 | |
|   [ testGroup "getMemoized"
 | |
|     [ testProperty "when key matches" $ \k v ->
 | |
|         getMemoized @Int @Int k (memoizeWith k v) === Just v
 | |
|     ]
 | |
|   ]
 |