### 5.5 Practical Buffer Tips

The interplay of usage mode on creation, and locking options when reading / updating is important for performance. Here’s some tips:

1. Aim for the ’perfect’ buffer by creating with HBU_STATIC_WRITE_ONLY, with no shadow buffer, and locking all of it once only with HBL_DISCARD to populate it. Never touch it again.
2. If you need to update a buffer regularly, you will have to compromise. Use HBU_DYNAMIC_WRITE_ONLY when creating (still no shadow buffer), and use HBL_DISCARD to lock the entire buffer, or if you can’t then use HBL_NO_OVERWRITE to lock parts of it.
3. If you really need to read data from the buffer, create it with a shadow buffer. Make sure you use HBL_READ_ONLY when locking for reading because it will avoid the upload normally associated with unlocking the buffer. You can also combine this with either of the 2 previous points, obviously try for static if you can - remember that the _WRITE_ONLY’ part refers to the hardware buffer so can be safely used with a shadow buffer you read from.
4. Split your vertex buffers up if you find that your usage patterns for different elements of the vertex are different. No point having one huge updatable buffer with all the vertex data in it, if all you need to update is the texture coordinates. Split that part out into it’s own buffer and make the rest HBU_STATIC_WRITE_ONLY.