Perf. fix

This commit is contained in:
2025-11-22 02:58:54 +01:00
parent 097df1f5de
commit 474ddd3e27

View File

@@ -6,7 +6,7 @@
<div class="flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 sm:gap-0"> <div class="flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 sm:gap-0">
<div class="flex flex-col sm:flex-row items-start sm:items-center gap-3 sm:gap-4 w-full sm:w-auto"> <div class="flex flex-col sm:flex-row items-start sm:items-center gap-3 sm:gap-4 w-full sm:w-auto">
<div class="flex items-center"> <div class="flex items-center">
<input id="pixel-perfect" type="checkbox" v-model="settingsStore.pixelPerfect" class="mr-2 w-4 h-4" @change="drawCanvas" /> <input id="pixel-perfect" type="checkbox" v-model="settingsStore.pixelPerfect" class="mr-2 w-4 h-4" @change="requestDraw" />
<label for="pixel-perfect" class="dark:text-gray-200 text-sm sm:text-base">Pixel perfect rendering</label> <label for="pixel-perfect" class="dark:text-gray-200 text-sm sm:text-base">Pixel perfect rendering</label>
</div> </div>
<div class="flex items-center"> <div class="flex items-center">
@@ -130,6 +130,17 @@
const canvasRef = ref<HTMLCanvasElement | null>(null); const canvasRef = ref<HTMLCanvasElement | null>(null);
// rAF-based draw scheduler to coalesce multiple draw requests into a single frame
// Define before usage to avoid TDZ issues when passing into composables during setup
let rafId: number | null = null;
function requestDraw() {
if (rafId !== null) return;
rafId = requestAnimationFrame(() => {
rafId = null;
drawCanvas();
});
}
// Initialize composables // Initialize composables
const canvas2D = useCanvas2D(canvasRef); const canvas2D = useCanvas2D(canvasRef);
@@ -169,7 +180,7 @@
getMousePosition: (event, z) => canvas2D.getMousePosition(event, z), getMousePosition: (event, z) => canvas2D.getMousePosition(event, z),
onUpdateSprite: (id, x, y) => emit('updateSprite', id, x, y), onUpdateSprite: (id, x, y) => emit('updateSprite', id, x, y),
onUpdateSpriteCell: (id, newIndex) => emit('updateSpriteCell', id, newIndex), onUpdateSpriteCell: (id, newIndex) => emit('updateSpriteCell', id, newIndex),
onDraw: drawCanvas, onDraw: requestDraw,
}); });
const activeSprites = computed(() => props.layers.find(l => l.id === props.activeLayerId)?.sprites ?? []); const activeSprites = computed(() => props.layers.find(l => l.id === props.activeLayerId)?.sprites ?? []);
@@ -374,7 +385,7 @@
onMounted(() => { onMounted(() => {
canvas2D.initContext(); canvas2D.initContext();
drawCanvas(); requestDraw();
// Attach listeners for current sprites // Attach listeners for current sprites
attachImageListeners(); attachImageListeners();
@@ -393,24 +404,26 @@
// Handler for force redraw event // Handler for force redraw event
const handleForceRedraw = () => { const handleForceRedraw = () => {
canvas2D.ensureIntegerPositions(props.sprites); // Ensure integer positioning for crisp rendering on the active layer
canvas2D.ensureIntegerPositions(activeSprites.value);
canvas2D.applySmoothing(); canvas2D.applySmoothing();
drawCanvas(); requestDraw();
}; };
// Re-attach listeners and redraw whenever layers/sprites change
watch( watch(
() => props.sprites, () => props.layers,
() => { () => {
attachImageListeners(); attachImageListeners();
drawCanvas(); requestDraw();
}, },
{ deep: true } { deep: true }
); );
watch(() => props.columns, drawCanvas); watch(() => props.columns, requestDraw);
watch(() => settingsStore.pixelPerfect, drawCanvas); watch(() => settingsStore.pixelPerfect, requestDraw);
watch(() => settingsStore.darkMode, drawCanvas); watch(() => settingsStore.darkMode, requestDraw);
watch(() => settingsStore.negativeSpacingEnabled, drawCanvas); watch(() => settingsStore.negativeSpacingEnabled, requestDraw);
watch(showAllSprites, drawCanvas); watch(showAllSprites, requestDraw);
</script> </script>
<style scoped></style> <style scoped></style>