Question: Fairly ignorant about efficient animation, so all help appreciated! I'm using libgdx in java, and have 128px water tiles in my game that need to be animated. I currently am using 19 frames for the animation, but I have changed that number from 2-19 and I'm going from over 60fps (capped at 60) to 20fps. 

The only thing I could think of was the repeated calls to getting the right texture, because I'm using a reasonably powerful graphics card that's handled java games with more animations very easily. How do I increase performance here?

Cheers

Answer: 
Use a profiler to find out where the time is being spent. You can either use a profiling tool, or just litter your code with timestamp (I used java.lang.System.nanotime()) checks, and keep a histogram to print regularly or print "outliers" or even draw the results on screen.

While you or I may be able to guess where the time is going, having tools to help you actually find out where the time is being spent is much more productive.
The answer to use a profiler is good advice. However, if you are not already packing your textures then it is a good idea to do so, as that will reduce the number of textures that are in use, which in turn will reduce the number of (relatively expensive) texture switches. Given that you have square textures you could just tile them.

That leaves the question about how large a texture can be. This is device dependent, and is discussed [here](https://stackoverflow.com/questions/8573178/limitation-on-texture-size-android-open-gl-es-2-0) for Android devices.

Even packing a relatively small number of textures into a single texture will still reduce the number of texture switches. For example, a texture size limit of 1024px x 1024px would allow you to pack 64 128x128 textures. This would accommodate your requirement for 19 textures without the need for a texture switch. 
Similarly, a texture size limit of 512px x 512px would allow you to pack 16 128x128 textures, so only one texture switch would be required.