
# Incremental rendering

Incremental rendering works with the help of the *mtime* column
on the minetest database.

Every insert or update changes the *mtime* column to the current timestamp (with the help of triggers).
This way changes to the blocks can be detected by remembering the mtime of the
last query.


## Table *blocks* (minetest db)

posx	| posy	| posz	| data	| mtime
---	| ---	| ---	| ---	| ---
10	| 11	| 12	| ABC	| 1552977950000
20      | 21    | 22    | 123   | 1552977950010
30      | 31    | 32    | XYZ   | **1552977950020**
40      | 41    | 42    | A12   | 1552977950030
50      | 51    | 52    | B34   | 1552977950040

## Table *settings* (mapserver db)

key		| value
---		| ---
last\_mtime	| **1552977950020**

## Query example

The following query will return all changed blocks since the last call:

```sql
select posx,posy,posz,data,mtime
from blocks b
where b.mtime > 1552977950020
order by b.mtime asc
limit 1000

```

Additionally it will limit the returned rows so the mapserver can be started and stopped at any time
without processing all new data at once.

After that query the highest *mtime* is stored again in the mapserver database.

## Schedule

Incremental rendering is executed periodically:

* Without pause between calls if there is more data available (catch-up after mapserver downtime)
* With a 5 second pause between calls if there is no new data

## About realtime

Of course there are delays between placing/removing blocks and the tiles on the mapserver.
The minetest setting **server\_map\_save\_interval** is responsible for the delay to the mapserver (defaults to 5.3 seconds)
Don't try to decrease this value too much on your minetest instance, it has a performance impact!

