BillboardGuis update 1 frame later.

Bug is simple - Billboards update 1 frame late. This’s the most noticeable with their rotation:


Same thing applies to Viewport frames, what I think is worth noting. Maybe, this bug is deep, but I’m unsure, cause I can replicate it only with this 2 instances, other ones can’t be measured that easilly.

To reproduce that, you can just join empty baseplate with BubbleChat toggled on, and do similar thing - cuz it uses Billboards, you will see the same problem.
EDIT: maybe it’s due to how I scripted camera. Reproduction file with that here: BillboardGuiRepro.rbxl (150.8 KB)

Device information:
CPU: Intel(R) Core*TM) i5-2410M CPU @ 2.30GHz
1 socket
2 cores
4 logical processors

GPU: NVIDIA GeForce GT 520M

Expected behavior

I expect all GUI objects to update when needed, not 1 frame later

1 Like

Please provide your hardware info. I haven’t been able to replicate this, and I would assume the same for the engineers.

1 Like

I tried reproducing this by placing a BillboardGui inside of the character’s Head, and then adding a TextLabel to make it visible. Then I rotated the camera like is shown in the video. I was unable to reproduce the bug in Studio. I tested both AlwaysOnTop=false and =true. I also tried the suggested steps of using Bubble Chat and was also unable to reproduce it. I tried with both my monitor’s native refresh rate as well as with artificially capping to 10 fps.

Do you have any more information or rbxm/rbxl files that would help reproduce this? For example, does your experience have a custom camera script?

Indeed, it has. I’ll try to make replication place file for that and send it here.
EDIT: that’s repro file.
BillboardGuiRepro.rbxl (150.8 KB)
@Tiffblocks

Could you elaborate more on what modification your customization for the camera script? If you happen to change timings for signal connections, add extra processing for camera relates to keybindings/input, it could theoretically defer the impact of that after we fetch the cframe for rendering UI as your place is configured as Deferred signal behavior. You could use Immediate and it would update as normal.

I have rewrote camera script from the ground, and it uses NOTHING default scripts have. Most important changes, which can matter:

  1. Camera is updated on RenderStepped, but changing that to PreRender, for example, changes nothing.
  2. Camera is instant - no any lerps, tweens and such.
  3. Mouse input handled a bit diffirently:
self.ConnectedFunctions.CameraRotationStart = Mouse.Button2Down:Connect(function()
	if not self.ConnectedFunctions.CameraRotation then
		local Screen = self.Camera.ViewportSize
		self.ConnectedFunctions.CameraRotation = Mouse.Move:Connect(function()
			local Current = UserInputService:GetMouseDelta()
			local RotationY = -Current.X / Screen.X * math.pi * 4
			local RotationX = Current.Y / Screen.Y * math.pi * 2
			self:Rotate(RotationX, RotationY, 0)
		end)
	end
end)

Idk if all my other calculations matter here, I tried to make camera as simple and functional as I was able.

Yes, that works. But why Deffered not works as intented in this case?