add limit fps constraints

This commit is contained in:
2025-09-09 14:44:48 +05:30
parent 66f7d9d7b9
commit 044af6d62d
3 changed files with 47 additions and 27 deletions

View File

@@ -32,7 +32,7 @@ const GlobalProperties: React.FC = () => {
const { azimuth, setAzimuth } = useAzimuth();
const { renderDistance, setRenderDistance } = useRenderDistance();
const { setPlaneValue, setGridValue, planeValue, gridValue } = useTileDistance();
const { fps, setFps } = useSceneStore();
const { fps, setFps, limitFps, setLimitFps } = useSceneStore();
const { socket } = useSocketStore();
const { limitDistance, setLimitDistance } = useLimitDistance();
const [distance, setDistance] = useState<number>(40);
@@ -65,6 +65,17 @@ const GlobalProperties: React.FC = () => {
setRenderDistance(value);
}
const limitFpsToggle = async () => {
if (!projectId) return;
if (limitFps) {
// update backend
setFps(60);
} else {
// update backend
}
setLimitFps(!limitFps);
};
function updateFps(value: number) {
setFps(value);
}
@@ -161,14 +172,7 @@ const GlobalProperties: React.FC = () => {
<div className="split"></div>
<InputToggle
inputKey="4"
label="Limit Render Distance"
value={limitDistance}
onClick={async () => {
await limitRenderDistance(); // Call the function here
}}
/>
<InputToggle inputKey="4" label="Limit Render Distance" value={limitDistance} onClick={limitRenderDistance} />
<InputRange
label="Distance"
disabled={!limitDistance}
@@ -182,14 +186,16 @@ const GlobalProperties: React.FC = () => {
<div className="split"></div>
<InputToggle inputKey="7" label="Limit Fps" value={limitFps} onClick={limitFpsToggle} />
<InputRange
label="Fps"
disabled={!limitFps}
value={fps}
min={CONSTANTS.sceneConfig.minFps}
max={CONSTANTS.sceneConfig.maxFps}
onChange={(value: number) => updateFps(value)}
onPointerUp={() => {}}
key={"5"}
key={"8"}
/>
</section>
</div>

View File

@@ -4,31 +4,36 @@ import { useSceneStore } from "../../../store/scene/useSceneStore";
function FPSLimiter() {
const { advance, set, frameloop } = useThree();
const { fps } = useSceneStore();
const { fps, limitFps } = useSceneStore();
useLayoutEffect(() => {
let then = 0;
let raf: number;
const interval = 1000 / fps;
function tick(t: number) {
raf = requestAnimationFrame(tick);
const elapsed = t - then;
if (limitFps) {
const interval = 1000 / fps;
if (elapsed > interval) {
advance(t, true);
then = t - (elapsed % interval);
function tick(t: number) {
raf = requestAnimationFrame(tick);
const elapsed = t - then;
if (elapsed > interval) {
advance(t, true);
then = t - (elapsed % interval);
}
}
set({ frameloop: "never" });
raf = requestAnimationFrame(tick);
return () => {
cancelAnimationFrame(raf);
set({ frameloop });
};
} else {
set({ frameloop: "always" });
}
set({ frameloop: "never" });
raf = requestAnimationFrame(tick);
return () => {
cancelAnimationFrame(raf);
set({ frameloop });
};
}, [fps, advance, set, frameloop]);
}, [fps, limitFps, advance, set, frameloop]);
return null;
}

View File

@@ -3,24 +3,33 @@ import { immer } from "zustand/middleware/immer";
import * as THREE from "three";
type SceneStore = {
limitFps: boolean;
fps: number;
camState: {
position: THREE.Vector3;
target: THREE.Vector3;
};
setLimitFps: (limitFps: boolean) => void;
setFps: (fps: number) => void;
setCamera: (pos: THREE.Vector3, target: THREE.Vector3) => void;
};
export const useSceneStore = create<SceneStore>()(
immer((set) => ({
limitFps: false,
fps: 60,
camState: {
position: new THREE.Vector3(0, 5, 10),
target: new THREE.Vector3(0, 0, 0),
},
setLimitFps: (limitFps) => {
set((state) => {
state.limitFps = limitFps;
});
},
setFps: (fps) => {
set((state) => {
state.fps = fps;