pixelfaucet/spec/streaming_texture.cr

59 lines
1.6 KiB
Crystal

require "../src/lib_sdl"
require "../src/pixel"
FPS_INTERVAL = 1.0
width = 400
height = 300
scale = 1
fps_lasttime : Float64 = Time.monotonic.total_milliseconds # the last recorded time.
fps_current : UInt32 = 0 # the current FPS.
fps_frames : UInt32 = 0 # frames passed since the last recorded fps.
last_time : Float64 = Time.monotonic.total_milliseconds
begin
SDL.init(SDL::Init::VIDEO)
window = SDL::Window.new("test", width * scale, height * scale, flags: SDL::Window::Flags::SHOWN)
renderer = SDL::Renderer.new(window, flags: SDL::Renderer::Flags::ACCELERATED)
raw_texture = LibSDL.create_texture(renderer, LibSDL::PixelFormatEnum::RGBA8888, LibSDL::TextureAccess::STREAMING, width, height)
texture = SDL::Texture.new(raw_texture)
fps_frames = 0
loop do
case event = SDL::Event.poll
when SDL::Event::Quit
break
end
et = Time.monotonic.total_milliseconds
fps_frames += 1
if fps_lasttime < et - FPS_INTERVAL * 1000
fps_lasttime = et
fps_current = fps_frames
fps_frames = 0
puts String.build { |io| io << fps_current << " fps" }
end
last_time = et
pitch = uninitialized Int32
pixels_pointer = uninitialized Void*
LibSDL.lock_texture(texture, nil, pointerof(pixels_pointer), pointerof(pitch))
pixels = Slice.new(Pointer(UInt32).new(pixels_pointer.address), width * height)
0.upto(pixels.size - 1) do |n|
pixels[n] = PF::Pixel.random.to_u32
end
LibSDL.unlock_texture(texture)
renderer.copy(texture)
renderer.present
end
ensure
SDL.quit
end