I created a raycasting engine using pure Gosu. I originally had it in Ruby but the setPixel calls required to do floor and ceiling were much too slow, so it's in C++. Maybe when I have time again, I'll write bindings.
In Action: https://www.youtube.com/watch?v=DfSvatZGd-s
Don't judge, I slapped the art together fast in Gimp to get the point across. ;D
Here's the code:https://github.com/JosephAustin/GosuRaycast
:) Hope someone has some fun with it.
Cool stuff! I like your fearless use of calling
just to create temporary image slices! I've never thought about that before, but performance-wise that's perfectly fine.
Are you aware of this ancient Ruby/Gosu raycaster? https://github.com/zenkalia/rubystein
It was originally written by the Phusion team as a parody of the Rails dev world (lots of in-jokes). To avoid
they used the Wolf3D approach to draw vertical lines. So not W*H setPixel() calls, but W Image#draw calls.
I guess the next step would be a voxel engine :P
I didn't see that, actually! I would have probably referenced that instead. Either way, it was a fun thing to do and learn from. And I'm happy with my use of lambdas - if that were wrapped correctly for ruby you could use a block. Keeps the engine from caring about map formats!
.subimage() worked a heck of a lot faster than I expected it to. It appears to be a direct reference somehow, instead of a copy. As for .setPixel(), it's definitely a LOT faster in c++ than ruby. That's due to the sheer number of calls you have to do, I suspect, which have to 'cross the bridge' between the languages. Even 640x480 would be up to 300k calls, but it seems to be no problem when its done directly. I'm easily holding 60 fps at those kinds of resolutions.
only uses one or two object allocations, and yes, it only references the texture data.
Looking at the C++ source again, I think that you also render walls line by line, right (vertically)? Then Rubystein probably uses the same logic as your raycaster, except they didn't even bother colouring the floor and ceiling - that's why it's fast enough in Ruby.
The old Gosu Showcase board has a screenshot: https://www.libgosu.org/cgi-bin/mwf/topic_show.pl?pid=557
I don't think that the interop between Ruby and C++ is the issue, after all many core Ruby methods (
etc.) are written in C. It's probably the loop itself that's excruciatingly slow in Ruby.
Oh, I see. Yes, I do it with lines. The floor/ceiling has to be drawn pixel by pixel. Wolfenstein didn't bother with that. That was more something doom did, but the lessons I referenced showed how it works so I went ahead and applied it.
My demo doesn't really show it off, but you can have multiple floor tiles and ceiling tiles, and can even have 'holes' in either. I started to take it further with pits and such, but that required rendering more walls above or below the current ones, which had a lot of speed problems.
It was fun to do :) Maybe i'll make a game in it sometime for the heck of it.
Powered by mwForum 2.29.7 © 1999-2015 Markus Wichitill