Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π“Ρ€Π°Ρ„ΠΈΠΊΠ° DirectX Π² DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 15

Автор ΠœΠΈΡ…Π°ΠΈΠ» ΠšΡ€Π°ΡΠ½ΠΎΠ²

Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ процСсс смСны ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ опираСтся Π½Π° систСмный Ρ‚Π°ΠΉΠΌΠ΅Ρ€. Π­ΠΊΡ€Π°Π½ пСрСрисовываСтся Ρ‚Π°ΠΊ часто, ΠΊΠ°ΠΊ это позволяСт ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€, Π½ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠ² мСняСтся лишь Ρ‡Π΅Ρ€Π΅Π· ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Класс Ρ„ΠΎΡ€ΠΌΡ‹ дополнился двумя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΌΠΈ для контроля ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ:


ThisTickCount : DWORD; // Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ "врСмя" LastTickCount : DWORD; // ВрСмя послСднСго обновлСния

ΠŸΡ€ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ прилоТСния Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ систСмного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Ѐункция GetTickCount Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство миллисСкунд, ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠΈΡ… со Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ запуска ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы:


LastTickCount := GetTickCount;

Ѐункция пСрСрисовки ΠΊΠ°Π΄Ρ€Π° начинаСтся с Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ выясняСм, подошло Π»ΠΈ врСмя смСны полоТСния ΠΎΠ±Ρ€Π°Π·Π°:


ThisTickCount := GetTickCount; // Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ "врСмя"

if ThisTickCount - LastTickCount > 60 then begin // ΠŸΠΎΡ€Π° ΠΌΠ΅Π½ΡΡ‚ΡŒ мСсто

Angle := Angle + 0.05; // Для плавности смСны полоТСния ΠΎΠ±Ρ€Π°Π·Π°

// Для прСдотвращСния пСрСполнСния

if Angle > 2 * Pi then Angle := Angle - 2 * Pi;

LastTickCount := GetTickCount; // Π—Π°ΠΏΠΎΠΌΠ½ΠΈΠ»ΠΈ врСмя смСны полоТСния end;


Π˜Ρ‚Π°ΠΊ, ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° смСняСтся с максимальной частотой, Π½ΠΎ ΠΎΠ±Ρ€Π°Π· пСрСдвигаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ истСчСнии Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΌΡ‹ Π·Π°Π΄Π°Π΅ΠΌ сами, добиваясь плавности двиТСния.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ займСмся подсчСтом количСства воспроизводимых Π² сСкунду ΠΊΠ°Π΄Ρ€ΠΎΠ² (FPS, Frames Per Second) Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…06. Π—Π΄Π΅ΡΡŒ добавились Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, связанныС с подсчСтом ΠΊΠ°Π΄Ρ€ΠΎΠ²:


Frames : Integer =0; // Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊ ΠΊΠ°Π΄Ρ€ΠΎΠ² FPS : PChar = ''; // Выводимая строка

ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ воспроизвСдСнии ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ счСтчик, Π° Ρ‡Π΅Ρ€Π΅Π· установлСнный ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ подсчитываСм частоту воспроизвСдСния:


Inc (Frames); // Π£Π²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ счСтчик, воспроизводим ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ ΠΊΠ°Π΄Ρ€ if ThisTickCount - LastTickCount > 60 then begin

Angle := Angle + 0.05;

if Angle > 2 * Pi then Angle := Angle - 2 * Pi;

// ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ частоту

FPS := PChar ('FPS = ' + Format('%6.2f,

[Frames * 1000 / (ThisTickCount - LastTickCount)]));

Frames := 0; // ΠžΠ±Π½ΡƒΠ»ΡΠ΅ΠΌ счСтчик

LastTickCount := GetTickCount; end;

Π—Π°ΠΏΠΎΠ»Π½ΠΈΠ² Ρ„ΠΎΠ½, Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π½Π° экран Π½Π°ΠΉΠ΄Π΅Π½Π½ΡƒΡŽ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GDI Textout. He станСм Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя Π½Π° особыС ΡƒΠΊΡ€Π°ΡˆΠ΅Π½ΠΈΡ, тСкст выводится Ρ‡Π΅Ρ€Π½Ρ‹ΠΌ ΠΏΠΎ Π±Π΅Π»ΠΎΠΌΡƒ:


if Succeeded (FDDSBack.GetDC (DC)) then begin //DC ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½

TextOut (DC, 20, 20, FPS, 12); // Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ строку Π΄Π»ΠΈΠ½ΠΎΠΉ Π² 12 символов FDDSBack.ReleaseDC (DC); // DC ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ

