HTML5 Canvas va JavaScript asosida kadrlar chastotasini (delta-time) hisobga olgan holda oddiy fizik tebranishlar animatsiyasini kodlash
Kompyuter grafikasi va interaktiv fizik modellashtirishning eng muhim poydevori — apparat ekran yangilanishiga (V-Sync) bog‘liq bo‘lmagan, Delta-Time ($\Delta t$) ga asoslangan kadr siklini to‘g‘ri arxitekturalashdir. Mazkur laboratoriya mashg‘ulotida talabalar requestAnimationFrame tsiklini yozadi, delta-timeni aniq o‘lchaydi, tekis va garmonik tebranma harakatlarni kodlaydi hamda Google Antigravity agentlik platformasida AI agentga kadr vaqtini o‘lchovchi test skriptini yozdirib, uning natijalarini (FPS, Jank) tanqidiy tekshiradi.
📋 7-laboratoriya mashg‘uloti rejasi va tahliliy bosqichlari:
TPACK va ZPD asosida brauzer Event Loop, V-Sync va delta-time bo‘yicha diagnostik test hamda shaxsiy o‘quv trayektoriyasi.
Canvas 2D konteksti, requestAnimationFrame, timestamp vaqt qadami, Fiedler akkumulyatori (qat’iy fizik qadam) va harakat qonunlari.
AI agent yozgan o‘lchov skripti, kadr vaqti tebranishi (Jank/FPS drop) tahlili va natijalarni talaba tomonidan tekshirish.
Mustaqil interaktiv Canvas shablonini generatsiya qilish, garmonik tebranishlar differensial tenglamasi va Sokratik audit.
1. Sun’iy intellekt uchun kognitiv diagnostika va individual ta’lim trayektoriyasi
Dasturlashda yangi boshlovchi talabalar animatsiyalarni ko‘pincha setInterval(loop, 16) yordamida yozishadi va har bir kadrda obyekt koordinatasiga qat’iy 5 yoki 10 piksel qo‘shib borishadi. Bu esa monitor yangilanish chastotasi (60Hz, 120Hz, 144Hz yoki 240Hz) har xil bo‘lgan qurilmalarda fizika tezligining keskin o‘zgarib ketishiga sabab bo‘ladi. TPACK (Mishra va Koehler, 2006) va ZPD (Vygotskiy, 1978) tamoyillari asosida quyidagi 4 ta diagnostik savol talabaning tayyorgarlik darajasini aniqlaydi va shaxsiy o‘quv yo‘riqnomasini yaratadi.
🧠 Boshlang‘ich kognitiv diagnostika testi (4 ta savol):
1. Nima uchun veb-brauzerda fizik animatsiyalar uchun setInterval yoki setTimeout o‘rniga requestAnimationFrame qo‘llanilishi shart?
2. Delta-Time ($\Delta t$) parametrining fizik kompyuter simulyatsiyalaridagi eng asosiy vazifasi nima?
3. Glenn Fiedlerning "Fix Your Timestep" maqolasiga ko‘ra, brauzer qotib qolganda (katta $\Delta t$ sakrashida) jism devordan o‘tib ketmasligi uchun qanday himoya chorasi qo‘llaniladi?
4. Google Antigravity agentlik platformasining ushbu laboratoriya topshirig‘idagi roli nimadan iborat?
2. HTML5 Canvas: birinchi kadr sikli va delta-time arxitekturasi
Veb-brauzerda silliq 60 kadr/sekund (yoki 120Hz ekranlarda 120 FPS) chastotada fizik jarayonlarni tasvirlash — brauzerning Event Loop va ekranni yangilash (rendering) sikli bilan bog‘liq: requestAnimationFrame chaqiruvlari asosiy oqimda, navbatdagi kadr chizilishidan oldin bajariladi (Lewis, n.d.; WHATWG HTML). Standart CanvasRenderingContext2D muhitida animatsiya quyidagi 3 ta ajralmas bosqichdan iborat:
1. Tozalash (Clear)
ctx.clearRect(0, 0, width, height) chaqirilib, o‘tgan kadrdagi barcha piksellar to‘liq tozalanadi yoki yarim shaffof rang bilan to‘ldirilib harakat izi (motion blur) hosil qilinadi.
2. Fizik yangilanish (Update)
Delta-Time orqali tezlik va koordinata o‘zgaradi: $x_{yangi} = x_{eski} + v_x \cdot \Delta t$. Devorlar bilan elastik to‘qnashuv va chegaraviy shartlar hisoblanadi.
3. Qayta chizish (render)
beginPath(), arc(), fill(), stroke() buyruqlari bilan geometrik jismlar, vektor nayzalari va o‘lchov datchiklari canvas bitmapiga chiziladi (brauzer uni odatda GPU yordamida ekranga chiqaradi).
⏱ Delta-time matematik modeli va Glenn Fiedler qoidasi:
requestAnimationFrame(callback) funksiyasi o‘zining argumenti sifatida millisekundlarda o‘lchanadigan yuqori aniqlikdagi DOMHighResTimeStamp qiymatini uzatadi.
Muhim aniqlik: Fiedler (2004) maqolasining asosiy tavsiyasi — fizikani o‘zgaruvchan $\Delta t$ bilan emas, balki qat’iy qadam ($h = 1/60$ s) bilan integratsiyalash: kadrlar orasidagi real vaqt akkumulyatorga qo‘shiladi va undan $h$ qadamlar ayriladi. Kadr vaqtini chegaralash (maqoladagi misolda 0,25 s, bizda 0,1 s) brauzer uzoq qotib qolganda akkumulyatorda qadamlar to‘planib, «o‘lim spirali»ga tushib qolishning oldini oladi. Quyidagi skelet oddiylik uchun o‘zgaruvchan $\Delta t$ dan foydalanadi; akkumulyatorli variant undan keyin keltirilgan.
| Monitor chastotasi | Kadrlar vaqti ($\Delta t$) | Kadrga bog‘liq harakat ($x += 5$) | Delta-time bilan harakat ($x += 300 \cdot \Delta t$) |
|---|---|---|---|
| 60 Hz (Ofis monitori) | $\approx 16.67\text{ ms}$ | Sekundiga 300 piksel | Sekundiga 300 piksel (Etalon) |
| 144 Hz (O‘yin monitori) | $\approx 6.94\text{ ms}$ | Sekundiga 720 piksel (2.4 baravar tez!) | Sekundiga 300 piksel (O‘zgarmas!) |
| 30 FPS (Kuchli yuklama/lag) | $\approx 33.33\text{ ms}$ | Sekundiga 150 piksel (2 baravar sekin!) | Sekundiga 300 piksel (O‘zgarmas!) |
💻 Etalon HTML5 Canvas kadr sikli skeleti (JavaScript):
const canvas = document.getElementById("simCanvas");
const ctx = canvas.getContext("2d");
let lastTime = 0;
let x = 50, y = 100;
let vx = 200, vy = 120; // Tezlik: piksel/sekund
const radius = 15;
function gameLoop(timestamp) {
if (!lastTime) lastTime = timestamp;
// 1. Delta-time hisoblash (sekundlarda)
const rawDt = (timestamp - lastTime) / 1000;
lastTime = timestamp;
// 2. Fiedler xavfsizlik chegarasi (0.1 soniyadan oshmasligi shart)
const dt = Math.min(rawDt, 0.1);
// 3. Fizik yangilanish (Mustaqil tezlik)
x += vx * dt;
y += vy * dt;
// Devorlar bilan elastik to‘qnashuv (jismni chegaraga qaytarib,
// tezlik yo‘nalishini aniq belgilaymiz — aks holda katta dt da
// to‘p devorga "yopishib" qolishi mumkin)
if (x - radius < 0) { x = radius; vx = Math.abs(vx); }
if (x + radius > canvas.width) { x = canvas.width - radius; vx = -Math.abs(vx); }
if (y - radius < 0) { y = radius; vy = Math.abs(vy); }
if (y + radius > canvas.height) { y = canvas.height - radius; vy = -Math.abs(vy); }
// 4. Kadrni tozalash va chizish
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.beginPath();
ctx.arc(x, y, radius, 0, Math.PI * 2);
ctx.fillStyle = "#38bdf8";
ctx.fill();
// Keyingi kadrni so‘rash
requestAnimationFrame(gameLoop);
}
// Siklni boshlash
requestAnimationFrame(gameLoop);
🧮 Fiedler akkumulyatori: qat’iy fizik qadam (Fixed Timestep):
const h = 1 / 60; // qat’iy fizik qadam (s)
let accumulator = 0;
let last = 0;
function loop(timestamp) {
if (!last) last = timestamp;
const frameTime = Math.min((timestamp - last) / 1000, 0.1);
last = timestamp;
accumulator += frameTime;
while (accumulator >= h) {
update(h); // fizika har doim bir xil qadam bilan
accumulator -= h;
}
render(); // chizish ekran chastotasida
requestAnimationFrame(loop);
}
requestAnimationFrame(loop);
Bu usulda natija FPS ga deyarli bog‘liq bo‘lmaydi va takrorlanuvchan bo‘ladi. Fiedler, shuningdek, accumulator / h nisbati bo‘yicha ikki holat orasida interpolyatsiya qilib, harakatni yanada silliq ko‘rsatishni tavsiya qiladi.
3. Kod yozish va jarayon monitoringi: Google Antigravity
Google Antigravity — Google tomonidan 2025-yil noyabrida Gemini 3 bilan birga taqdim etilgan agentlik dasturlash platformasi (IDE). Unda AI agentlar muharrir, terminal va brauzerda vazifalarni rejalashtiradi, bajaradi va natijani tekshirish uchun artefaktlar (reja, skrinshot, hisobot) qoldiradi (Google, 2025). Platformada tayyor «FPS telemetriyasi» moduli yo‘q: quyidagi ko‘rsatkichlarni o‘lchash uchun talaba agentdan performance.now() asosidagi o‘lchov skriptini yozib, ishga tushirishni so‘raydi va natijalarni o‘zi tekshiradi:
📊 1. Jank (kadr tushishi) monitoringi:
60 Hz ekranda kadr vaqti 16,67 ms dan sezilarli oshsa, kadr tushib qolgan (Jank) hisoblanadi. O‘lchov skripti har bir kadr oralig‘ini yozib boradi va bunday kadrlarni sanaydi. Natijalarni Chrome DevTools «Performance» panelidagi yozuv bilan solishtirish tavsiya etiladi.
🛡 2. Object Pooling va xotira auditi:
Kadr sikli ichida har safar new Object() yoki yangi massiv yaratish axlat yig‘uvchi (Garbage Collector — GC) yuklamasini oshiradi va vaqti-vaqti bilan GC pauzalari tufayli kadr tushishiga sabab bo‘lishi mumkin. Agentdan kodni ko‘rib chiqib, sikl ichida ortiqcha obyekt yaratilmasligini (Zero-Allocation Loop) tekshirishni so‘rash mumkin.
⚡ 3. Terminalda avtonom sinov:
Agent Playwright yoki Puppeteer yordamida sahifani ochib, 1000 ta kadr davomida delta-time ning o‘rtacha qiymati va standart chetlanishini ($\sigma$) hisoblovchi test yozishi mumkin. Diqqat: headless brauzerda kadr chastotasi haqiqiy ekrandagidan farq qilishi mumkin, shuning uchun yakuniy o‘lchovlarni oddiy brauzer oynasida takrorlang.
📝 4. Avtomatlashtirilgan hisobot:
Agent kadrlar chastotasi, integratsiya xatoligi va ossilyatorning energiya saqlanish darajasi bo‘yicha hisobot qoralamasini tayyorlaydi. AI agentlar xato qilishi mumkin: raqamlarni o‘zingiz qayta o‘lchab tekshiring, yakuniy xulosani o‘zingiz yozing.
🤖 Google Antigravity agenti uchun monitoring yo‘riqnomasi prompti:
4. Canvas boshlang‘ich shabloni: Claude (Artifacts)
Artifacts — claude.ai interfeysidagi funksiya bo‘lib, 2024-yil iyunida Claude bilan birga taqdim etilgan (Anthropic, 2024) va hozir keyingi Claude modellarida ham mavjud. U yaratilgan kodni alohida oynada ham matn, ham ishlovchi interaktiv ilova sifatida ko‘rsatadi. AI yaratgan kodni ishga tushirib, fizik to‘g‘riligini albatta tekshiring. Quyida oddiy to‘p harakatidan Garmonik Tebranishlar (Prujinali Ossilyator) fizik modeliga o‘tish kodi keltirilgan:
📐 Garmonik ossilyator matematik modeli:
Guk qonuni va Nyutonning 2-qonuni bo‘yicha erkin prujinali tebranishlar differensial tenglamasi:
Kompyuterda tenglama Eyler–Kromer (yarim-oshkor Eyler) sxemasi bilan diskretlashtiriladi (Cromer, 1981). Oddiy Eyler usulidan farqli ravishda bu sxemada energiya vaqt o‘tishi bilan cheksiz o‘smaydi:
Claude Artifacts uchun to‘liq ishlovchi komponent:
class HarmonicOscillator {
constructor(canvas) {
this.canvas = canvas;
this.ctx = canvas.getContext("2d");
this.omega = 3.5; // burchak chastotasi, rad/s
this.x = 80; // boshlang‘ich siljish (piksel) = amplituda
this.v = 0; // boshlang‘ich tezlik (piksel/s)
this.h = 1 / 240; // qat’iy fizik qadam (s)
this.acc = 0;
this.lastTime = 0;
this.loop = this.loop.bind(this);
requestAnimationFrame(this.loop);
}
step(h) {
// Eyler–Kromer: avval tezlik, keyin yangi tezlik bilan koordinata
this.v += -this.omega * this.omega * this.x * h;
this.x += this.v * h;
}
loop(timestamp) {
if (!this.lastTime) this.lastTime = timestamp;
const dt = Math.min((timestamp - this.lastTime) / 1000, 0.1);
this.lastTime = timestamp;
// Fiedler akkumulyatori: fizika FPS dan mustaqil
this.acc += dt;
while (this.acc >= this.h) {
this.step(this.h);
this.acc -= this.h;
}
this.render(this.x);
requestAnimationFrame(this.loop);
}
render(displacement) {
const w = this.canvas.width;
const h = this.canvas.height;
const cy = h / 2;
const cx = w / 2 + displacement;
this.ctx.clearRect(0, 0, w, h);
// Muvozanat chizig‘i
this.ctx.strokeStyle = "rgba(255,255,255,0.2)";
this.ctx.lineWidth = 1;
this.ctx.beginPath();
this.ctx.moveTo(w / 2, 20);
this.ctx.lineTo(w / 2, h - 20);
this.ctx.stroke();
// Prujina
this.ctx.strokeStyle = "#38bdf8";
this.ctx.lineWidth = 2;
this.ctx.beginPath();
this.ctx.moveTo(30, cy);
this.ctx.lineTo(cx, cy);
this.ctx.stroke();
// Yuk (to‘p)
this.ctx.fillStyle = "#a855f7";
this.ctx.beginPath();
this.ctx.arc(cx, cy, 16, 0, Math.PI * 2);
this.ctx.fill();
}
}
5. Interaktiv dastgoh: kadrlar chastotasi, delta-time va tebranishlar sandboksi
Ushbu interaktiv laboratoriya stendida siz delta-time integratsiyasining ahamiyatini ko‘zingiz bilan ko‘rishingiz mumkin. Ekranning o‘ng tomonidagi sozlamalardan kadrlar chastotasini sun’iy ravishda 60 FPS dan 30 yoki 15 FPS ga tushirib ko‘ring: agar “Delta-time integratsiyasi” yoqilgan bo‘lsa, jismning harakat tezligi zarracha o‘zgarmaydi! Agar uni o‘chirib qo‘ysangiz, fizika har kadrda qat’iy 1/60 s ga suriladi: 15 FPS da to‘p 4 baravar sekinlashadi, 120 Hz ekranda esa (“Cheklovsiz” rejim) 2 baravar tezlashadi (katta xatolik!).
📊 Jonli datchiklar va kadr telemetriyasi:
60,0 FPS
16,67 ms
2D elastik to‘p
1,0×
6. Akademik baholash rubrikasi (100 ballik tizim) va ilmiy manbalar
🧮 Laboratoriya ishini baholash mezonlari kalkulyatori:
📚 Foydalanilgan manbalar (APA 7):
- Anthropic. (2024, June 20). Claude [Announcement introducing Artifacts]. https://www.anthropic.com/news/claude-3-5-sonnet
- Cromer, A. (1981). Stable solutions using the Euler approximation. American Journal of Physics, 49(5), 455–459. https://doi.org/10.1119/1.12478
- Fiedler, G. (2004). Fix your timestep! Gaffer On Games. https://gafferongames.com/post/fix_your_timestep/
- Google. (2025, November 18). Build with Google Antigravity, our new agentic development platform. Google Developers Blog. https://developers.googleblog.com/build-with-google-antigravity-our-new-agentic-development-platform/
- Lewis, P. (n.d.). Rendering performance. web.dev. https://web.dev/articles/rendering-performance
- Mishra, P., va Koehler, M. J. (2006). Technological pedagogical content knowledge: A framework for teacher knowledge. Teachers College Record, 108(6), 1017–1054. https://doi.org/10.1111/j.1467-9620.2006.00684.x
- MDN Web Docs. (n.d.-a). Window: requestAnimationFrame() method. Mozilla. https://developer.mozilla.org/en-US/docs/Web/API/Window/requestAnimationFrame
- MDN Web Docs. (n.d.-b). Optimizing canvas. Mozilla. https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Optimizing_canvas
- Press, W. H., Teukolsky, S. A., Vetterling, W. T., va Flannery, B. P. (2007). Numerical recipes: The art of scientific computing (3rd ed.). Cambridge University Press.
- Robinson, J., va McCormack, C. (Eds.). (2015). Timing control for script-based animations (W3C Working Group Note; endi yuritilmaydi, amaldagi ta’rif WHATWG HTML standartida). https://www.w3.org/TR/animation-timing/
- Vygotsky, L. S. (1978). Mind in society: The development of higher psychological processes. Harvard University Press.
- WHATWG. (n.d.). HTML Living Standard: Animation frames. https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#animation-frames