ããªãWPFã¯ãã¹ãŠã®çãç©ãããçãçãããŠããã®ã§ããïŒãããã³ã7幎éã®WPFïŒäœãå€ãã£ãã®ãïŒããšãããšã³ããªã«ã€ããŠè°è«ããããšã§ããã®èšäºã翻蚳ããããã«ä¿ãããŸãããæåã¯ãã®èšäºãå
¬éããããããŸããã§ããã ããã¯å€±ç€Œãªããã«æãã-æ»è
ã«ã€ããŠããŸã話ãããäœãèšããªãã§ãã ããã ããããç§ãæ¬åœã«æè¬ããŠããæèŠãæã€äººã
ãšã®ããã€ãã®äŒè©±ã¯ãç§ã®å¿ãå€ããŸããã Microsoftãã©ãããã©ãŒã ã«å€å€§ãªåŽåãè²»ãããéçºè
ã¯ããã®äœæ¥ã®å
éšæ©èœã«æ³šæããå¿
èŠããããŸããããããããšã§ãè¡ãè©°ãŸãã«é¥ã£ãå Žåãäœãèµ·ãã£ãã®ããç解ãããã©ãããã©ãŒã éçºè
ã®åžæãããæ£ç¢ºã«å®åŒåã§ããŸãã ç§ã¯WPFãšSilverlightãåªãããã¯ãããžãŒã ãšèããŠããŸããã...éå»æ°ãæã«ããã£ãŠç§ã®Twitterããã©ããŒããŠããå Žåãããã€ãã®çºèšã¯WPFãšSilverlightã®ããã©ãŒãã³ã¹ã«å¯Ÿããæ ¹æ ã®ãªãæ»æã®ããã«æãããããããŸããã ãªããããæžããã®ã§ããïŒ çµå±ã®ãšãããç§ã¯é·å¹Žã«ããã£ãŠäœåæéãèªåã®æéãè²»ããããã©ãããã©ãŒã ã®ä¿é²ãå³æžé€šã®éçºãã³ãã¥ããã£ã®ã¡ã³ããŒã®æ¯æŽãªã©ãããŸããã å人çã«å人çã«èå³ããããŸãã ãã©ãããã©ãŒã ãæ¹åããŠã»ããã
ããã©ãŒãã³ã¹ãçç£æ§ãçç£æ§äžæ¯æ§ã®ããæ¶è²»è
å¿åã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãèšèšããå Žåãããã©ãŒãã³ã¹ãæãéèŠã§ãã ããããªããã°ãä»ã®ãã¹ãŠã¯æå³ããããŸããã ã€ã³ã¿ãŒãã§ãŒã¹ãé
ãããããã€ã³ã¿ãŒãã§ãŒã¹ãäœååçŽåããå¿
èŠããããŸãããïŒ æ¢åã®ãã¯ãããžãŒã§ã¯å®è£
ã§ããªãããããæ°ããé©æ°çãªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã¢ãã«ããäœåæãã€ããã®ã§ããã 2.4 GHzã®åšæ³¢æ°ã®ã¯ã¢ããã³ã¢ããã»ããµãé©åã«åäœããå¿
èŠããããšé¡§å®¢ã«äœåèšã£ãŠããŸããïŒ ã¯ã©ã€ã¢ã³ãã¯ãWPFãšSliverlightã§iPadã¢ããªã±ãŒã·ã§ã³ãšåãæ»ãããªã€ã³ã¿ãŒãã§ã€ã¹ãååŸã§ããªãçç±ãç¹°ãè¿ãå°ããŠããŸããã4å匷åãªPCã䜿çšããŠããå Žåã§ãã§ãã ãããã®ãã¯ãããžãŒã¯ããžãã¹ã¢ããªã±ãŒã·ã§ã³ã«é©ããŠããå ŽåããããŸããã次äžä»£ã®ãŠãŒã¶ãŒã¢ããªã±ãŒã·ã§ã³ã«ã¯æããã«é©ããŠããŸããã
ãã ããWPFã¯ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã䜿çšããŸãã ãªãããªãã¯ãããå¹æããªããšæããŸããïŒWPFã¯å®éã«ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã䜿çšããŠãããå
éšå®è£
ã®ããã€ãã®åŽé¢ã¯éåžžã«ããŸãè¡ãããŠããŸãã æ®å¿µãªãããGPUã®äœ¿çšçã¯å®éãããã¯ããã«äœããªã£ãŠããŸãã WPFã¬ã³ããªã³ã°ã·ã¹ãã ã¯éåžžã«åŒ·åãªåã䜿çšããŸãã ãã®å£°æã以äžã«èª¬æããããšæããŸãã
WPFã¬ã³ããªã³ã°ãŠããããã¹ã®åæããã©ãŒãã³ã¹åæã®ããã«ãWPFå
ã§å®éã«äœãèµ·ãã£ãŠããã®ããç解ããå¿
èŠããããŸãã ãã®ããã«ãDirectX SDKã«å梱ãããŠããDirect3Dãããã¡ã€ã©ãŒã§ããPIXã䜿çšããŸããã PIXã¯D3Dã¢ããªã±ãŒã·ã§ã³ãèµ·åãããã¹ãŠã®Direct3DåŒã³åºãã«ããã€ãã®ã€ã³ã¿ãŒã»ãã¿ãŒãæ¿å
¥ããŠãããããåæããã³ç£èŠããŸãã
å·Šããå³ã«2ã€ã®æ¥åã衚瀺ããåçŽãªWPFã¢ããªã±ãŒã·ã§ã³ãäœæããŸããã äž¡æ¹ã®æ¥åã¯åãè²ïŒïŒ55F4F4F5ïŒã§ãé»ã茪éãããŠããŸãã
ãããŠãWPFã¯ãããã©ã®ããã«ã¬ã³ããªã³ã°ããŸããïŒãŸããWPFã¯åæç»ããããšããŠããããŒãã£ãšãªã¢ãã¯ãªãŒã³ã¢ããããŸãïŒïŒff000000ïŒã GPUãã€ãã©ã€ã³ã®æçµçãªããŒãžã¹ããŒãžã«éä¿¡ããããã¯ã»ã«æ°ãæžããã«ã¯ãããŒãã£ãšãªã¢ãå¿
èŠã§ãã ããã«ãããåããã»ã¬ãŒã·ã§ã³ãå¿
èŠãªãžãªã¡ããªã®éãæžããšä»®å®ããããšãã§ããŸããããã«ã€ããŠã¯åŸã§è©³ãã説æããŸãã æ±ããéšåããããã«ãããšããã¬ãŒã ã¯æ¬¡ã®ããã«ãªããŸã
ãã®åŸãWPFã¯äžå¯è§£ãªããšãè¡ããŸãã ãŸããé ç¹ãããã¡ãŒããã£ã±ãã«ããŠãããæ±ããé åã«é·æ¹åœ¢ã®ãããªãã®ãæç»ããŸãã ãã¬ãŒã ã¯æ¬¡ã®ããã«ãªããŸãïŒãšããµã€ãã£ã³ã°ã§ãããïŒïŒïŒ
ãã®åŸãCPUäžã®æ¥åãããã»ã¬ãŒã·ã§ã³ããŸãã æ¢ã«ãåç¥ãããããŸããããããã»ã¬ãŒã·ã§ã³ã¯ã100x100ã®æ¥åã®ãžãªã¡ããªãäžé£ã®äžè§åœ¢ã«å€æããããšã§ãã ããã¯æ¬¡ã®çç±ã§è¡ãããŸãïŒ1ïŒäžè§åœ¢ã¯GPUã®èªç¶ãªã¬ã³ããªã³ã°ãŠãããã§ã2ïŒæ¥åããã»ã¬ãŒã·ã§ã³ã¯æ°çŸã®äžè§åœ¢ã®ã¿ãããããããšãã§ããCPUã«ããã¢ã³ããšã€ãªã¢ã·ã³ã°ã§10,000ãã¯ã»ã«ãã©ã¹ã¿ã©ã€ãºãããããã¯ããã«é«éã§ãïŒSilverlightãè¡ããŸãïŒã 以äžã®ã¹ã¯ãªãŒã³ã·ã§ããã¯ãããã»ã¬ãŒã·ã§ã³ãã©ã®ããã«èŠãããã瀺ããŠããŸãã 3Dã°ã©ãã£ãã¯ã«ç²ŸéããŠããèªè
ã¯ãããããäžè§åœ¢ã®ã¹ãã©ã€ãã§ããããšã«æ°ä»ããããããŸããã ããã»ã¬ãŒã·ã§ã³ã§ã¯ãæ¥åãäžå®å
šã«èŠããããšã«æ³šæããŠãã ããã 次ã®ã¹ããããšããŠãWPFã¯ããã»ã¬ãŒã·ã§ã³ãååŸããŠé ç¹GPUãããã¡ãŒã«ããŒãããXAMLã§æ§æãããããã©ã·ãã䜿çšããããã«æ§æããããã¯ã»ã«ã·ã§ãŒããŒã䜿çšããŠå¥ã®æç»åŒã³åºããè¡ããŸãã
æ¥åã®äžå®å
šæ§ã«æ³šæããããšãèŠããŠããŸããïŒ æ¬åœã«ããã§ãã WPFã¯ãDirect3Dããã°ã©ããŒããã©ã€ã³ãªã¹ãããšããŠç¥ã£ãŠãããã®ãçæããŸãã GPUã¯ãäžè§åœ¢ã ãã§ãªãç·ãèªèããŸãã WPFã¯ãããã®ç·ã§é ç¹ãããã¡ãåããäœãæšæž¬ããŸããïŒ æ£ç¢ºã«ãå¥ã®æç»åŒã³åºããè¡ããŸããïŒ è¡ã®ã»ããã¯æ¬¡ã®ããã«ãªããŸãã
ããã§ãWPFã¯æ¥åã®æç»ãå®äºããŸããã ããïŒ ãµãŒããããå¿ããŠããŸããŸããïŒ ãã¹ã¯è¡ã®ã³ã¬ã¯ã·ã§ã³ã§ããããŸãã ãŸããé ç¹ãããã¡ã«ãéä¿¡ãããå¥ã®æç»åŒã³åºããè¡ãããŸãã ã¢ãŠãã©ã€ã³ã¯æ¬¡ã®ããã«ãªããŸã
ãã®æç¹ã§ãæ¥åã1ã€æç»ãããŠããããããã¬ãŒã ã¯æ¬¡ã®ããã«ãªããŸãã
ã·ãŒã³å
ã®æ¥åããšã«æé å
šäœãç¹°ãè¿ãå¿
èŠããããŸãã ç§ãã¡ã®å Žåã2åã§ãã
ããããŸããã ãããããã©ãŒãã³ã¹ã«æªãã®ã¯ãªãã§ããïŒæåã«æ°ä»ãã®ã¯ã1ã€ã®æ¥åãã¬ã³ããªã³ã°ããããã«ã3ã€ã®æç»åŒã³åºããšé ç¹ãããã¡ãŒãžã®2ã€ã®åŒã³åºããå¿
èŠã ã£ãããšã§ãã ãã®ã¢ãããŒãã®éå¹çæ§ã説æããã«ã¯ãGPUã®åäœã«ã€ããŠå°ã話ããªããã°ãªããŸããã ãŸã第äžã«ãææ°ã®GPUã¯éåžžã«é«éã§ãCPUãšéåæã«åäœããŸãã ãã ããäžéšã®æäœã§ã¯ããŠãŒã¶ãŒã¢ãŒãããã«ãŒãã«ã¢ãŒããžã®ç§»è¡ã«ã³ã¹ãã®ãããåãæ¿ããçºçããŸãã é ç¹ãããã¡ãåãããšãã¯ããããã¯ããå¿
èŠããããŸãã ãã®æç¹ã§GPUããããã¡ã䜿çšããŠããå Žåãããã«ããGPUãCPUãšåŒ·å¶çã«åæãããããã©ãŒãã³ã¹ãåçã«äœäžããŸãã D3DUSAGE_WRITEONLYã§é ç¹ãããã¡ãŒãäœæãããŸã| D3DUSAGE_DYNAMICããããããããããã¯ããããšãïŒããã¯ãã°ãã°èµ·ããïŒãD3DLOCK_DISCARDã¯äœ¿çšãããªãã ããã«ããããããã¡ãŒãGPUã«ãã£ãŠæ¢ã«äœ¿çšãããŠããå ŽåãGPUã§é床ã®äœäžïŒGPUãšCPUã®åæïŒãçºçããå¯èœæ§ããããŸãã å€æ°ã®æç»åŒã³åºãã®å Žåãã«ãŒãã«ã¢ãŒããžã®ç§»è¡ãå€ãçºçãããã©ã€ããŒã«å€§ããªè² è·ããããå¯èœæ§ãé«ããªããŸãã ããã©ãŒãã³ã¹ãæ¹åããã«ã¯ãã§ããã ãå€ãã®äœæ¥ãGPUã«éä¿¡ããå¿
èŠããããŸããããããªããšãCPUãããžãŒã«ãªããGPUãã¢ã€ãã«ç¶æ
ã«ãªããŸãã ãã®äŸã§ã¯ã1ã€ã®ãã¬ãŒã ã«ã€ããŠã®ã¿è©±ããŠããããšãå¿ããªãã§ãã ããã å
žåçãªWPFã€ã³ã¿ãŒãã§ãŒã¹ã¯ãæ¯ç§60ãã¬ãŒã ãåºåããããšããŸãïŒ ã¬ã³ããªã³ã°ã¹ããªãŒã ãããã»ããµãéåžžã«æ¿ããããŒãããŠããçç±ãèŠã€ããããšããããšãããå Žåãã»ãšãã©ã®ããŒãã¯GPUãã©ã€ãããã®ãã®ã§ããããšãããããŸãã
ãããŠããã£ãã·ã¥ãããã³ã³ããžã·ã§ã³ã¯ã©ãã§ããïŒ çç£æ§ãåäžããŸãïŒééããªããå¢å ããŸãã ãã£ãã·ã¥ãã«ããŸãã¯BitmapCacheã¯ããªããžã§ã¯ããGPUãã¯ã¹ãã£ã«ãã£ãã·ã¥ããŸãã ããã¯ãCPUã®ãµã€ãºãå€æŽããå¿
èŠããªããGPUãåã©ã¹ã¿ã©ã€ãºããå¿
èŠããªãããšãæå³ããŸãã 1ã€ã®ã¬ã³ããŒãã¹ãå®è¡ããå ŽåãWPFã¯ãããªã¡ã¢ãªã®ãã¯ã¹ãã£ã䜿çšããã ãã§ãããã©ãŒãã³ã¹ãåäžããŸãã BitmapCacheã®æ¥åã¯æ¬¡ã®ãšããã§ãã
ãããããã®å ŽåãWPFã«ã¯æãåŽé¢ããããŸãã BitmapCacheããšã«ãåå¥ã®æç»åŒã³åºããè¡ããŸãã ç§ã¯ãããã€ããŸãããæã«ã¯ãåäžã®ãªããžã§ã¯ãïŒããžã¥ã¢ã«ïŒãã¬ã³ããªã³ã°ããããã«æç»åŒã³åºããè¡ãå¿
èŠãããå ŽåããããŸãã äœã§ãèµ·ãããŸãã ããããã¢ãã¡ãŒã·ã§ã³åãããBitmapCachedæ¥åã300åãã<Canvas />ãããã·ããªãªãæ³åããŠã¿ãŸãããã é«åºŠãªã·ã¹ãã ã§ã¯ã300ã®ãã¯ã¹ãã£ãã¬ã³ããªã³ã°ããå¿
èŠãããããããã¯ãã¹ãŠzé ã§ããããšãç解ãããŸãã ãã®åŸã圌女ã¯æ倧ãµã€ãºã®ããã±ãŒãžãåéããŸããèŠããŠããéããDX9ã¯äžåºŠã«æ倧
16ã®å
¥åèŠçŽ ïŒãµã³ãã©ãŒå
¥åïŒã䜿çšã§ããŸãã ãã®å Žåã300ã®ä»£ããã«16ã®æç»åŒã³åºããè¡ãããCPUã®è² è·ã倧å¹
ã«åæžãããŸãã 1ç§ããã60ãã¬ãŒã ã®èŠ³ç¹ãããè² è·ã1ç§ããã18,000ã®æç»åŒã³åºããã1125ã«æžãããŸããDirect3D 10ã§ã¯ãå
¥åèŠçŽ ã®æ°ã
ã¯ããã«å€ããªããŸãã
ããŠãç§ã¯ãã®å Žæãèªã¿ãŸããã WPFããã¯ã»ã«ã·ã§ãŒããŒã䜿çšããæ¹æ³ãæããŠãã ããïŒWPFã«ã¯ãæ¡åŒµå¯èœãªãã¯ã»ã«ã·ã§ãŒããŒAPIãšããã€ãã®çµã¿èŸŒã¿å¹æããããŸãã ããã«ãããéçºè
ã¯ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã«çã«ãŠããŒã¯ãªå¹æãè¿œå ã§ããŸãã ã·ã§ãŒããŒãæ¢åã®ãã¯ã¹ãã£ã«ãã£ãããããããšãããšãDirect 3Dã¯éåžžãäžéã®ã¬ã³ããŒã¿ãŒã²ããã䜿çšããŸã...çµå±ã®ãšãããæžã蟌ã¿å
ã®ãã¯ã¹ãã£ããµã³ãã«ãšããŠäœ¿çšããããšã¯ã§ããŸããïŒ WPFããããè¡ããŸãããæ®å¿µãªããããã¬ãŒã ããšã«å®å
šã«æ°ãããã¯ã¹ãã£ãäœæããæåŸã«ç Žæ£ããŸãã GPUãªãœââãŒã¹ã®äœæãšç Žæ£ã¯ãåãã¬ãŒã ãåŠçãããšãã«ã§ããæãé
ãããšã®1ã€ã§ãã éåžžãåãéã®ã·ã¹ãã ã¡ã¢ãªãå²ãåœãŠãŠããããã¯è¡ããŸããã ãããã®äžéé¢ãåå©çšããããšã«ãããçç£æ§ã®å€§å¹
ãªåäžãéæã§ããŸãã ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã·ã§ãŒããŒãCPUã«é¡èãªè² è·ããããçç±ãçåã«æã£ãããšãããã°ãçãã¯ããããŸããã
ãããããããGPUã§ãã¯ã¿ãŒã°ã©ãã£ãã¯ã¹ãã¬ã³ããªã³ã°ããå¿
èŠãããã®ã§ããããïŒãã€ã¯ããœããã¯ãããã®åé¡ãä¿®æ£ããããã«å€ãã®åªåãããŸããããæ®å¿µãªããããã¯WPFã§ã¯ãªãDirect 2Dã§è¡ãããŸããã Direct2Dã«ãã£ãŠã¬ã³ããªã³ã°ããã9ã€ã®æ¥åã®ãã®ã°ã«ãŒããèŠãŠãã ããã
ãã¹ãæã€
åäžã®æ¥åãã¬ã³ããªã³ã°ããããã«å¿
èŠãªWPFåŒã³åºãã®æ°ãèŠããŠããŸããïŒ é ç¹ãããã¡ãŒããã¯ã¯ã©ãã§ããïŒ Direct2Dã¯ãããã1åã®åŒã³åºãã§è¡ããŸãã ãã»ã¬ãŒã·ã§ã³ã¯æ¬¡ã®ããã«ãªããŸã
Direct 2Dã¯ãå¯èœãªéãäžåºŠã«æç»ãè©Šã¿ãGPU䜿çšçãæ倧åããCPUè² è·ãæå°åããŸãã
ãã®ããŒãžã®
æåŸã«ãã InsightsïŒDirect2D Renderingãèªãã§ãã ãããMarkLawrenceãDirect 2Dã®å
éšè©³çŽ°ã®å€ãã説æããŠããŸãã Direct 2Dã®ãã¹ãŠã®é床ã«ããããããã2çªç®ã®ããŒãžã§ã³ã§ã¯ããã«å€ãã®é åãæ¹åãããããšã«æ°ä»ããããããŸããã Direct 2Dã®ããŒãžã§ã³2ã¯ãDX11ããã»ã¬ãŒã·ã§ã³ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã䜿çšããå¯èœæ§ããããŸãã
Direct 2D APIãèŠããšãã³ãŒãã®å€§éšåãWPFããååŸããããšæ³å®ã§ããŸãã Michael Wallentããã®æè¡ã«åºã¥ããGDI代æ¿åã®éçºã«ã€ããŠèªã£ãŠãããã®
å€ãAvalonãããªããã§ãã¯ããŠãã ããã éåžžã«ãã䌌ã幟äœåŠçãªAPIãšçšèªãæã£ãŠããŸãã å
éšã¯äŒŒãŠããŸãããéåžžã«æé©åãããŠãããã¢ãã³ã§ãã
Silverlightã¯ã©ãã§ããïŒSilverlightãå®è¡ã§ããŸãããããã¯åé·ã§ãã Silverlightã®ã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ãäœãã§ãããçç±ã¯ç°ãªããŸãã CPUãæç»ããããã«äœ¿çšããŸãïŒèŠããŠããéãã§ã¯ããããã¯éšåçã«ã¢ã»ã³ãã©ãŒã§èšè¿°ãããŠããŸãïŒããCPUã¯GPUã®å°ãªããšã10ã30åé
ãã§ãã ããã«ããããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®ã¬ã³ããªã³ã°ã®åŠçèœåã倧å¹
ã«äœäžããã¢ããªã±ãŒã·ã§ã³ã®ããžãã¯ã®åŠçèœåãããã«äœäžããŸãã ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã®éçºã¯éåžžã«äžååã§ãWPFã®ãã£ãã·ã¥æ§é ãã»ãŒæ£ç¢ºã«ç¹°ãè¿ããåæ§ã®åäœãããBitmapCacheïŒBitmapCachedããžã¥ã¢ã«ïŒã䜿çšããŠåãªããžã§ã¯ãã®æç»åŒã³åºããè¡ããŸãã
ã§ã¯ãä»äœãããŸããïŒãã®è³ªåã¯ãWPFããã³Silverlightã§åé¡ãçºçããã¯ã©ã€ã¢ã³ãããããèãããŸãã æ®å¿µãªãããæ確ãªçãã¯ãããŸããã ç¹å®ã®ããŒãºã«åãããŠç¬èªã®ãã¬ãŒã ã¯ãŒã¯ãäœæã§ãã人ã ãããã«ã¯WPFãšSLã«ä»£ãããã®ããªããããæ®ãã¯æ¡ä»¶ã«åãããå¿
èŠããããŸãã ã¯ã©ã€ã¢ã³ããåã«ããžãã¹ã¢ããªã±ãŒã·ã§ã³ãéçºããã ãã§ããã°ãã¹ããŒãã«é¢ããåé¡ã¯ããã»ã©å€ããªããããã°ã©ãã®çç£æ§ã享åããã ãã§ãã æ¬åœã«èå³æ·±ãã€ã³ã¿ãŒãã§ãŒã¹ïŒã€ãŸããã³ã³ã·ã¥ãŒããŒã¢ããªãããªã¹ã¯ã¢ããªïŒãæ§ç¯ããã人ã«ã¯ãæ¬åœã®åé¡ããããŸãã
翻蚳ã®éå§åŸãã§ã«ãèšç»ãããããã©ãŒãã³ã¹ã®æé©åãšWPF 4.6ã§ã®DX10-11ã®äœ¿çšã«é¢ãããã¥ãŒã¹ãæ²èŒãããŸããã ãã¥ãŒã¹ã®èšäºã«èšèŒãããŠããåé¡ã解決ããããã©ããã¯å®å
šã«ã¯æããã§ã¯ãããŸããã
ãœãŒã¹èšäºïŒ
WPFã¬ã³ããªã³ã°ã·ã¹ãã ã®éèŠãªè©³çŽ°