end;


НайдСнная частота воспроизвСдСния Π½Π΅ соотвСтствуСт, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ частотС появлСния ΠΊΠ°Π΄Ρ€ΠΎΠ² Π½Π° экранС. Π’Π΅Π΄ΡŒ, Ссли эта Ρ†ΠΈΡ„Ρ€Π° получаСтся Π²Π΅Π»ΠΈΡ‡ΠΈΠ½ΠΎΠΉ нСсколько сотСн, Ρ‚ΠΎ ΠΎΠ½Π° ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ частоту Ρ€Π°Π·Π²Π΅Ρ€Ρ‚ΠΊΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°. ΠœΡ‹ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ смоТСм вывСсти Π½Π° экран Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ°Π΄Ρ€ΠΎΠ² Π·Π° ΠΎΠ΄Π½Ρƒ сСкунду. FPS Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ частоту обновлСния экранного Π±ΡƒΡ„Π΅Ρ€Π°.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ρ‡Π΅ΠΌ большС эта Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π°, Ρ‚Π΅ΠΌ большС радостных чувств ΠΎΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρƒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, Ссли вашС ΠΌΠ°ΡΡˆΡ‚Π°Π±Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ FPS Π²Π΅Π»ΠΈΡ‡ΠΈΠ½ΠΎΠΉ Π² Ρ‚Ρ€ΠΈ дСсятка, это ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ Ρ†ΠΈΡ„Ρ€Π°. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ΅ значСния ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΡŽΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ сущСствСнный запас для обогащСния экрана ΠΈΠ»ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°.

Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° Ρ‚ΠΎΠ½ΠΊΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΠΎΠΉ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ связана с использованиСм Ρ†ΠΈΠΊΠ»Π° оТидания. ΠΠ°ΠΈΠ²Ρ‹ΡΡˆΠ°Ρ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ воспроизвСдСния нашСго прилоТСния Π±ΡƒΠ΄Π΅Ρ‚ Π² случаС, ΠΊΠΎΠ³Π΄Π° опСрационная систСма Π½Π΅ слишком Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π°, Ρ‚. ΠΊ. ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Π°Ρ Ρ€Π°Π±ΠΎΡ‚Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ нашСго прилоТСния.

ЧастичноС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ экрана

ЧастичноС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ экрана ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ быстродСйствия, Ρ‚. ΠΊ. ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ смСнС полоТСния ΠΎΠ±Ρ€Π°Π·Π° обновляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ участок повСрхности, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡ‹ΠΉ ΠΈΠΌ Ρ€Π°Π½Π΅Π΅.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅, ΠΊΠ°ΠΊ это ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…07 являСтся ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° с подсчСтом FPS.

ΠŸΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π΅Π΅ΡΡ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ FPS ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΌ, Π½ΠΎ, с ΠΎΡ‡Π΅Π½ΡŒ нСбольшой долью лукавства, Π΅Π³ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ истинным. Лукавство состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ экранный Π±ΡƒΡ„Π΅Ρ€ обновляСтся частично, Π° Π½Π΅ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ ΠΏΡ€ΠΈ восстановлСнии ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠΉ повСрхности Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π½ΠΈΠΉ ΠΈ Π·Π°Π΄Π½ΠΈΠΉ Π±ΡƒΡ„Π΅Ρ€Ρ‹ помСщаСтся растровоС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Ρ„ΠΎΠ½Ρƒ:


if FDDSBack.BltFast (0, 0, FDDSBackGround, nil, DDBLTFAST_WAIT) = DDERR__SURFACELOST then Close;

if FDDSPrimary.BltFast (0, 0, FDDSBackGround, nil, DDBLTFAST_WAIT) = DDERR_SURFACELOST then Close;

ОбновлСниС ΠΊΠ°Π΄Ρ€Π° ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ собствСнно воспроизвСдСниС ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ страниц. Π₯ΠΎΡ‚ΡŒ функция пСрСрисовки ΠΊΠ°Π΄Ρ€Π° ΠΈ вызываСтся всС Ρ‚Π°ΠΊΠΆΠ΅ бСспрСрывно, Π½ΠΎ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Π½Π° экранС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ выводится Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ FPS, Π° измСнСния Π² ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ вносятся Ρ‡Π΅Ρ€Π΅Π· Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ ΠΎΠ±Ρ€Π°Π·Π°:


function TfrmDD.UpdateFrame : HRESULT;

var

DC : HOC; wrkRect : TRECT;

