The following are some of the important guidelines that you should follow when modeling an object:
Always think about how you spend the polygons. Keep in mind that a smooth silhouette is more important than the high tessellation of a flat surface. Take a look at how the polygons have been spent on the following car model. The flat side panels are very low poly, whereas the parts that form the silhouette, like the fenders, have a lot of segments.
Add edges to retain proper geometry shading in the engine. If necessary, chamfer the edges or add additional edges. By doing this, you can often save normal maps and smoothing groups, especially when using a good spec map. By adding just a few extra edges, the shading on the car on the left looks smoother.
Keep the tesselation in mind. Before exporting, always make sure to manually adjust the tessellation. Every triangle should use the biggest amount of space possible. This helps to keep the shading consistent and the artist can make sure that the tri strips aren't broken. Avoid tri fans.
Use as few shading groups as possible. Adding a new shading group is often just as expensive as chamfering the edges and using only one shading group because the vertices in the different shading groups will be split and effectively doubled in the engine. Additionally, having chamfered edges in the silhouette helps the shading (they create a highlight) and avoids aliasing issues because a chamfered edge doesn't look as harsh as just two faces in different shading groups. Also, it looks more natural because most edges aren't 100% sharp. This needs to be decided on a per asset basis.
Always try to use primitives like boxes, spheres, or capsules for the collision geometry. Even using multiple numbers of these elements is cheaper than an individually-modeled collision proxy. Ensure that you color the collision primitives in the scene, and also think about how many surface types you will need.
Keep in mind that decals will always be projected in both directions. This means that not everything needs to be covered by collision primitives as long as something underneath or on top has a collision primitive. Of course, this applies to only the surfaces that the player can't reach or walk on. Always close the collision proxies and apply a smoothing group to them.
Ensure that you use dummies in when exporting the scene. This helps to keep the file clean and enables other artists to easily work with the file.
Work with layers and follow the naming conventions.
It is essential that you get rid of as much stuff as possible from the LODs. The first LOD should not contain any small details. Transparent objects like glass can be deleted. Retain the silhouette. Try to get rid of some of the material IDs. Compensate for the color change by remapping or by using vertex colors, or even both. The second LOD should not contain any curvature, as long as it's not necessary for the silhouette. Make the most of the surfaces planar and get rid of most of the details in the mesh. The last LOD should be as low as possible. Get rid of everything that is not needed to retain the silhouette. Use only one material ID. Again, compensate by using vertex colors or texture remapping. Reduce the triangle count (by at least 50%) in each LOD.
Spend the polygons in the areas of the mesh that the player can get close to. Neglect the stuff that is farther away. Think about where the asset will be used. If it is a background object, ensure that it is as cheap as possible (lower tris/texture resolution).
Try to match the smoothing groups/material splits/UV borders with each other. Every time material splits/smoothing-group splits/UV border-splits share the same edge, vertices will split only once and the tri count won't be affected as much as it is when having splits in different places.
Again, always use as few smoothing groups/material IDs/UV borders as possible.
Get rid of the backfaces.
Delete polygons that can't be seen by the player.
Combine the meshes into unique meshes. This saves drawcalls.
Texturing and UVWs
The texture size that you should use for an object is related to the amount of space that the object will use on screen. For Crysis, Crytek aimed for a screen resolution of 800 x 600 pixels. Let's assume that the object will fill half the screen's height at all times (600/2 = 300 pixels); therefore, you should use at least a 256 x 256 screen, and 512 x 512 will be even better. The best case scenario will be to have 1 pixel on screen represent one pixel in the texture. Of course, this depends on how big the object is in all the dimensions, as you can't really translate the texture space in 2D directly to the amount of space it will use in 3D.
Try to keep the texel ratios for all objects, constant. This means that every object on screen uses roughly the same amount of texture pixels per meter. By doing this, you will ensure that all the objects have roughly the same sharpness on screen and that the textures don't look muddy.
Objects that are always on screen and at the same distance to the player (for example, weapons) can use a higher texel ratio in areas that are closest to the player (butt-stock, iron-sights, and the like).
Always keep the textures square. Square textures are quicker to process than a texture with a ratio of 2:1. If you have an object that you would usually map with a non-square texture, try to use a square texture and map something that is very likely to be used together with the the object, onto the texture.
Reuse the textures. Always try to keep the textures tileable if you are building an asset that doesn't use a unique unwrap. Also, share textures between objects in the same level.
Use alpha textures, but don't go overboard. The more the space on screen covered by an alpha plane, the more expensive it will be to render. Alpha planes use alpha testing, and thus, require a second drawcall.
Keep the overdraw in mind. It is often better to cut the alpha-mapped polygon plane to match the shape that it represents. This keeps the amount of alpha on screen as low as possible. This also allows you to put more objects on the texture map.
Merge the UVs. Ensure that all the UV vertices that are on top of each other, are merged. This is especially important for the mirrored parts in the mesh. It prevents the splitting of vertices at the UV borders.
Create proper specular maps for the objects, and then store in diffuse alpha and enable the material to use gloss in the diffuse alpha. A good specular map can fake a lot of detail. Sometimes, you don't even need a normal map for the object. Do not just increase the contrast/levels on the diffuse map. This is a waste of memory.
There are some creative ways to create visual variety, while still using tileable textures:
Use vertex colors. It's an easy way to add color variation and shading information to the mesh. Start out with an Ambient Occlusion bake to the vertex colors, and then manually add color.
Before adding another material, consider adding additional vertices to get variance. Use vertex colors to locally add contrast and color information to the tiling textures.
Rely on decals to provide some variance to the textures. Don't apply decals in the Editor; create them in your modeling package by using the floating geometry option and a decal texture. Keep all the decals in one texture so that you don't need additional material IDs. Always combine textures that use alpha, in one sheet.
In some cases, you may want to add additional details to the texture, like an extra trim or a bottom piece to give it some variation. This is usually a good idea, but make sure that the main part of the texture is still tileable in itself. You need to add a few more triangles to the mesh to make the texture tile. Usually, the visual gain is worth it and it gives you a chance to add more variation with vertex colors.
Make the most out of the textures. Do not use an already tiled image as the base. Get as much detail in there as possible, or reduce the texture size.
Use all the available texture space. Don't use black as a background color in the initial texturing phase (also, don't use red ingame because of mipmapping). Black is neutral and it doesn't give you a good idea about how much unused space is left.
Shaders
Memory wise, normal maps are four times as expensive as a simple diffuse or specular map. Therefore, the normal map should always be half the resolution of the diffuse map. Always try to avoid using normal maps by creating good specular maps.
Detailed normal maps are very expensive. Avoid them as much as possible and compensate by using detailed color maps.
Always use the Gloss in Diffuse Alpha shader generation option when the spec map contains no additional color information (grayscale). You can compensate for the loss of color information by using a specular color in the shader. By doing this, you can also save a drawcall.
If possible, use only one environment map for the assets in the same level. This will keep the look consistent and save texture memory.
Avoid expensive shaders. This includes the skin shader, the eye shader, the wet shader, and the frozen shader.
Use alpha testing for transparent objects (for example, vegetation).
Use tinting. This is especially important for objects that get used a lot (certain props like cars, planes, trash bins, and the like). Tinting signifies creating a grayscale texture for the diffuse map and coloring the shader by using the diffuse color attribute in the Material Editor. All the objects/surfaces that should change color need to have the same texture/material ID.
You need to decide in advance which objects will use tinting, and then set them up properly in the modeling package. By doing this, you can save a lot of memory space.
General Notes
Level design should start by building the basic proxy geometry. This can be done by using solids or by creating proxy meshes in your modeling software. Later, all the logic-related entities should be placed. The level then gets forwarded to art.
Levels should typically rely on visblocking/occluding. Therefore, levels should be fairly small, with a low view distance and as few objects as possible on screen. The player should always be able to see only one action bubble, including the transition zones.
If the game design needs more action bubbles to be visible on the screen at a time, balance the level complexity and the prop complexity. For this, artists need to know in which context their objects will be used (small, closed-off environment; large, outdoor area; several objects on screen; amount of AI/NPCs on screen).