Roblox backend: clear/upload only each tile's dirty region; scroll benchmark in t_drag, scrolling in t_composite
This commit is contained in:
@@ -111,7 +111,12 @@ local AssetService = {}
|
||||
function AssetService:CreateEditableImage(opts)
|
||||
local img = { Size = opts.Size, Pixels = buffer.create(opts.Size.X * opts.Size.Y * 4) }
|
||||
UPLOADS = 0
|
||||
function img:WritePixelsBuffer(origin, size, buf) buffer.copy(img.Pixels, 0, buf); _G_UPLOADS = (_G_UPLOADS or 0) + 1 end
|
||||
function img:WritePixelsBuffer(origin, size, buf)
|
||||
assert(buffer.len(buf) == size.X * size.Y * 4, "WritePixelsBuffer: buffer size mismatch")
|
||||
assert(origin.X >= 0 and origin.Y >= 0 and origin.X + size.X <= opts.Size.X and origin.Y + size.Y <= opts.Size.Y, "WritePixelsBuffer: out of bounds")
|
||||
for y = 0, size.Y - 1 do buffer.copy(img.Pixels, ((origin.Y + y) * opts.Size.X + origin.X) * 4, buf, y * size.X * 4, size.X * 4) end
|
||||
_G_UPLOADS = (_G_UPLOADS or 0) + 1; _G_UPLOAD_PX = (_G_UPLOAD_PX or 0) + size.X * size.Y
|
||||
end
|
||||
function img:Destroy() end
|
||||
return img
|
||||
end
|
||||
@@ -223,4 +228,4 @@ for frame = 1, NFRAMES do
|
||||
|
||||
if frame == 10 then render_time = 0; _G_UPLOADS = 0 end
|
||||
end
|
||||
print(string.format("avg frame total %.2f ms, of which render %.2f ms, uploads/frame %.2f", total / (NFRAMES - 10) * 1000, render_time / (NFRAMES - 10) * 1000, _G_UPLOADS / (NFRAMES - 10)))
|
||||
print(string.format("avg frame total %.2f ms, of which render %.2f ms, uploads/frame %.2f, upload KB/frame %.0f", total / (NFRAMES - 10) * 1000, render_time / (NFRAMES - 10) * 1000, _G_UPLOADS / (NFRAMES - 10), (_G_UPLOAD_PX or 0) * 4 / 1024 / (NFRAMES - 10)))
|
||||
|
||||
@@ -56,6 +56,8 @@ game:GetService("RunService").Stepped:Connect(function()
|
||||
G.ImGui_ImplRoblox.NewFrame()
|
||||
io.DeltaTime = 1 / 60
|
||||
io:AddMousePosEvent(300 + (frame * 37) % 300, 100 + (frame * 53) % 500)
|
||||
local dw = ImGui.FindWindowByName("ImGui Sincerely Demo")
|
||||
if dw and frame % 3 == 0 then io:AddMousePosEvent(dw.Pos.x + 200, dw.Pos.y + 300); io:AddMouseWheelEvent(0, (frame % 30 < 18) and -1 or 1) end
|
||||
ImGui.NewFrame()
|
||||
ImGui.ShowDemoWindow(true)
|
||||
ImGui.SetNextWindowPos(ImVec2(20, 20)); ImGui.SetNextWindowSize(ImVec2(600, 700))
|
||||
|
||||
@@ -9,7 +9,7 @@ local io = ImGui.GetIO()
|
||||
local col = ImVec4(0.4, 0.7, 0.2, 0.5)
|
||||
local frame = 0
|
||||
local bx, by = 0, 0
|
||||
local MODE = ARG_OPEN == true and "picker" or "drag"
|
||||
local MODE = ARG_OPEN == true and "picker" or (type(ARG_OPEN) == "table" and "scroll" or "drag")
|
||||
game:GetService("RunService").Stepped:Connect(function()
|
||||
frame += 1
|
||||
G.ImGui_ImplRoblox.NewFrame()
|
||||
@@ -18,12 +18,15 @@ game:GetService("RunService").Stepped:Connect(function()
|
||||
local t = math.abs((frame % 200) - 100) -- triangle wave, smooth back and forth
|
||||
if frame == 5 then local w = ImGui.FindWindowByName("ImGui Sincerely Demo"); bx, by = w.Pos.x + 80, w.Pos.y + 8; io:AddMousePosEvent(bx, by) elseif frame == 6 then io:AddMouseButtonEvent(0, true)
|
||||
elseif frame > 6 then io:AddMousePosEvent(bx - t * 5, by + t * 2) end
|
||||
elseif MODE == "scroll" then
|
||||
local w = ImGui.FindWindowByName("ImGui Sincerely Demo"); if w then io:AddMousePosEvent(w.Pos.x + w.Size.x * 0.5, w.Pos.y + w.Size.y * 0.5) end
|
||||
io:AddMouseWheelEvent(0, (frame % 20 < 10) and -1 or 1)
|
||||
else
|
||||
io:AddMousePosEvent(60 + (frame * 7) % 200, 80 + (frame * 5) % 200)
|
||||
if frame == 6 then io:AddMouseButtonEvent(0, true) end
|
||||
end
|
||||
ImGui.NewFrame()
|
||||
if MODE == "drag" then
|
||||
if MODE ~= "picker" then
|
||||
if frame < 3 then ImGui.SetNextWindowPos(ImVec2(20, 20)); ImGui.SetNextWindowSize(ImVec2(500, 650)) end
|
||||
ImGui.ShowDemoWindow(true)
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user