This was accomplished by setting up a "test case" level with nothing but the camera, sky, 4 ground tiles, and 4126 copies of an object model used by a "Building" class. This results in a total of ~100k polygons visible on screen at a time.
The reason for using the "Building" class is because it's representative of typical landscape objects - such as trees, bushes, nonpushable boulders, houses, etc.
Of course I did not test the influence of every possible combination of model properties... that would take far too long.
Instead, what I did was to test the effect of changing only one property at a time.
All testing has been performed first with dgVoodoo enabled, then disabled completely (DLL files renamed).
Of course whether the player actually uses dgVoodoo or not on their Drakan install is something that is completely beyond the map maker's control, but it's still useful to have a reference point to work with here.
First off, a quick summary of the results:
- Baking all materials onto a single larger texture, and readjusting the UVs accordingly, speeds up the rendering by a lot (see note 1 below!);
- Converting triangles to quads causes an appreciable performance improvement;
- Using dgVoodoo results in a considerable performance gain (see note 2 below);
- Having substantial amounts of unreferenced vertices in a model causes a minor amount of slowdown;
- Using 2-sided polygons is somewhat slower than using single-sided polygons (see note 3 below);
- Using transparent textures (alpha) on polygons is much slower (roughly doubles the rendering time), since these polygons need to be re-sorted by proximity on every frame.
- Set up your materials and UV mapping to use the fewest possible materials in your models; ideally only 1 or 2 materials per model;
- Combine/bake textures as required to minimize the amount of distinct materials, as noted above;
- Use quads wherever possible, instead of triangles;
- Keep all polygons single-sided, except for those where it is absolutely unavoidable;
- Minimize the use of polygons with transparent textures on them, where at all possible;
- Delete all unreferenced vertices;
- Last, but not least - remember to delete any polygons which would never be visible to the player in any case - such as the underside of a tree trunk, for example.
Do NOT put any nontransparent materials on an alpha texture, since that causes a serious performance hit!
NOTE 2: dgVoodoo actually causes polygons with transparent textures to be rendered slightly slower instead - however, most of the time, the transparent polygons visible on screen will be no more than about half of all the polygons rendered, so the overall effect is still a net speedup.
Also, Linux users beware: on Linux systems, improperly set up dgVoodoo tends to cause a massive performance penalty instead!
NOTE 3: It seems that the per-polygon rendering time is unaffected by whether the polygons are 1- or 2-sided; however, the engine will render 2-sided polygons regardless of whether they would have been occluded by other polygons from the same model; this then causes slowdown because more polygons have to be rendered than in the 1-sided case.
For reference, here's the raw data:
Reference test case:
8.5FPS (no dgVoodoo)
10.7FPS (with dgVoodoo)
NOTE: using "sort polygons by material" caused no improvement.
The Editor appears to pre-sort the polys at model import time.
2-sided polygons test case:
6.8FPS (no dgVoodoo)
9.9FPS (with dgVoodoo)
Triangles test case:
6.8FPS (no dgVoodoo)
9.4FPS (with dgVoodoo)
Quads test case:
9.7FPS (no dgVoodoo)
11.3FPS (with dgVoodoo)
Combined materials test case (1 texture instead of 4):
10.0FPS (no dgVoodoo)
16.6FPS (with dgVoodoo)
All-alpha test case:
4.3FPS (no dgVoodoo)
3.7FPS (with dgVoodoo)
NOTE: Yes, this was actually SLOWER with dgVoodoo!
Unreferenced vertices test case:
7.8FPS (no dgVoodoo)
9.5FPS (with dgVoodoo)
NOTE: the model had roughly 8x its normal amount of vertices, with the bulk of them being unreferenced by any polygons.