begin

Result := DD_FALSE;

ThisTickCount := GetTickCount;

Inc (Frames) ;

if ThisTickCount - LastTickCount > 60 then begin

// ΠŸΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ старому полоТСнию ΠΎΠ±Ρ€Π°Π·Π° SetRect (wrkRect, 288 + trunc (cos (Angle) * 150),

208 + trunc (sin (Angle) * 150),

352 + trunc (cos (Angle) * 150),

272 + trunc (sin (Angle) * 150));

Angle := Angle + 0.05;

if Angle > 2 * Pi then Angle := Angle -2 * Pi;

//На Π·Π°Π΄Π½Π΅ΠΉ повСрхности Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΎΠ±Ρ€Π°Π· Π² Π½ΠΎΠ²ΠΎΠΌ мСстС if FDDSBack.BltFast (288 + trunc (cos(Angle) * 150),

208 + trunc (sin(Angle) * 150),

FDDSImage, nil,

DDBLTFAST_WAIT or DDBLTFAST_SRCCOLORKEY) = DDERR_SURFACELOST then if Failed (RestoreAll) then Exit;

FPS := PChar ('FPS = ' + Format('%6.2f ,

[Frames * 1000 / (ThisTickCount - LastTickCount)]));

Frames := 0;

LastTickCount := GetTickCount;

// ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ страницы, Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π½Π΅ΠΌ Π±ΡƒΡ„Π΅Ρ€Π΅ ΠΎΠ±Ρ€Π°Π· Π² Π½ΠΎΠ²ΠΎΠΌ мСстС if FDDSPrimary.Flip(nil, DDFLIP_WAIT) = DDERR_SURFACELOST

then if Failed (RestoreAll) then Exit;

// Π‘Ρ‚ΠΈΡ€Π°Π΅ΠΌ ΠΎΠ±Ρ€Π°Π· Π½Π° Π·Π°Π΄Π½Π΅ΠΌ Π±ΡƒΡ„Π΅Ρ€Π΅

if FDDSBack.Blt (SwrkRect, FDDSBackGround, @wrkRect, DDBLT_WAIT, nil) = DDERR_SURFACELOST then if Failed (RestoreAll) then Exit;

end;


if Succeeded (FDDSPrimary.GetDC (DC)) then begin

TextOut (DC, 20, 20, fps, 12);

FDDSPrimary.ReleaseDC (DC);

end;


Result := DD_OK;

end;


ΠŸΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ здСсь ΠΊΠΎΠ΄ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ отличаСтся ΠΎΡ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ, я сократил ΠΈΠ·Π½ΡƒΡ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ FPS выводится Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎ, ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ΠΊΠ°Π΄Ρ€Π°. Π­Ρ‚ΠΎΠ³ΠΎ, Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π½Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ, Π° ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π΅Π³ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ смСнС полоТСния ΠΎΠ±Ρ€Π°Π·Π°. Π’ΠΎΠ³Π΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ FPS станСт Π΅Ρ‰Π΅ большС. ΠŸΡ€ΠΎΡΡ‚ΠΎ Π² этом случаС ΠΏΠΎΠ΄ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ нСльзя ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ частоту обновлСния экранного Π±ΡƒΡ„Π΅Ρ€Π°, вСдь Π² ΡΠΊΡ€Π°Π½Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²Π½ΠΎΡΠΈΡ‚ΡŒΡΡ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ измСнСния.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» ΠΏΠ°ΡƒΠ·Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ пСрСмСщСниями ΠΎΠ±Ρ€Π°Π·Π°, ΠΏΠΎΠ²Ρ‹ΡˆΠ°Ρ Ρ‚Π΅ΠΌ самым частоту (частичного) обновлСния экрана, Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π΅Π΅ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ FPS всС Ρ€Π°Π²Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ, всСгда большим, Ρ‡Π΅ΠΌ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

Π’ Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрСли ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡ€ΠΈΠ΅ΠΌΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ ΠΈΠ³Ρ€. Иногда Π½Π° ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°Ρ…, ΠΏΡ€ΠΈ скроллингС экрана ΠΈΠ»ΠΈ быстром ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ, Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ "Ρ‚ΠΎΡ€ΠΌΠΎΠΆΠ΅Π½ΠΈΠ΅" воспроизвСдСния, Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠ΅ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ этом пСрСрисовываСтся вСсь экран, Π° Π½Π΅ Π΅Π³ΠΎ Ρ‡Π°ΡΡ‚ΡŒ. Для ослаблСния Ρ‚Π°ΠΊΠΎΠ³ΠΎ эффСкта Π΄ΠΈΠ·Π°ΠΉΠ½Π΅Ρ€Ρ‹ часто ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°ΡŽΡ‚ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ экран, располагая ΠΏΠΎ Π³Ρ€Π°Π½ΠΈΡ†Π΅ Π΅Π³ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΠ°Π½Π΅Π»ΠΈ ΠΈ мСню.


