ãã®åºçç©ã¯ãMicrosoft DirectXã°ã©ãã£ãã¯ã©ã€ãã©ãªã®äœ¿çšãåžæããã³ã³ãã¥ãŒã¿ãŒã°ã©ãã£ãã¯ããã°ã©ãã³ã°ã®åéã®åå¿è
ã察象ãšããŠããŸãã ããã«äºçŽããïŒ
-åãäžããããŠãããããã¯ã¯ããããOpenGLã«ãåœãŠã¯ãŸããŸãããçµéšçã«ïŒOpenGLçšã®ã¢ããªã±ãŒã·ã§ã³ãäœæããããšã«ããïŒãã¹ãããŠããªããããã¿ã€ãã«ã«ã¯Direct3Dã®ã¿ãèšèŒããŠããŸãã
-ããã«èšèŒãããŠããã³ãŒãäŸã¯Delphi / FreePascalèšèªã«é¢é£ããŠããŸããããªã¹ãããããã¬ã·ããã¯ã¿ãŒã²ããOSïŒWindowsïŒå
ã§åºã䜿çšãããŠããŸã-ãããã¯ããããããã°ã©ãã³ã°èšèªã«é©çšã§ããVCL以å€ã®ã³ã³ããŒãã³ãã®é«ã¬ãã«ã©ã€ãã©ãªã«ãé©çšã§ããŸãïŒDelphiïŒããã³LCLïŒLazarusïŒ;
-ãã®åºçç©ã¯ãDirect3Dã¯ã€ã€ãã¬ãŒã ã¢ããªã±ãŒã·ã§ã³ã®äœæãšãDirectXããã³OpenGLã°ã©ãã£ãã¯ã©ã€ãã©ãªãæäœããæ¹æ³ã®ãããã¯ã«ã€ããŠã¯æ±ã£ãŠããŸããã ãããã¯ãã¹ãŠä»ã®ãœãŒã¹ã§ååã«ã«ããŒãããŠãããããã«è¿œå ãããã®ã¯ã»ãšãã©ãããŸããã
ã ããããããã¯ã«è¿ãã 3次å
ã°ã©ãã£ãã¯ã¹ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãéçºããæè²çšïŒããã«æ©èœããïŒã¢ããªã±ãŒã·ã§ã³ã®ãã¬ãŒã ã¯ãŒã¯ãæ§ç¯ããå ŽåãéåžžãçŽç²ãªWin32 APIã䜿çšããããšããå§ãããŸã...
åé¡ã®ç޹ä»
çŽç²ãªWin32 APIã䜿çšããå Žåãåä¿¡ãŠã£ã³ããŠã¡ãã»ãŒãžã®åŠçãµã€ã¯ã«ã¯ãæåãã§èšè¿°ããå¿
èŠããããéåžžã¯æ¬¡ã®ããã«ãªããŸãã
repeat if ( PeekMessage(msg, 0, 0, 0, PM_REMOVE) ) then
ãã®ã³ãŒãã䜿çšãããšã
ç¡éã®ã¬ã³ããªã³ã°ãµã€ã¯ã«ãå®è£
ã§ããŸãããã®
ãµã€ã¯ã«ã§ã¯ãã»ãšãã©ã®å Žåãåã®ãã¬ãŒã ã®çŽåŸã«æ¬¡ã®ãã¬ãŒã ãæç»ãããã¢ãã¡ãŒã·ã§ã³ãç»é¢ã«æ£ããã¹ã ãŒãºã«è¡šç€ºãããŸãïŒã°ã©ãã£ãã¯ããã©ãŒãã³ã¹ãååãªå ŽåïŒã
ãã ããVCLãLCLãªã©ã®é«ã¬ãã«ã³ã³ããŒãã³ãã©ã€ãã©ãªã§ã¯ãããã°ã©ãããã®ãããªã¡ãã»ãŒãžåŠçãµã€ã¯ã«ãå®è£
ããå¿
èŠã¯ãããŸããã 圌ãã®è
žã«ã¯ããã§ã«äœããã®åœ¢ã§ãã®ãããªãµã€ã¯ã«ã®å®è£
ããããŸãã®ã§ããããã®ã©ã€ãã©ãªãæäœããååã«éåããã«ç¡éã®ã¬ã³ããªã³ã°ãµã€ã¯ã«ãå®è£
ããåæã«ãããã®ã©ã€ãã©ãªã®ãã¹ãŠã®ãã€ã³ãã£ã³ã°ã³ãŒãã®æ£ããåäœã確ä¿ããæ¹æ³ãåé¡ã«ãªããŸããïŒ ãã®è³ªåããç§èªèº«ã®çè§£ã®ç¯å²å
ã§å°æ¥çã«èª¬æããã€ããã§ãã
äŸå€ãã¹ãã³ã°äœè«
éåžžãDirect3Dã䜿çšããŠLazarusã§ã³ã³ãã€ã«ããããããžã§ã¯ããèµ·åã§ãããæµ®åå°æ°ç¹èšç®ã«ãããªãããããã°ã©ã ã®èµ·åæã«äŸå€ãå®å®ããŠåä¿¡ã§ããªãã£ããšããç§ã¯é©ããŸããã åé¡ã®èª¿æ»ã«ãã°ããæéãè²»ããããããã®åé¡ã«é¢ããã€ã³ã¿ãŒãããäžã®çŽæ¥çãªæ
å ±ã¯èŠã€ãããŸããã§ããããDelphiã§64ãããã¢ãŒããã¯ãã£çšã«ãããžã§ã¯ããã³ã³ãã€ã«ãããšãå®è¡æã«éåžžã«ãã䌌ããšã©ãŒãçºçããŸãã Delphiã®ãããã°ã¢ãŒããŠã£ã³ããŠã®å
容ã調ã¹ããšãããã»ããµã®FPUæ¡åŒµã§ã¯ãèæ
®ããããã¹ãŠã®ã±ãŒã¹ã§MXCSRäŸå€ãã¹ã¯ã¬ãžã¹ã¿ã®æå³ãç°ãªãããšãããããŸããã ãã®åŸã§ãã䟡å€ã®ãããã®ãã°ãŒã°ã«ã§æ€çŽ¢ããããšã¯ã§ããŸããã§ããããã ããæšæºã®Delphiããã±ãŒãžã®OpenGLã¢ãžã¥ãŒã«ã«ã¯ããåæåãã»ã¯ã·ã§ã³ã«ãã¹ãŠã®å¯èœãªã±ãŒã¹ã®äŸå€ã®ãã¹ãã³ã°ãèšå®ããè¡ãå«ãŸããŠããŸãã
FPUäŸå€ã®ãã¹ãã³ã°ã¯ããã®åºçç©ã®ãããã¯ãšã¯é¢ä¿ããªããããããŸã泚ç®ããŸããã æãåçŽãªäŸã瀺ããŸããéåžžã«å€§ããªæµ®åå°æ°ç¹æ°ã®ä¹ç®ããªãŒããŒãããŒãåŒãèµ·ããå Žåããã®å Žåãæ¬¡ã®2ã€ã®ãããããçºçããŸãã察å¿ããäŸå€ã®ãã¹ãã³ã°ãæå¹ãªå Žåãä¹ç®ã®çµæã¯INFINITYïŒãŸãã¯-INFINITYïŒã«ãªããŸãã ãŸãã¯ã察å¿ããäŸå€ã®ãã¹ãã³ã°ãç¡å¹ã«ãªã£ãŠããå Žåãããã»ããµã¯æµ®åå°æ°ç¹ãªãŒããŒãããŒäŸå€ãçæããŸãïŒãã®äŸå€ã¯ãtry exceptãããã¯ã®ããã°ã©ã ã§åŠçããå¿
èŠããããŸãïŒã
ãã®çµæãæšæºOpenGLã¢ãžã¥ãŒã«ã§è¡ãããããã«ãããžã§ã¯ãã§äŸå€ãã¹ã¯ãèšå®ããããšããåŸãDirect3Dã¢ããªã±ãŒã·ã§ã³ãLazarusãšDelphiïŒ64ããããã©ãããã©ãŒã ãå«ãïŒã®äž¡æ¹ã§åé¡ãªãåäœããããšã確èªããŸããã
æ®å¿µãªãããMSDNãä»ã®ãœãŒã¹ã§èŠã€ããããšãã§ããŸããã§ããïŒæããèŠãç®ãæªãã®ã§ããããïŒïŒãã®æ¹æ³ãšä»ã®æ¹æ³ã«ã€ããŠã¯ãèªè
ã«æ¬¡ã®ã³ãŒããDirect3Dãããžã§ã¯ãã§æžãããšããå§ãããŸãã
uses Math; ... INITIALIZATION Math.SetExceptionMask([exInvalidOp..exPrecision]); END.
ãã¹ãã³ã°äŸå€ã«ã¯ãèæ
®ãã¹ãç¹å®ã®å¯äœçšãããããšã«æ³šæããŠãã ããã ããšãã°ããŒãã§é€ç®ããããšããå¯èœãã«ãªããŸãïŒããšãã°ã
ããã§ãã®ãããªåé¡ãçºçã
ãŸã ïŒããã®ãããæµ®åå°æ°ç¹èšç®ãå®è¡ããå Žåãäžéçµæã確èªããå¿
èŠããããŸãã
ãã ããæµ®åå°æ°ç¹ã®èšç®ãå®è¡ããéã«ä»¥åã«æ
£ããŠããäŸå€çãªç¶æ³ãåãåãããå Žåã¯ãé©åãªå Žæã§æ¬¡ã®ãããªãã¶ã€ã³ã䜿çšããããšã劚ãããã®ã¯äœããããŸããã
var mask: TArithmeticExceptionMask; begin mask := SetExceptionMask([]);
ããã§ãäŸå€ã®ãã¹ãã³ã°ã®åé¡ã§çµãããŸãã
å¥ã®äœè«-ãªããããå¿
èŠãªã®ã§ããïŒ
é«ã¬ãã«ã®ã³ã³ããŒãã³ãã©ã€ãã©ãªã䜿çšããŠDirect3Dã¢ããªã±ãŒã·ã§ã³ãäœæããã«ã¯ãå€ãã®ç®æšããããŸãã ããšãã°ãã·ã§ãŒããŒããšãã§ã¯ããªã©ã®ç¬éããããã°ããŸãã ãŸãã¯ãç¬èªã®3Dãšã³ãžã³ãäœæããŠããŠããšã³ãžã³ããªãœãŒã¹ãããŒãããŠã·ãŒã³ãã¬ã³ããªã³ã°ããå®çŸ©ãã¡ã€ã«ãšãã£ã¿ãŒãå¿
èŠãªå ŽåããããŸãã ãã®ãããªå Žåãããã«çµæã確èªã§ããããã«ããå¿
èŠã«å¿ããŠãã¡ãã¥ãŒããŒãã¢ãŒãã«ãã€ã¢ãã°ãªã©ã®ãå¥å
šãªããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠããã®å Žã§äœããç·šéããŸãã ãªã©
ãã®åºçç©ã§ã¯ãã¡ã€ã³ãŠã£ã³ããŠã«åäžã®äžè§åœ¢ã衚瀺ããïŒDirectX 11 APIã䜿çšããïŒæ¯èŒçåºæ¬çãªããã°ã©ã ãæºåããåæã«ã·ãŒã³ã®ã¬ã³ããªã³ã°ã«äœ¿çšãããé ç¹ã·ã§ãŒããŒãšãã¯ã»ã«ã·ã§ãŒããŒãç·šéããã³é©çšã§ããŸãã ãã®ããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ãã©ãŒã ïŒè€æ°è¡å
¥åãã£ãŒã«ããšãã¿ã³ïŒã«å¿
èŠãªã³ã³ããŒãã³ãã»ãããé
眮ããå¿
èŠããããŸããã ããã«èŠåããŸã-ãã®ããã°ã©ã ã¯ïŒãã®åºçç©ã®ããã«ïŒãã¢ã®ã¿ã§ãããããç¹å¥ãªããšãæåŸ
ããªãã§ãã ããã ãœãŒã¹ã³ãŒããžã®ãªã³ã¯ã¯ããã®åºçç©ã®æ¬æã®æåŸã«èšèŒãããŠããŸãã
ããã§äœè«ãçµãããŸããããã§äž»ãªãããã¯ã«é²ã¿ãŸãã
ç°¡åãªæ¹æ³ã¯ãTForm.OnPaintã€ãã³ããWindows.InvalidateRectïŒïŒé¢æ°ã§ãã
é«ã¬ãã«ã®ã³ã³ããŒãã³ãã©ã€ãã©ãªã ãã§ãªããã¯ãªãŒã³ãªWin32 APIã«ã粟éããŠããããã°ã©ããŒã¯ãããããé ã®äžã«åçŽãªã¹ããŒã ãæ¢ã«æ§ç¯ããŠããã§ãããããOnPaintãšåŒã°ãããã©ãŒã ã€ãã³ããã³ãã©ãŒïŒãŸãã¯å¥ã®ã³ã³ããŒãã³ãïŒã§Direct3Dã·ãŒã³ãæç»ããã¬ã³ããªã³ã°ãWin32 APIããInvalidateRectïŒïŒé¢æ°ãåŒã³åºããŠãã·ã¹ãã ã«æ°ããWM_PAINTã¡ãã»ãŒãžãéä¿¡ãããŸããããã«ãããOnPaintãã³ãã©ãŒãå床åŒã³åºãããŸããæ®ãã®éšåã«åå¿ããããšãå¿ããã«ãç¡éã®ã¬ã³ããªã³ã°ãµã€ã¯ã«ãç¹°ãè¿ããŸãã TIONALã¡ãã»ãŒãžã "
äžè¬çã«ãããã§ãã
OnPaintãã³ãã©ãŒã®ãµã³ãã«ã³ãŒããã©ã³ã次ã«ç€ºããŸãã
procedure TFormMain.FormPaint(Sender: TObject); begin
ãããã圌ããèšãããã«ããçŽã®äžã§ã¯æ»ããã§ãããã
äœãèµ·ãããèŠãŠã¿ãŸãããïŒããã¹ãã®æåŸã«ãœãŒã¹ã³ãŒããžã®ãªã³ã¯ãããããšãæãåºããŠãã ãã-ããŠã³ããŒãåŸãèªè
ã¯ãµããã£ã¬ã¯ããªã01-OnPaint + InvalidateRectããèŠã€ããããã°ã©ã ãã³ã³ãã€ã«ããŠå®è¡ãããµã³ãã«ãæ£ããåäœããªãããšã確èªã§ããŸãïŒ
åé¡1 ïŒDelphiã§ã¢ããªã±ãŒã·ã§ã³ãã³ã³ãã€ã«ãããã®åŸèµ·åãããšãDirect3Dã·ãŒã³ã¯æåŸ
ã©ããã«æç»ãããŸããããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã³ã³ãããŒã«ã¯æ£åžžã«è¡šç€ºãããŸããã ããã°ã©ã ãŠã£ã³ããŠã®å Žæããµã€ãºã倿ŽãããŸã§ãã©ãã«ãè€æ°è¡ç·šéãã£ãŒã«ãã®å
容ãã¹ããŒã¿ã¹ããŒããã¿ã³ã®ããããæ£åžžã«è¡šç€ºãããŸãã...ãŸããã¹ã¯ããŒã«ãšç·šéãéå§ãããšãè€æ°è¡ç·šéãã£ãŒã«ãã¯ã ãããåæç»ãããŸãå
容ããããå
šäœçã«çµæã¯äžæºè¶³ã§ãã ãŸããããã°ã©ã ãããã»ã¹å
ã§ãã€ã¢ãã°ããã¯ã¹ïŒãŸãã¯å°ãªããšãããªããã£ããªMessageBoxïŒãéãå Žåãéåžžã¯éããªãããç»é¢ã«è¡šç€ºããŸããïŒã¹ããŒã¹ããŒã§ã¡ãã»ãŒãžããã¯ã¹ãç²ç®çã«éããŸãããTFormããç¶æ¿ãããã€ã¢ãã°ãŠã£ã³ããŠãéããŸãïŒããã§ããŸããïŒ ãã®åé¡ã説æããããã«ããµã³ãã«ããã°ã©ã ã®ã¡ã€ã³ã¡ãã¥ãŒã«ã詳现->ããŒãžã§ã³æ
å ±ïŒMessageBoxïŒãããã³ã詳现->ããŒãžã§ã³æ
å ±ïŒTFormïŒããšããé
ç®ã远å ããŸããã
åé¡2 ïŒLazarusã§ã¢ããªã±ãŒã·ã§ã³ãã³ã³ãã€ã«ãããã®åŸã®èµ·åæã«ãäžèšã®åé¡ïŒååã§ã¯ãªããã®ããã«ïŒã«å ããŠãããã°ã©ã ãçµäºã§ããªãããšã远å ãããŸã-ããããŒã®æšæºã®éãããã¿ã³ïŒãXãïŒãŸãã¯ã¡ãã¥ãŒé
ç®ã«å¿çããŸãããçµäºã...ã¿ã¹ã¯ãããŒãžã£ã®ããã«ãããŸãã¯IDEã®ãCtrl + F2ãã®çµã¿åããã䜿çšããã«ããã°ã©ã ãçµäºããã«ã¯ãããã°ã©ã ãã¿ã¹ã¯ããŒã«æå°åããå¿
èŠããããŸãïŒãªãã ãããïŒïŒãŠã£ã³ããŠãéãããã¿ã³ãã¯ãªãã¯ããåŸã
æåŸã®åé¡ãåãé€ãã«ã¯ãå®éã«ã¯éåžžã«ç°¡åã§ããInvalidateRectïŒïŒé¢æ°ãåŒã³åºãåã«ã次ã®ãããªæ¡ä»¶ã远å ããã ãã§ãã
if ( not ( Application.Terminated ) ) then InvalidateRect(Self.Handle, nil, FALSE);
ããããããã§æåã®åé¡ã解決ããã®ã¯ãšãŠãç°¡åã§ããæ²ããããªãããã¯æ©èœããŸããã
çµè«ïŒãã®å°èŠåºãã§èª¬æãããŠããæ¹æ³ã¯ãWindowsãŠã£ã³ããŠã¡ãã»ãŒãžãã¥ãŒã®éåžžã®æäœãäžæããå€ãã®ãŠã£ã³ããŠã¡ãã»ãŒãžãæéã©ããã«åŠçãããªãããã«ããŸããããã¯ãã³ã³ããŒãã³ãã®é«ã¬ãã«ã©ã€ãã©ãªã䜿çšããå Žåã«ç¹ã«é¡èã§ãïŒå°ãªããšãããã®æç¹ã§ã®ããŒãžã§ã³ã®VCLããã³LCLåºçïŒã
泚ïŒMSDNã§ã¯ã
GetMessage颿°ã®èª¬æãèŠã€ããããšãã§ããŸããããã§ãWM_PAINTã¡ãã»ãŒãžã¯ä»ã®ãŠã£ã³ããŠã¡ãã»ãŒãžãšæ¯èŒããŠäœãåªå
床ãæã¡ïŒWM_TIMERãé€ãããã®åªå
床ã¯ããã«äœãïŒãä»ã®ãã¹ãŠã®ãŠã£ã³ããŠã¡ãã»ãŒãžã®åŸã«åŠçãããŸãã
åèšïŒåœŒããèšãããã«ãäºå®ã¯æããã§ãã ãã¹ãŠã®OSããŒãžã§ã³ã§ã¯ãªãå Žåãå°ãªããšãçŸåšäººæ°ã®ããWindows 7ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ïŒç§ã¯ãããªã±ãŒã·ã§ã³ã«æ·»ä»ãããŠãããã¹ãŠã®ãµã³ãã«ããã°ã©ã ãå®è¡ããŸããïŒã§ã¯ãWM_PAINTã¡ãã»ãŒãžãåŠçããåªå
é äœã®ããç¶æ³ã¯ãç¹ã«ã¢ããªã±ãŒã·ã§ã³ãé«ã¬ãã«ã®ã³ã³ããŒãã³ãã©ã€ãã©ãªã䜿çšãããããMSDNã§æå®ãããåªå
床ã«äŸåããããšã¯ã§ããŸããã
ããã§ãç¡éã®ã¬ã³ããªã³ã°ãµã€ã¯ã«ãæŽçããæ¬¡ã®æ¹æ³ã«é²ãããšãã§ããŸãããå¥ã®çãäœè«ã1ã€ã®å°ããªæ®µèœãäœæããŸãã
VCLããã³LCLã©ã€ãã©ãªã¯ãTWinControlããç¶æ¿ããã¯ã©ã¹ã§ãInvalidateïŒïŒã¡ãœãããããã°ã©ãã«æäŸããŸãã VCLã©ã€ãã©ãªã§ã¯ããã®åŒã³åºãã¯äžèšã®çŽç²ãªWin32 APIã®InvalidateRectïŒïŒé¢æ°ã®åŒã³åºãã«éå®ãããŸãããäžè¬ã«ãã®ã¡ãœããã®åäœã¯ç¹å®ã®ã©ã€ãã©ãªã®å®è£
ã«äŸåããŸãã ãã®ãããLCLã§ã¯ããã®ã¡ãœããã¯RedrawWindowïŒïŒãšåŒã°ããå¥ã®Win32 API颿°ãåŒã³åºããŸã-ãã®é¢æ°ã¯ã»ãŒåãçµæïŒæ°ãããŠã£ã³ããŠã¬ã³ããªã³ã°ãå®è¡ãããŸãïŒãæäŸããŸããã埮åŠãªéãããããŸãã ãããã£ãŠããã¥ã¢ã³ã¹ã«çŠç¹ãåãããªãããã«ãããã«Win32 APIããInvalidateRectïŒïŒé¢æ°ã䜿çšããããšãææ¡ããŸããã
ã¡ãœããã¯ããæåããŠããŸã-Application.OnIdleã€ãã³ãã䜿çšããŸã
åã®æ¹æ³ã¯å€±æãããããWindowsãŠã£ã³ããŠã®ã¡ãã»ãŒãžãã¥ãŒã®éåžžã®æäœãäžæããããããä»ã®ãã¹ãŠã®ãŠã£ã³ããŠã¢ããªã±ãŒã·ã§ã³ãåŠçããåŸãã¢ããªã±ãŒã·ã§ã³ãŠã£ã³ããŠã®ã¬ã³ããªã³ã°ãå³å¯ã«è©Šã¿ãããšã¯è«ççã§ãã äžèŠãããšïŒå°ãªããšãã©ã€ãã©ãªã®å
éšã詳ããèŠãŠããªãå ŽåïŒããã®ã¿ã¹ã¯ã¯VCLããã³LCLã©ã€ãã©ãªã®è
žã«é ããŠãããŠã£ã³ããŠã¡ãã»ãŒãžåŠçãµã€ã¯ã«ã倿Žããªããšäžå¯èœã«æãããããããŸããããå®éã¯ããã§ã¯ãããŸããã
Applicationãªããžã§ã¯ãã«ã¯OnIdleã€ãã³ãããããæ°ãããŠã£ã³ããŠã¡ãã»ãŒãžããªãããšãæ€åºããããã³ã«çºçããŸããããã«ããã®ã€ãã³ãã®ãã³ãã©ãŒã¯ãæçµçã«æ°ããã¡ãã»ãŒãžã衚瀺ããããŸã§ããã®ã€ãã³ããããäžåºŠïŒã«ãŒãã§ïŒåŠçããããšãå ±åã§ããŸãã¡ãã»ãŒãžã æ°ããã¡ãã»ãŒãžãåŠçãããåŸãApplication.OnIdleã€ãã³ããã³ãã©ãŒãåã³åŒã³åºãããŸã...ãªã©ãã¢ããªã±ãŒã·ã§ã³ãçµäºãããŸã§ç¶ããŸãã äžè¬ã«ãApplication.OnIdleã€ãã³ãã¯ãç¬èªã®ãã¥ã¢ã³ã¹ã¯ãããŸãããç¡éã®ã¬ã³ããªã³ã°ãµã€ã¯ã«ãæŽçããã®ã«éåžžã«é©ããŠããŸãïŒãã®ã€ãã³ãã®è©³çްã«ã€ããŠã¯ã䜿çšããŠããéçºç°å¢ã®ãã«ããåç
§ããããšããå§ãããŸãïŒã
OnPaintãã³ãã©ãŒããInvalidateRectïŒïŒAPI颿°ã®åŒã³åºããåé€ããApplication.OnIdleã€ãã³ããã³ãã©ãŒã«è»¢éã§ããŸãã
çµæã¯ã次ã®ãããªã³ãŒãã«ãªããŸãã
procedure TFormMain.FormCreate(Sender: TObject); begin Application.OnIdle := OnApplicationIdle;
ãããªã±ãŒã·ã§ã³ã«æ·»ä»ãããŠãããœãŒã¹ã§ããµããã£ã¬ã¯ããªã02-OnPaint + OnApplicationIdleããèŠã€ããŠããã¹ãŠã®ã³ã³ãããŒã«ã®å
容ãã¿ã€ã ãªãŒã«æŽæ°ãããã¹ãŠã®ã¢ãŒãã«ãã€ã¢ãã°ããã¯ã¹ãæ£ãã衚瀺ããããšã«ãããããã°ã©ã ã®åäœãæ¹åã§ããŸãã
äžèšã«ãã1ã€è¿œå ããŸããããã°ã©ã ãŠã£ã³ããŠãã¿ã¹ã¯ããŒã«æå°åããã¿ã¹ã¯ãããŒãžã£ãŒãéããšãããã°ã©ã ãå°ãªããšã1ã€ã®ããã»ããµã³ã¢ãå®å
šã«ãæ¶è²»ãããŠããããšãããããŸãã ã ãã®ãããªå Žåã«ããã°ã©ã ã§ä»ã®ã¢ããªã±ãŒã·ã§ã³ã«CPUãªãœãŒã¹ãå²ãåœãŠãéããŠããã¢ãŒãã«ãŠã£ã³ããŠã§ã°ãªãããçºçãããªãããã«ããå ŽåïŒLazarusã§ã®ã¿èŠãŸããïŒãæ¬¡ã®æ¹æ³ã§Application.OnIdleã€ãã³ããã³ãã©ãŒã倿Žã§ããŸãã
procedure TFormMain.OnApplicationIdle(Sender: TObject; var Done: Boolean); begin if ( Application.Terminated )
ãã ããApplication.OnIdleã€ãã³ããåŠçãããŠããå®ç§ãªç¡éã®ã¬ã³ããªã³ã°ãµã€ã¯ã«ãéæããããšã¯äžå¯èœã§ãã ããšãã°ããŠã£ã³ããŠã®ã¡ã€ã³ã¡ãã¥ãŒãéããŠããå Žåãããã²ãŒã·ã§ã³äžã«Application.OnIdleã€ãã³ãã¯åŒã³åºãããªããããDirect3Dã·ãŒã³ã®ã¢ãã¡ãŒã·ã§ã³ã¯ã忢ãããŸãã ããã°ã©ã ãã¢ãŒãã«ãã€ã¢ãã°ãŸãã¯ã¡ãã»ãŒãžããã¯ã¹ãŠã£ã³ããŠãéããå Žåããåãããšãèµ·ãããŸãã
ãã¡ããããã®ãããªåé¡ãå
æã§ããŸãã ããšãã°ããã©ãŒã ã«TTimerãªããžã§ã¯ããé
眮ãã50ããªç§ããšã«èµ·åããããã«èšå®ãããã®ã€ãã³ããã³ãã©ãŒã§åãInvalidateRectïŒïŒé¢æ°ãåŒã³åºããŸããã¡ã€ã³ã¡ãã¥ãŒãããã²ãŒãããŠã¢ãŒãã«ãã€ã¢ãã°ãæäœãããšããã«ãŒãã¬ã³ããªã³ã°ã¯äœæ¥ãç¶ããŸããããããã®ç¬éã«ã¯ãFPSãš3Dã·ãŒã³å
šäœã®ã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ãé©åã«è©äŸ¡ããããšãã§ããªããªããŸãã ãã ãããŠãŒã¶ãŒãã¡ã€ã³ã¡ãã¥ãŒãšãã€ã¢ãã°ããã¯ã¹ãéããç¬éã«èå³ãæã€å¯èœæ§ã¯äœããã
ãç¡éã®ã¬ã³ããªã³ã°ãµã€ã¯ã«ã®
é£ç¶æ§ã«çŠç¹ãåœãŠãããšã¯ãããŸããã -ã·ãŒã³ããããŠæ®ãã¯ããã»ã©éèŠã§ã¯ãªããèªè
ã«ä»»ãããŠããŸã-åžæãã人ã¯ãTTimerã§èªåèªèº«ã§ç¬éãå®çŸãããããæåŸ
ã©ããã«æ©èœããããšã確èªã§ããŸãã
å¥ã®ã³ã³ãããŒã«ã§3Dã·ãŒã³ãæç»ãã
ããã°ã©ã ãŠã£ã³ããŠã®äžéšãDirect3Dã·ãŒã³ã®ã¬ã³ããªã³ã°çšã«äºçŽããããã®ä»ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã³ã³ãããŒã«çšã«äºçŽãããŠããå Žåãããã°ã©ã ãŠã£ã³ããŠå
šäœã«ãããªã¡ã¢ãªãå²ãåœãŠãããšã¯å®å
šã«ã¯æ£ãããããŸããã
ããã«ïŒãŸãã¯ä»ã®ã³ã³ãããŒã«ïŒãäœæããå¿
èŠã«å¿ããŠããã°ã©ã ãŠã£ã³ããŠãšå
±ã«ãã®ãµã€ãºã倿ŽãïŒAlignããããã£ã䜿çšããŠã³ã³ãããŒã«ãµã€ãºãèªåçã«èª¿æŽãããšäŸ¿å©ã§ãïŒãDirect3Dã·ãŒã³ãã¬ã³ããªã³ã°ãããšãã«å€æãããªãã¯ã¹ã§ãã·ã£ãŒãããºã ãã軜æžããæ¹ãè«ççã§ãã
æ®å¿µãªãããããããªãã¯ãOnPaintã€ãã³ããã³ãã©ãæã€TPanelã®ãããªæšæºã®äœæ©èœã³ã³ãããŒã«ãèŠã€ããããšãã§ããªãã£ããããTCustomControlåŸç¶ã³ã³ããŒãã³ãïŒä»ã®ã¯ã©ã¹ã䜿çšå¯èœïŒãå®è£
ããPaintïŒïŒã¡ãœããããªãŒããŒããŒãããå¿
èŠããããŸããã
ãã®ãããªå®è£
ã¯éåžžã«ç°¡åã§ããããªã±ãŒã·ã§ã³ã«æ·»ä»ãããŠãããœãŒã¹ã³ãŒãã«ã¯ããµããã£ã¬ã¯ããªã03-TCustomControlåå«ãã«åæ§ã®äŸãå«ãŸããŠããŸãã
ãŠã£ã³ããŠã®ã¬ã³ããªã³ã°æã«Windowsã¹ãã³ãšããã«ãããã¡ãªã³ã°ã䜿çšãã
ãããªã±ãŒã·ã§ã³ã«æ·»ä»ãããŠãããœãŒã¹ã³ãŒãã§ã¯ãDelphiãããžã§ã¯ãã®èšå®ã«ãããã§ã¹ããå«ãŸããŠãããWindowsããŒãããµããŒãããŠãããããDelphiã§ã³ã³ãã€ã«ãããããã°ã©ã ã®ã©ã³ã¿ã€ã ã¯å®å
šã«ã¢ãã³ã«èŠããŸãã
Lazarusãããžã§ã¯ãã«é¢ããŠã¯ããã®ãããªãããã§ã¹ããèšå®ããããšã¯ã§ããŸãããããã¯ãæ®å¿µãªããå¶ç¶ã§ã¯ãããŸãããæå³çã«èšå®ããã®ã§ããã®çç±ã説æããŸãã
VCLããã³LCLã³ã³ããŒãã³ãã©ã€ãã©ãªã¯ããŠã£ã³ããŠã®ã¬ã³ããªã³ã°æã«ããã«ãããã¡ãªã³ã°ã䜿çšã§ããŸãã ãµã³ãã«ãããžã§ã¯ãã§ã¯ãããã«ãããã¡ãªã³ã°ãç¡å¹ã«ããFormCreateïŒïŒãã³ãã©ãŒã®è¡ãèŠãããšãã§ããŸãã
Direct3Dã䜿çšããŠãŠã£ã³ããŠãæç»ãããšãã«ããã«ãããã¡ãªã³ã°ãç¡å¹ã«ããããšãéèŠãªã®ã¯ãªãã§ããïŒ ãŠã£ã³ããŠãšã³ã³ãããŒã«ã®æç»ã¯ãGDIããŒã«ã䜿çšããŠãããã®ã©ã€ãã©ãªã«ãã£ãŠå®è¡ãããããã§ãã ãŸãããµã³ãã«ããã°ã©ã ã®Direct3Dã¯ãŠã£ã³ããŠã«çŽæ¥åºåãããã«ã¹ã¿ã ãããã«ãããã¡ãªã³ã°ããã€ãã¹ãããããããã«ãããã¡ãªã³ã°ããªã³ã«ãªã£ãŠããå Žåãã³ã³ããŒãã³ãã©ã€ãã©ãªã¯ãªã³ã¹ã¯ãªãŒã³ãããã¡ã«é»ãé·æ¹åœ¢ã ããåãåããŸãããªã³ã¹ã¯ãªãŒã³ãããã¡ã«ã¯äœããªãããã§ããå¡è£
æžã¿ïŒ ãããã£ãŠãããã«ãããã¡ãªã³ã°ããªã³ã«ãªã£ãŠããåæç»ã§ã¯ã次ã®ã·ããªãªãçºçããŸããã©ã€ãã©ãªã¯ç»é¢äžã®ãããã¡ãäœæããé»ã§ã¯ãªã¢ããŸããæ¬¡ã«ãOnPaintïŒïŒãã³ãã©ã¯ãDirect3Dã䜿çšããŠã·ãŒã³ãæç»ããã³ã³ããŒãã³ãã®ã©ã€ãã©ãªã«ãã£ãŠäœæãããç»é¢äžã®ãããã¡ããã€ãã¹ããŠè¡šç€ºããŸã...ãããŠãOnPaintïŒïŒãã³ãã©ãŒã®å®è¡åŸãã³ã³ããŒãã³ãã©ã€ãã©ãªã¯ãDirect3Dã䜿çšããŠåãåã£ãç»åã®äžã«ç©ºã®ãããã¡ãŒïŒé»ãé·æ¹åœ¢ïŒãæç»ããŸãã
ãã®çµæãããã«ãããã¡ãªã³ã°ãæå¹ã«ãããšãéåžžã«ç®ç«ã€ïŒãŸãã«ããã©ãã·ã¥ãã®ããé»ããŠã£ã³ããŠãŸã§ïŒã¡ãã€ãã®ããã°ã©ã ãŠã£ã³ããŠãã§ããŸããããã¯ããããžã§ã¯ãã®FormCreateïŒïŒãã³ãã©ãŒã®å¯Ÿå¿ããè¡ã倿Žããããšã«ããããµã³ãã«ããã°ã©ã ã§ç¢ºèªã§ããŸãããããããããªãã¯ãã§ã«ããã«ã€ããŠèããŸãã-ãã¹ãŠã®ãµã³ãã«ããã°ã©ã ã§ããã«ãããã¡ãªã³ã°ãç¡å¹ã«ãªã£ãŠããå Žåãã©ã®ãããªåé¡ãçºçããå¯èœæ§ããããŸããïŒæããŠãã ãã-DoubleBufferedããããã£ïŒãŸãã¯ã¿ãŒã²ããã³ã³ãããŒã«ïŒãFALSEã«èšå®ãããŠããå Žåã§ããLCLã³ã³ããŒãã³ãã©ã€ãã©ãªã䜿çšããŠLazarusã§äœæãããããã°ã©ã ã¯ãããã°ã©ã ã«Windowsçšã®ããŒããããå ŽåïŒäžèšã®ãããã§ã¹ããã¡ã€ã«ã䜿çšïŒãããã«ãããã¡ãªã³ã°ã䜿çšããŸããããã®èšŒæã¯éåžžã«ç°¡åã§ããLCLã©ã€ãã©ãªã®win32callback.incããããŒãã¡ã€ã«ã«ãWindowProcïŒïŒé¢æ°ã®ã³ãŒãã«æ¬¡ã®è¡ããããŸãã useDoubleBuffer := (ControlDC = 0) and (lWinControl.DoubleBuffered or ThemeServices.ThemesEnabled);
æ¡ä»¶ã®æåŸã®éšåã«æ³šæããŠãã ãã-å©çšå¯èœãªWindowsããŒãã§DoubleBufferedããããã£ãç¡å¹ã«ããããšã®ç¡é§ããéåŒã«èª¬æããŠããŸããDelphiã®VCLã©ã€ãã©ãªã«ã€ããŠã¯ãã¹ãã³ã®äœ¿çšæã«ããã«ãããã¡ãªã³ã°ãªãã§å®è¡ã§ããŸããVCLã®è
žããã®åæ§ã®è¡ã¯æ¬¡ã®ãšããã§ãã if not FDoubleBuffered or (Message.DC <> 0) then
ããã§ãã¹ãŠã§ãããæž
èŽããããšãããããŸãããææãžã®æçšãªè¿œå ãšå»ºèšçãªæ¹å€ãã³ã¡ã³ãã§åŸ
ã£ãŠããŸãããœãŒã¹ã³ãŒã
ãã®åºçç©ã®ãµã³ãã«ããã°ã©ã ã¯ã次ã®ãªã³ã¯ããå
¥æã§ããŸãïŒgithub.com/yizraor/PubDX_VCL_LCLãã¿ãã¬ïŒç§ã¯githubã䜿çšããããšã¯ãããŸãããæ£ãããªãããšãé¡ã£ãŠããŸãïŒ