From: Enne W. <enn...@gm...> - 2010-01-30 06:11:37
|
Hi- I'm forwarding this discussion between jpeg and me about tiles performance, as I've had a lot of folks asking me via email or IRC about it. I figure it's something that probably needs to be aired more publicly for anybody who wants more information. Sorry for the length. :) 2010/1/29 Johanna Ploog <jp...@ze...>: > Hi Enne, > > with interest and trepidation I read the recent rgrd discussion about the > speed of rendering: > > http://groups.google.com/group/rec.games.roguelike.development/browse_thread/thread/f1fdc5c3cd32788c/e52ffe5e63bcb01e It's my opinion that deltas don't really make sense for Crawl. For view-locked players, every time you move, you have to redraw almost the entire screen. Deltas make a lot more sense for something like Nethack, where the entire map can fit on screen at once, so it doesn't have to scroll. In Crawl, we certainly can't fit an entire 80x70 map on screen at once. Additionally, redrawing the entire screen every frame should not be slow! > Embarassingly enough, Crawl was cited repeatedly as an example how > rendering can go terribly wrong and cause massive lags. (Ah, Krice.) Crawl's performance issues in tiles are _entirely_ related to whether or not OpenGL is hardware accelerated. If there's a poor driver (on Windows), or a software driver (e.g. Mesa), or doesn't have DRI set up (on Linux), then Crawl will not run well. I've seen Crawl run well on enough older machines that I am confident that Crawl code is not doing something horribly wrong. There's no doubt that it could be improved, but not by the amount it would need to fix turns that take half a second. There are some options for improving Crawl's performance in tiles, but they all have trade-offs: 1) Go back to doing the rendering ourselves, like in 0.4. The biggest problem with this is that all the tiles rendering code would have to be refactored again. This would be a pretty large undertaking, probably on par with the work I did in 0.5 to add SDL in the first place. Additionally, one of the reasons 0.4 could do software rendering was because all the images were using 256 color palettes. (The importance of this is that each pixel in an image only took up a single byte, versus the 4 bytes needed for the full RGBA images now.) Using images that are 4 times as big means that drawing all of those images would be 4 times as slow in software. Worse, most of the new tile art in 0.5 doesn't use this old palette, so if we were going to go back, we'd have to throw out a ton of new art. 2) Try to improve Crawl's performance under software OpenGL. For what it's worth, I spent most of last weekend trying to do this, but no changes I made had any significant measurable effect. My opinion is that getting performance significantly up would require as much refactoring as #1, above. Even then, it might not work. 3) Try to use SDL's 2D rendering instead of OpenGL. This has a lot of the same problems as #1 above, because SDL provides a lot of the graphics code for us. Unfortunately, I've heard complaints about similar issues to the ones we've heard about OpenGL, where it just doesn't run fast under certain environments. Also, it's my intuition that SDL's 2D functions would not be much different than software OpenGL drivers. (SDL's 2D functions might perform better on Windows, but only because they're hardware accelerated there. But #4 below is a better option for Windows.) 4) Add DirectX for an alternative to OpenGL. DirectX is extremely similar to OpenGL in terms of its API, but it has infinitely better driver support on Windows (thanks, Microsoft!). If we abstracted out the graphics a little bit (much, much less than #1 above), then we could fairly easily support DirectX as an alternative to OpenGL. Windows players would then have good performance in almost all cases. Linux players would still be out of luck. (OS X players likely have good OpenGL support, so don't have this problem.) Given all of that, my opinion is that #4 is the only option worth implementing. It's also the only option that is easy enough that there's a chance I could get it done this release. Personally, I don't think it's worth trying to "undo" the changes to tiles that happened in 0.5. I think the tiles version post-0.4 has gotten so many great new features and usability improvements that would be sad to throw away. Unfortunately, this means that Crawl will never run well under software OpenGL drivers without drastic changes. It's sad that this will leave out some players who want to use the tiles version, but I think that's just the choice we have to make. (If anybody has any better suggestions, I'm open to hearing them!) -Enne |