НСпосрСдствСнный доступ ΠΊ пиксСлам овСрхности

ΠŸΡ€ΡΠΌΠΎΠΉ доступ ΠΊ графичСским Π΄Π°Π½Π½Ρ‹ΠΌ обСспСчиваСт максимум быстродСйствия, ΠΈ прСдоставляСт Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π»ΡŽΠ±Ρ‹Ρ…, ΠΈΠ»ΠΈ ΠΏΠΎΡ‡Ρ‚ΠΈ Π»ΡŽΠ±Ρ‹Ρ…, дСйствий с ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ.

На врСмя прямого доступа ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π°, послС Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π’ΠΎ врСмя Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ повСрхности опСрационная систСма находится Π² особом Ρ€Π΅ΠΆΠΈΠΌΠ΅, поэтому Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ максимально ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ повСрхности являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· самых спорных ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² DirectDraw. ЀактичСски ΠΎΠ½Π° ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ доступ ΠΊ Ρ€Π°Π·Π΄Π΅Π»Ρƒ памяти, связанному с ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒΡŽ. Если для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΠ΄Π½ΠΎΠΉ строки Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ, Π½Π°ΠΌ Π½Π΅ приходится Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π°ΡΡΠΎΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, Ρ‚ΠΎ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΆΠ΅ ΠΏΡ€ΠΈ прямом доступС ΠΊ памяти повСрхности Π½Π°ΠΌ Π½Π΅ΠΏΡ€Π΅ΠΌΠ΅Π½Π½ΠΎ слСдуСт Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эту ΠΏΠ°ΠΌΡΡ‚ΡŒ? Π—Π°ΠΏΠΈΡ€Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ позиция повСрхности Π² систСмной памяти ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ, систСмный ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ памяти ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ своим сообраТСниям ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈ памяти.


Π Π°Π±ΠΎΡ‚Π° с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹ΠΌΠΈ Π² видСопамяти, Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ отличаСтся ΠΎΡ‚ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½ΠΎΠΉ. ПозТС ΠΌΡ‹ ΡƒΠ·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ блокирования повСрхности, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½ΠΎΠΉ Π² систСмной памяти, Ссли это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ.

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…08. Бмысл ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Ρ‚Π°ΠΊΠΎΠ²: Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ растровоС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² качСствС Ρ„ΠΎΠ½Π°, Π° для заполнСния Π΅Π³ΠΎ, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² адрСс повСрхности Π·Π°Π΄Π½Π΅Π³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π° Π² памяти, Π·Π°ΠΏΠΎΠ»Π½ΠΈΠΌ Π½ΡƒΠ»Π΅ΠΌ Π±Π»ΠΎΠΊ памяти этого Π±ΡƒΡ„Π΅Ρ€Π°.

ΠŸΠ°ΠΌΡΡ‚ΡŒ повСрхности всСгда ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π° Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ, поэтому ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ сильно упрощаСтся.

Π’ ΠΊΠΎΠ΄Π΅ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ всС Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹, связанныС Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с Ρ„ΠΎΠ½ΠΎΠΌ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρƒ. Π”ΠΎΠ±Π°Π²ΠΈΠ»Π°ΡΡŒ функция быстрой очистки Π·Π°Π΄Π½Π΅Π³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π°:


function TfrmDD. Clear : HRESULT; var

desc : TDDSURFACEDESC2; // Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ структура

hRet : HRESULT; begin

Result := DD_FALSE;

ZeroMemory (@desc, SizeOf (desc) ) ; // ΠžΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ дСйствия с записью

desc.dwSize := SizeOf (desc) ;

// Π—Π°ΠΏΠΈΡ€Π°Π΅ΠΌ Π·Π°Π΄Π½ΠΈΠΉ Π±ΡƒΡ„Π΅Ρ€

hRet := FDDSBack. Lock (nil, desc, DDLOCK_WAIT, 0) ;

if Failed (hRet) then begin

Result := hRet;

Exit;

end;


// ЗаполняСм Π½ΡƒΠ»Π΅ΠΌ Π±Π»ΠΎΠΊ памяти Π·Π°Π΄Π½Π΅Π³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π°