I feel it should be emphasised this answer is quite unpractical and probably a mess.
Note that the FrontEnd displays boxes. So to tell the FrontEnd to draw a Graphics[{Disk[]}] is less direct than to tell it to draw a GraphicsBox[DiskBox[{0, 0}]]. Furthermore, it may be the case that if a box is not changed, it will not have to be redrawn. Even unchanged elements of a GraphicsBox may not have to be redrawn, but loaded from a cache instead. Lastly, it is probably more efficient to render a RasterBox (Image) than other boxes. Despite all this, the code I present here is quite slow, but keep in mind that I draw proper Disks and only one at a time.
Anyway, what the code does is overlay a dynamically generated graphic over another dynamic graphic, which is a raster. The idea is that we periodically put all points/disks into a rasterized graphic and display new points on top of that raster. I have used MousePosition[], as the setting I was thinking of was games, like the game by Michael Hale. In case you want to use MousePosition[], it is not possible to use something like ListAnimate, as you want to generate new graphics on the fly (and also you don't care about old graphics).
Initialisations
kk = 20;
size = 360;
diskSize = 2;
Unevaluated[
setGBBAndGB :=
({graphicsBuffer, graphicsBufferBoxes} =
Transpose[{Disk[#, diskSize], DiskBox[#, diskSize]} & /@
RandomReal[{diskSize, size - diskSize}, {kk, 2}]]);
] /. Join[OwnValues[diskSize], OwnValues[size], OwnValues[kk]]
expandRaster := (raster =
Rasterize[Graphics[{First@raster, Black, graphicsBuffer},
PlotRange -> {{0, size}, {0, size}}],
RasterSize -> {rasterSize, rasterSize}])
jj = 1;
ii = 1;
setGBBAndGB; ;
yMax = 880;
offset = 20;
delay = 2;
rasterSize = 360;
raster = Rasterize[
Graphics[{White, Rectangle[{0, 0}, {size, size}]}],
RasterSize -> {rasterSize, rasterSize}]; ;
Boxes
With[{Yellow = Yellow,
rasterBoxes = rasterPrimitiveToBoxes@First@raster, Red = Red,
tenK = 10*kk, size = size, delay = delay, quot = quot},
Cell[
BoxData@
GraphicsBox[{
DynamicBox[
ToBoxes@raster // First
]
,
DynamicBox[
graphicsBufferBoxes[[;; ii]]
]
,
Yellow
,
DynamicBox[
If[jj == 0,
If[
ii == kk - 1
,
expandRaster;
setGBBAndGB
];
ii = Mod[ii + 1, kk]
];
jj = Mod[jj + 1, delay];
RectangleBox @@ (Function[
Function[{#, # + offset}]@{#1/4, (yMax - #2)/3}] @@
MousePosition[])
]
}
,
PlotRange -> {{0, size}, {0, size}}
]
,
"Input"
]
] // CellPrint

Where the code comes from
I evaluated expressions like this
GraphicsRow[{img, Graphics[{Yellow, Disk[{0, 0}, 1]}]},
Spacings -> Scaled[-1.5]]
and fiddled around with the "cell expression" of the result, or the result of calling ToBoxes on this kind of expression.
More about the code
You can see that the rasterisation takes a significant portion of the time, as "Dynamic" lags when rasterisation is being done. You can make everything more smooth by increasing delay.
An improvement would be to use a separate kernel to do the rasterisation. Another improvement might be to rasterise to an image and use an OverlayBox, rather than putting everything into one GraphicsBox.
Dynamicdoes seem to go blindly through all display related elements that are wrapped by it. So I would use something likeListAnimatewith prerendered graphics to achieve similar effects. But even then, rasterization is probably best. – Jens Apr 24 '14 at 22:51Dynamicis not a good substituteListAnimate. – m_goldberg Apr 25 '14 at 09:39ListAnimateis ok but when you want to easily recalculate whole set and interrupt the animation to start it with the new one it will glitch. In the approach above withDynamicit will transition smoothly as there is no pre-processing. – Kuba Apr 25 '14 at 09:46