Applications can under-perform for a number of reasons. Optimizing 3D applications is a complex topic with many different techniques that can be used in different circumstances.
Many performance problems can be fixed relatively easily. This chapter lists some examples of this type of problem, and describes techniques to fix them.
Most of these are relatively simple optimization techniques that you can use to improve performance and quality of graphics.
Some optimizations conflict and do not work well if they are used together. For example, if you use depth sorting to reduce overdraw, attempting to also reduce state changes can conflict with this optimization.