åæžã
Mass Effectã¯ã人æ°ã®ããsci-fiRPGãã©ã³ãã£ã€ãºã§ããæåã®éšåã¯ãMicrosoftãšã®åæã«åºã¥ããŠã2007幎åŸåã«Xbox360å°çšã«BioWareã«ãã£ãŠæåã«ãªãªãŒã¹ãããŸãããæ°ãæåŸã®2008幎åã°ãã²ãŒã ã¯DemiurgeStudiosã«ãã£ãŠéçºãããPCããŒããåãåããŸããã AMDã2011幎ã«æ°ããBulldozerã¢ãŒããã¯ãã£ããã»ããµããªãªãŒã¹ãããŸã§ãããŒãã¯ãŸãšãã§ãç®ç«ã£ãæ¬ é¥ã¯ãããŸããã§ããã 2ã€ã®ã²ãŒã ãã±ãŒã·ã§ã³ïŒNoveriaãšIlosïŒã§ææ°ã®AMDããã»ããµãæèŒããPCã§ã²ãŒã ãèµ·åãããšãæ·±å»ãªã°ã©ãã£ãã¯ã¢ãŒãã£ãã¡ã¯ãã衚瀺ãããŸãã
ã¯ããèŠãç®ã¯éãã§ãã
ããã«ãã£ãŠã²ãŒã ããã¬ã€ã§ããªããªãããã§ã¯ãããŸãããããããã®ã¢ãŒãã£ãã¡ã¯ãã¯ç ©ããããã®ã§ãã幞ããªããšã«ãã³ã³ãœãŒã«ã³ãã³ãã§ç §æããªãã«ããããã²ãŒã ããããå€æŽããŠå£ããç §æãåé€ããããããªã©ã®è§£æ±ºçããããŸããããã®åé¡ã®åå ãå®å šã«ç解ããŠãã人ã¯ããªãããã§ããäžéšã®æ å ±æºã¯ãFPS Counter modããã®åé¡ãä¿®æ£ãããšäž»åŒµããŠããŸãããããã«é¢ããæ å ±ã¯èŠã€ãããŸããã§ãããmodã®ãœãŒã¹ã³ãŒãã¯ãªã³ã©ã€ã³ã«æçš¿ãããŠããªãããã§ãmodããšã©ãŒãä¿®æ£ããæ¹æ³ã«é¢ããããã¥ã¡ã³ãã¯ãããŸããã
ãªããã®åé¡ã¯ãšãŠãèå³æ·±ãã®ã§ããïŒç¹å®ã®ã¡ãŒã«ãŒã®ããŒããŠã§ã¢ã§ã®ã¿çºçãããã°ã¯éåžžã«äžè¬çã§ãããã²ãŒã ã§äœå幎ãçºçããŠããŸããããããç§ã®æ å ±ã«ãããšãããã¯ã°ã©ãã£ãã¯ã¹ã®åé¡ãã°ã©ãã£ãã¯ã¹ã«ãŒãã§ã¯ãªãããã»ããµã«ãã£ãŠåŒãèµ·ããããå¯äžã®ã±ãŒã¹ã§ããã»ãšãã©ã®å Žåãåé¡ã¯ç¹å®ã®GPUã¡ãŒã«ãŒã®è£œåã§çºçããCPUã«ã¯ãŸã£ãã圱é¿ããŸãããããã®å Žåã¯éã«ãªããŸãããããã£ãŠããã®ãšã©ãŒã¯äžæã§ããããã調æ»ãã䟡å€ããããŸãã
ãªã³ã©ã€ã³ãã£ã¹ã«ãã·ã§ã³ãèªãã åŸãåé¡ã¯AMDFXãšRyzenãããã«ããããã ãšããçµè«ã«éããŸãããå€ãAMDããã»ããµãšã¯ç°ãªãããããã®ãããã«ã¯3DNowïŒåœä»€ã»ããããããŸããã..ããšã©ãŒã¯ãããšã¯é¢ä¿ããªãå¯èœæ§ããããŸãããäžè¬ã«ãããããã°ã®åå ã§ãããAMDããã»ããµãèŠã€ãããšãã²ãŒã ããããã®ã³ãã³ãã䜿çšããããšãããšããã³ã³ã»ã³ãµã¹ãã²ãŒããŒã³ãã¥ããã£ã«ãããŸããIntelããã»ããµã§ãã®ãã°ã®æ¢ç¥ã®ã±ãŒã¹ããªãããšãããã³ãã®3DNowïŒAMDã®ã¿ã䜿çšããã³ãã¥ããã£ããã®åœä»€ã»ãããçç±ãšããŠéé£ããã®ãäžæè°ã§ã¯ãããŸããã
ãããããããã¯åé¡ã§ããããããšããŸã£ããç°ãªãäœãããšã©ãŒãåŒãèµ·ãããŠããŸããïŒç¢ºèªããŠã¿ãŸãããïŒ
ããŒã1-ç 究
ãã¬ãªã¥ãŒã
ãã®åé¡ãåçŸããã®ã¯éåžžã«ç°¡åã§ãããAMDããã»ããµãæèŒããPCãæå ã«æã£ãŠããªãã£ããšããåçŽãªçç±ã§ãé·ãéè©äŸ¡ã§ããŸããã§ããã幞ããªããšã«ãä»åã¯ç§ã ãã§ç 究ãè¡ã£ãŠããããã§ã¯ãããŸãã-Rafael Riveraã¯ãAMDããããåãããã¹ãç°å¢ãæäŸããããšã§ãåŠç¿ããã»ã¹ã§ç§ããµããŒãããŸããããã®ãããªæªç¥ã®åé¡ã®åå ã
ãã¹ãç°å¢ãã§ããã®ã§ãæåã¯ãã¡ãããçè«ããã¹ãããŸãã
cpuid
-人ã
ã3DNowïŒããŒã ã®ããã§ãããšæ³å®ããã®ãæ£ããå Žåã¯ãã²ãŒã ã³ãŒãå
ã«ããã®ååšã確èªããããå°ãªããšãCPUã®è£œé å
ãç¹å®ããå Žæãå¿
èŠã§ãããã ãããã®ãããªæšè«ã«ã¯èª€ãããããŸããã²ãŒã ãæ¬åœã«3DNowã䜿ãããšããå ŽåïŒãµããŒãã®å¯èœæ§ã確èªããã«AMDãããã䜿çšãããšãç¡å¹ãªã³ãã³ããå®è¡ããããšãããšã¯ã©ãã·ã¥ããå¯èœæ§ããããŸããããã«ãã²ãŒã ã®ã³ãŒããç°¡åã«èª¿ã¹ããšãCPUã®æ©èœã¯ãã¹ããããŠããªãããšãããããŸãããããã£ãŠããšã©ãŒã®åå ãäœã§ãããã²ãŒã ã¯ãŸã£ããé¢å¿ããªããããããã»ããµæ©èœã®èª€èªãåå ã§ãããšã¯æãããŸããã
ã±ãŒã¹ããããã°ããããšãäžå¯èœã«èŠãå§ãããšããã©ãã¡ãšã«ã¯åœŒã®çºèŠã«ã€ããŠç§ã«ç¥ãããŸãã-PSGPãç¡å¹ã«ããŸãïŒããã»ããµåºæã®ã°ã©ãã£ãã¯ãã€ãã©ã€ã³ïŒãåé¡ãä¿®æ£ãããã¹ãŠã®æåãæ£ããç¹ç¯ããŸãïŒPSGPã¯ãæãåºç¯å²ã«ææžåãããæŠå¿µã§ã¯ãããŸãããã€ãŸããããã¯ãDirect3Dãç¹å®ã®ããã»ããµã®æé©åãå®è¡ã§ããããã«ããã¬ã¬ã·ãŒæ©èœïŒå€ãDirectXããŒãžã§ã³ã®ã¿ïŒã§ãã
DirectXã®ä»¥åã®ããŒãžã§ã³ã«ã¯ãé ç¹åŠçãå¯èœã«ããPSGPãšåŒã°ããã³ãŒãå®è¡ãã¹ããããŸãããã¢ããªã±ãŒã·ã§ã³ã¯ãã®ãã¹ãèæ ®ã«å ¥ããããã»ããµãšã°ã©ãã£ãã¯ã³ã¢ã«ããé ç¹åŠçã®ãã¹ãç¶æããå¿ èŠããããŸããã
ãã®ã¢ãããŒãã§ã¯ãPSGPãç¡å¹ã«ãããšAMDã®ã¢ãŒãã£ãã¡ã¯ããåé€ãããã®ã¯è«ççã§ããæè¿ã®AMDããã»ããµã§éžæããããã¹ã«ã¯äœããã®æ¬ é¥ããããŸãããã©ãããã°ç¡å¹ã«ã§ããŸããïŒ2ã€ã®æ¹æ³ãæãæµ®ãã³ãŸãã
- é¢æ°ã«
IDirect3D9::CreateDevice
ãã©ã°ãæž¡ãããšãã§ããŸãD3DCREATE_DISABLE_PSGP_THREADING
ãããã¯æ¬¡ã®ããã«èª¬æãããŠããŸãïŒ
. , (worker thread), .
, . , «PSGP», , . - DirectX PSGP D3D PSGP D3DX â
DisablePSGP
DisableD3DXPSGP
. . . Direct3D .
DisableD3DXPSGP
ãã®åé¡ã¯è§£æ±º
ã§ããããã§ãããããã£ãŠããµãŒãããŒãã£ã®ä¿®æ£/å€æŽãããŠã³ããŒãããããªãå ŽåããŸãã¯ã²ãŒã ã«å€æŽãå ããã«åé¡ãä¿®æ£ãããå Žåãããã¯å®å
šã«æ©èœããæ¹æ³ã§ãããã®ãã©ã°ãã·ã¹ãã å
šäœã§ã¯ãªããã¹ãšãã§ã¯ãã«ã®ã¿èšå®ãããšããã¹ãŠãæ£åžžã«ãªããŸãã
PIX
ãã€ãã®ããã«ãã°ã©ãã£ãã¯ã¹ã«åé¡ãçºçããå Žåã¯ãPIXã®èšºæã«åœ¹ç«ã€å¯èœæ§ããããŸããIntelããŒããŠã§ã¢ãšAMDããŒããŠã§ã¢ã§åæ§ã®ã·ãŒã³ããã£ããã£ããçµæãæ¯èŒããŸããã1ã€ã®éããããã«ç§ã®ç®ã«çãŸããŸãã-ãã£ããã£ããã°ãèšé²ãããåããã£ããã£ãç°ãªãPCã§ç°ãªã£ãŠèŠããå¯èœæ§ããã以åã®ãããžã§ã¯ãïŒãã©ã€ããŒã®ãã°ãŸãã¯d3d9.dllã瀺ãïŒãšã¯ç°ãªãããããã®ãã£ããã£ã¯ãã°ãæžãçããŸããïŒã€ãŸããIntelããã»ããµãæèŒããPCã§AMDããŒããŠã§ã¢ã§äœæããããã£ããã£ãéããšããã°ã衚瀺ãããŸãã
AMDããIntelãžã®ãã£ããã£ã¯ããããååŸãããããŒããŠã§ã¢ã§èŠããã®ãšãŸã£ããåãã«èŠããŸãã
ããã¯ç§ãã¡ã«äœãäŒããŸããïŒ
- PIX « », D3D , , Intel , AMD .
- , , ( GPU ), , .
èšãæããã°ãããã¯ã»ãŒç¢ºå®ã«ãã©ã€ããŒã®ãã°ã§ã¯ãããŸããã GPUã§æºåãããåä¿¡ããŒã¿ãäœããã®æ¹æ³ã§ç ŽæããŠããããã§ã1ãããã¯ç¢ºãã«éåžžã«ãŸããªã±ãŒã¹ã§ãïŒ
ãã®æ®µéã§ããã°ãèŠã€ããããã«ããã£ããã£éã®ãã¹ãŠã®äžäžèŽãèŠã€ããå¿ èŠããããŸããéå±ãªäœæ¥ã§ãããä»ã«æ¹æ³ã¯ãããŸããã
ãã£ããã£ãããããŒã¿ãé·ãéç 究ããåŸããã£ã©ã¯ã¿ãŒã®äœå šäœãæããšããåŒã³ããã«æ³šæãåããããŸããã
Intelã®è²·åã§ã¯ããã®åŒã³åºãã¯ãç §æãšãã¯ã¹ãã£ãšãšãã«ãã£ã©ã¯ã¿ãŒã®äœã®ã»ãšãã©ãåºåããŸãã AMDã®ã°ã©ãã§ã¯ãé»äžè²ã®ã¢ãã«ãåºåããŸããæ£ããéããã©ã£ãããã§ãã
ãã§ãã¯ã®æåã®æçœãªåè£ã¯ã察å¿ãããã¯ã¹ãã£ã§ããããããã¯åé¡ãªãããã§ãäž¡æ¹ã®ãã£ããã£ã§åãã§ãããã ããäžéšã®ãã¯ã»ã«ã·ã§ãŒããŒå®æ°ã¯å¥åŠã«èŠããŸãã NaNïŒæ°å€ã§ã¯ãªãïŒãå«ãŸããŠããã ãã§ãªããAMDãã£ããã£ã§ã®ã¿æ€åºãããŸãã
1.ïŒQOã¯NaNã®ç¥ã§ã
ææã«èŠããŸã-NaNå€ã¯ãã°ãã°å¥åŠãªã°ã©ãã£ãã¯ã¢ãŒãã£ãã¡ã¯ããåŒãèµ·ãããŸããããããªããšã«ãPlayStation3ããŒãžã§ã³ã®MassEffect 2ã«ã¯ãRPCS3ãšãã¥ã¬ãŒã¿ãŒã§ãéåžžã«ãã䌌ãåé¡ãããããããNaNã«é¢é£ããŠããŸãã
ãã ããä»ã®ãšããããŸãæºè¶³ããªãã§ãã ãã-ãããã¯ä»¥åã®åŒã³åºãããæ®ã£ãå€ã§ãããçŸåšã®åŒã³åºãã§ã¯äœ¿çšãããŠããªãå¯èœæ§ããããŸãã幞ããç§ãã¡ã®å Žåããããã®NaNããã®ç¹å®ã®ã¬ã³ããªã³ã°ã®ããã«D3Dã«æž¡ãããŠããããšã¯æããã§ã...
49652 IDirect3DDevice9::SetVertexShaderConstantF(230, 0x3017FC90, 4)
49653 IDirect3DDevice9::SetVertexShaderConstantF(234, 0x3017FCD0, 3)
49654 IDirect3DDevice9::SetPixelShaderConstantF(10, 0x3017F9D4, 1) // Submits constant c10
49655 IDirect3DDevice9::SetPixelShaderConstantF(11, 0x3017F9C4, 1) // Submits constant c11
49656 IDirect3DDevice9::SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID)
49657 IDirect3DDevice9::SetRenderState(D3DRS_CULLMODE, D3DCULL_CW)
49658 IDirect3DDevice9::SetRenderState(D3DRS_DEPTHBIAS, 0.000f)
49659 IDirect3DDevice9::SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, 0.000f)
49660 IDirect3DDevice9::TestCooperativeLevel()
49661 IDirect3DDevice9::SetIndices(0x296A5770)
49662 IDirect3DDevice9::DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 2225, 0, 3484) // Draws the character model
...ãããŠããã®ã¬ã³ããªã³ã°ã§äœ¿çšããããã¯ã»ã«ã·ã§ãŒããŒã¯ãäž¡æ¹ã®å®æ°ãåç §ããŸãã
// Registers:
//
// Name Reg Size
// ------------------------ ----- ----
// UpperSkyColor c10 1
// LowerSkyColor c11 1
ã©ã¡ãã®å®æ°ãUnrealEngineããçŽæ¥ååŸãããŠããããã§ããã®ååã瀺ãããã«ãç §æã«åœ±é¿ãäžããå¯èœæ§ããããŸãããã³ãŽïŒ
ã²ãŒã å ãã¹ãã¯ç§ãã¡ã®çè«ã確èªããŸã-Intelãã·ã³ã§ã¯ã4ã€ã®NaNå€ã®ãã¯ãã«ããã¯ã»ã«ã·ã§ãŒããŒå®æ°ãšããŠæž¡ãããããšã¯ãããŸãã;ãã ããAMDãã·ã³ã§ã¯ããã¬ãŒã€ãŒãç §æãå£ããå Žæã«å ¥ããšããã«NaNå€ã衚瀺ããå§ããŸãïŒ
ããã¯ä»äºãçµãã£ãããšãæå³ããŸããïŒå£ããå®æ°ãèŠã€ããããšã¯æŠãã®ååã«éããªãã®ã§ãããããã¯ã»ã©é ãã§ããåé¡ã¯ãŸã æ®ã£ãŠããŸã-ãããã¯ã©ãããæ¥ãŠããããã眮ãæããããšãã§ããŸããïŒã²ãŒã å ãã¹ãã§ã¯ãNaNå€ãå€æŽãããšãåé¡ãéšåçã«ä¿®æ£ãããŸãã-éãé»ãæç¹ã¯ãªããªããŸããããæåã¯ãŸã æãããŸãïŒ
ã»ãŒæ£ãã...ãããå®å šã§ã¯ãããŸããã
ãããã®ç §æå€ãã·ãŒã³ã«ãšã£ãŠã©ãã»ã©éèŠã§ããããèãããšããã®è§£æ±ºçã«ãšã©ãŸãããšãã§ããŸãããããããç§ãã¡ã¯æ£ããæ¹åã«é²ãã§ããããšãç¥ã£ãŠããŸãïŒ
æ®å¿µãªããããããã®å®æ°ã®èµ·ç¹ã远跡ããããšãããšãå®éã®å®å ã§ã¯ãªããã¬ã³ããªã³ã°ã¹ããªãŒã ã®ããã«èŠãããã®ã瀺ãããŸãããããããããã°ããããšã¯å¯èœã§ãããã²ãŒã å ããã³/ãŸãã¯UE3é¢é£ã®æ§é éã®ããŒã¿ãããŒã®è¿œè·¡ã«æœåšçã«ç¡éã®æéãè²»ããåã«ãæ°ããã¢ãããŒããè©Šãå¿ èŠãããããšã¯æããã§ãã
ããŒã2-D3DXã詳ããèŠã
äžæ©åŸéããŠãç§ãã¡ã¯ä»¥åã«äœããéããŠããããšã«æ°ã¥ããŸãããã²ãŒã ããä¿®æ£ãããã«ã¯ã2ã€ã®ãšã³ããªã®ãã¡ã®1ã€ãã¬ãžã¹ããªã«è¿œå ããå¿ èŠãããããšãæãåºããŠãã ãã-
DisablePSGP
ãšDisableD3DXPSGP
ããããã®ååãç®çã瀺ããŠãããšä»®å®ãããšãããDisableD3DXPSGP
ã¯ãµãã»ããã§ããå¿
èŠãããDisablePSGP
ãåè
ã¯D3DXã§ã®ã¿PSGPãç¡å¹ã«ããåŸè
ã¯D3DXãšD3Dã®äž¡æ¹ã§ç¡å¹ã«ããŸãããã®ä»®å®ãããã®ã§ãD3DXã«ç®ãåããŸãããã
Mass Effectã¯ã以äžãäœæããŠD3DXæ©èœã»ãããã€ã³ããŒãããŸã
d3dx9_31.dll
ã
D3DXUVAtlasCreate
D3DXMatrixInverse
D3DXWeldVertices
D3DXSimplifyMesh
D3DXDebugMute
D3DXCleanMesh
D3DXDisassembleShader
D3DXCompileShader
D3DXAssembleShader
D3DXLoadSurfaceFromMemory
D3DXPreprocessShader
D3DXCreateMesh
ç§ãã¡ã¯ãã£ããã£ããåŸãæ å ±ãç¥ããã«ãã®ãªã¹ããèŠãå Žåãç§ã¯ããããç¯äººãããããªãããšãåæãšããŠããŸã
D3DXPreprocessShader
ããããã®D3DXCompileShader
ã·ã§ãŒãã誀ã£ãŠæé©åããã³/ãŸãã¯AMDäžã§ã³ã³ãã€ã«ããããšãã§ããããããä¿®æ£ããããšã¯ãã¡ããã¡ãé£ããããšãã§ããŸã- ã
ãã ãããã§ã«ç¥èãããããããªã¹ããã1ã€ã®é¢æ°ã匷調衚瀺ãããŸãããã
D3DXMatrixInverse
ã¯ããã¯ã»ã«ã·ã§ãŒããŒå®æ°ãæºåããããã«äœ¿çšã§ããå¯äžã®é¢æ°ã§ãã
ãã®é¢æ°ã¯ãã²ãŒã å ã®1ã€ã®å Žæããã®ã¿åŒã³åºãããŸãã
int __thiscall InvertMatrix(void *this, int a2)
{
D3DXMatrixInverse(a2, 0, this);
return a2;
}
ããã...ããã¯ããŸãããŸãå®è£ ãããŠããŸãããç°¡åãªèª¿æ»ã«
d3dx9_31.dll
ãããšD3DXMatrixInverse
ãåºåãã©ã¡ãŒã¿ãŒã«ã¯è§Šããããããªãã¯ã¹ã®å転ãäžå¯èœãªå ŽåïŒå
¥åãããªãã¯ã¹ãçž®éããŠããããïŒãæ»ããŸãnullptr
ããã²ãŒã ã¯ãŸã£ããæ°ã«ããŸãããåºåãããªãã¯ã¹ã¯åæåãããŠããªããŸãŸã§ããå¯ââèœæ§ããããŸããå®éãçž®éãããããªãã¯ã¹ã®å転ã¯ã²ãŒã å
ã§çºçããŸããïŒã»ãšãã©ã®å Žåãã¡ã€ã³ã¡ãã¥ãŒã§ïŒãã²ãŒã ã§ããããããé©åã«åŠçããããã«è¡ã£ãæäœïŒããšãã°ãåºåã®ãŒãåãIDãããªãã¯ã¹ã®å²ãåœãŠïŒã§ã¯ãã°ã©ãã£ã«ã«ãªå€æŽã¯ãããŸããããããã©ããªããã§ãã
ãã®çè«ãå蚌ããã®ã§ãPSGPã«æ»ããŸã-PSGPã¯D3DXã§æ£ç¢ºã«äœãããŸããïŒ Rafael Riveraããã®è³ªåã調ã¹ããšããããã®ãã€ãã©ã€ã³ã®èåŸã«ããããžãã¯ã¯éåžžã«åçŽã§ããããšãå€æããŸããã
AddFunctions(x86)
if(DisablePSGP || DisableD3DXPSGP) {
// All optimizations turned off
} else {
if(IsProcessorFeaturePresent(PF_3DNOW_INSTRUCTIONS_AVAILABLE)) {
if((GetFeatureFlags() & MMX) && (GetFeatureFlags() & 3DNow!)) {
AddFunctions(amd_mmx_3dnow)
if(GetFeatureFlags() & Amd3DNowExtensions) {
AddFunctions(amd3dnow_amdmmx)
}
}
if(GetFeatureFlags() & SSE) {
AddFunctions(amdsse)
}
} else if(IsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE /* SSE2 */)) {
AddFunctions(intelsse2)
} else if(IsProcessorFeaturePresent(PF_XMMI_INSTRUCTIONS_AVAILABLE /* SSE */)) {
AddFunctions(intelsse)
}
}
PSGPãç¡å¹ã«ãªã£ãŠããªãå ŽåãD3DXã¯ç¹å®ã®åœä»€ã»ããçšã«æé©åãããæ©èœãéžæããŸããããã¯è«ççã§ãããå ã®çè«ã«æ»ããŸããçµå±ã®ãšãããD3DXã«ã¯AMDãš3DNowïŒåœä»€ã»ããçšã«æé©åãããæ©èœããããããã²ãŒã ã¯æçµçã«ããããéæ¥çã«äœ¿çšããŸãã3DNowïŒåœä»€ããªãææ°ã®AMDããã»ããµã¯ãIntelããã»ããµãšåããã¹ããã©ããŸã
intelsse2
ã
èŠçŽïŒ
- PSGPãç¡å¹ã«ãªã£ãŠããå ŽåãIntelãšAMDã®äž¡æ¹ãéåžžã®ã³ãŒãå®è¡ãã¹ã«åŸããŸã
x86
ã - Intelããã»ããµã¯åžžã«ã³ãŒããã¹
intelsse2
2ãééããŸãã - 3DNowãæèŒããAMDããã»ããµïŒã³ãŒãå®è¡ãã¹
amd_mmx_3dnow
ãŸãã¯ãééããamd3dnow_amdmmx
3DNowã®ãªãããã»ããµã¯ãééãintelsse2
ãŸãã
ãã®æ å ±ãåãåã£ããã仮説ãç«ãŠãŸããAMDSSE2ã³ãã³ãã«äœãåé¡
intelsse2
ãããå¯èœæ§ããããéäžã§AMDã§èšç®ããããããªãã¯ã¹å転ã®çµæãäžæ£ç¢ºãããããå®å
šã«äžæ£ç¢ºã§ãã
ãã®ä»®èª¬ãã©ã®ããã«ãã¹ãã§ããŸããïŒãã¡ããããã¹ãïŒ
PSïŒãã²ãŒã
d3dx9_31.dll
ã§äœ¿çšãããŠããããææ°ã®D3DX9ã©ã€ãã©ãªã«ã¯ããŒãžã§ã³d3dx9_43.dll
ãããããããããã®ãã°ã¯æ°ããããŒãžã§ã³ã§ä¿®æ£ãããããšæããããããããŸãããã²ãŒã ããã¢ããã°ã¬ãŒããããŠææ°ã®DLLããªã³ã¯ããããšããŸããããäœãå€ãããŸããã§ããã
ããŒã3-ç¬ç«ãããã¹ã
ãããªãã¯ã¹å転ã®ç²ŸåºŠããã¹ãããããã®ã·ã³ãã«ã§ç¬ç«ããããã°ã©ã ãçšæããŸãããçãã²ãŒã ã»ãã·ã§ã³äžã«ããã°ã®å Žæã§ããã¹ãŠã®çä¿¡ããŒã¿ãšçºä¿¡ããŒã¿
D3DXMatrixInverse
ããã¡ã€ã«ã«èšé²ããŸããããã®ãã¡ã€ã«ã¯ç¬ç«ãããã¹ãããã°ã©ã ã«ãã£ãŠèªã¿åãããçµæãåèšç®ãããŸããã²ãŒã ã®åºåã¯ããã¹ãããã°ã©ã ã«ãã£ãŠèšç®ãããããŒã¿ãšæ¯èŒãããæ£ç¢ºæ§ãæ€èšŒãããŸãã
PSGPãæå¹/ç¡å¹ã«ããŠIntelããã³AMDãããããåéããããŒã¿ã«åºã¥ããŠäœåºŠãè©Šè¡ããåŸãããŸããŸãªãã·ã³ã®çµæãæ¯èŒããŸãããçµæã以äžã«ç€ºããŸããããã¯ãæåïŒãçµæã¯çããïŒãšå€±æïŒãçµæã¯çãããããŸããïŒå®è¡ããŸããæåŸã®åã¯ãã²ãŒã ãããŒã¿ãæ£ããåŠçããŠããããããã°ãããããã瀺ããŸããæµ®åå°æ°ç¹èšç®ã®äžæ£ç¢ºããæå³çã«ç¡èŠãã以äžã䜿çšããŠçµæãæ¯èŒããŸã
memcmp
ã
æ å ±æº | Intel SSE2 | AMD SSE2 | Intel x86 | AMD x86 | ããŒã¿ã¯ã²ãŒã ã«åãå ¥ããããŸããïŒ |
---|---|---|---|---|---|
Intel SSE2 | ïž | ïž | |||
AMD SSE2 | ïž | ||||
Intel x86 | ïž | ïž | ïž | ||
AMD x86 | ïž | ïž | ïž |
D3DXMatrixInverseãã¹ãçµæ
äžæè°ãªããšã«ãçµæã¯æ¬¡ã®ããšã瀺ããŠããŸãã
- SSE2ã䜿çšããã³ã³ãã¥ãŒãã£ã³ã°ã¯ãIntelãã·ã³ãšAMDãã·ã³ã®éã§ç§»æ€ã§ããŸããã
- SSE2ã䜿çšããªãã³ã³ãã¥ãŒãã£ã³ã°ã¯ããã·ã³éã§ç§»æ€ãããŸãã
- SSE2ã䜿çšããªãèšç®ã¯ãIntel SSE2ã§ã®èšç®ãšã¯ç°ãªããšããäºå®ã«ãããããããã²ãŒã ã«ãã£ãŠãåãå ¥ãããããŸãã
ãããã£ãŠãçåãçããŸããAMDSSE2ã䜿çšããã³ã³ãã¥ãŒãã£ã³ã°ã®äœãåé¡ã«ãªã£ãŠããã®ã§ãããããããã¯ãã²ãŒã ã®äžå ·åã«ã€ãªããããã§ããæ£ç¢ºãªçãã¯ãããŸãããã2ã€ã®èŠå ã®çµæã§ããããã«èŠããŸãã
-
D3DXMatrixInverse
SSE2 â , SSE2 Intel/AMD (, - ), , . - , .
ãã®æ®µé
D3DXMatrixInverse
ã§ãD3DXé¢æ°ã®æžãçŽãããx86ããªãšãŒã·ã§ã³ã眮ãæããä¿®æ£ãäœæããæºåãæŽããŸãããããã§å®äºã§ããããããç§ã¯å¥ã®ã©ã³ãã ãªèããæã£ãŠããŸãã-D3DXã¯å»æ¢ãããDirectXMathã«çœ®ãæããããŸããããšã«ãããã®ãããªãã¯ã¹é¢æ°ãæ¬åœã«çœ®ãæãããå Žåã¯XMMatrixInverse
ãé¢æ°ã®ãææ°ã®ã眮æã§ããã«å€æŽã§ãããšå€æããŸããD3DXMatrixInverse
ããŸãXMMatrixInverse
ãSSE2ã³ãã³ãã䜿çšããŸããã€ãŸããD3DXã®é¢æ°ãšåãããã«æé©ã«ãªããŸããããšã©ãŒã¯åãã§ãããšã»ãŒç¢ºä¿¡ããŠããŸããã
ç§ã¯ããã«ã³ãŒããæžãããããã©ãã¡ãšã«ã«éããŸããããããŠ...ããã¯ããŸããããŸãã
ïŒ ïŒïŒïŒ
æçµçã«ãSSE2ããŒã ã®ããããªéãã®ããã«åé¡ã§ãããšèªèããããšã¯ãéåžžã«æ°å€çãªåé¡ã§ããå¯èœæ§ããããŸããããã¯ã«ãããããã
XMMatrixInverse
ãSSE2ã䜿çšããŠããããIntelãšAMDã®äž¡æ¹ã§å®ç§ãªçµæãäžããŸããããããã£ãŠãåããã¹ããå床å®è¡ãããšãããæ§ããã«èšã£ãŠããçµæã¯äºæ³å€ã§ããã
æ å ±æº | ã€ã³ãã« | AMD | ããŒã¿ã¯ã²ãŒã ã«åãå ¥ããããŸããïŒ |
---|---|---|---|
ã€ã³ãã« | ïž | ïž | ïž |
AMD | ïž | ïž | ïž |
XMMatrixInverseã䜿çšãããã³ãããŒã¯çµæ
ã²ãŒã ãããŸãæ©èœããã ãã§ãªããçµæã¯å®å šã«äžèŽãããã·ã³éã§åŒãç¶ãããŸãã
ããã念é ã«çœ®ããŠããã°ã®åå ã«é¢ããçè«ãä¿®æ£ããŸãããééããªããåé¡ã«ææãããã²ãŒã ã®ããã§ãããã ããè¿œå ã®ãã¹ããè¡ã£ãåŸãD3DXã¯é«éèšç®çšã«äœæãããããã«èŠããDirectXMathã¯èšç®ã®ç²ŸåºŠã«é¢å¿ããããŸããD3DXã¯2000幎代ã®è£œåã§ãããé床ãæåªå äºé ã§ãã£ãããšã¯çã«ããªã£ãŠãããããããã¯è«ççãªããã§ããDirectXMathã¯åŸã§éçºããããããäœæè ã¯æ£ç¢ºã§æ±ºå®è«çãªèšç®ã«ãã£ãšæ³šæãæãããšãã§ããŸããã
ããŒã4-ãã¹ãŠããŸãšãã
èšäºã¯ããªãé·ãããšãå€æããŸãããç§ã¯ããªããç²ããŠããªãããšãæã¿ãŸããç§ãã¡ãè¡ã£ãããšãèŠçŽããŸãããïŒ
- , 3DNow! ( DLL).
- , PSGP AMD.
- PIX â NaN .
- â
D3DXMatrixInverse
. - , Intel AMD, SSE2.
- ,
XMMatrixInverse
.
ç§ãã¡ãå®è£ ããããã«æ®ãããå¯äžã®ããšã¯ãæ£ãã亀æã§ãïŒããã¯ããã¹ãšãã§ã¯ãã®ããSilentPatchã¯ã©ãæ¥ãŠéã³ã«ããã®åé¡ã®æãã¯ãªãŒã³ãªè§£æ±ºç
d3dx9_31.dll
ã¯ãé¢æ°ãé€ããŠããšã¯ã¹ããŒãããããã¹ãŠã®MassEffecté¢æ°ãã·ã¹ãã DLLã«ãªãã€ã¬ã¯ãããã¹ããŒãã¡ãäœæããããšã§ãããšå€æããŸããD3DXMatrixInverse
ããã®æ©èœã®ããã«ããéçºããŸããXMMatrixInverse
ã
亀æçšDLLã¯ãéåžžã«ã¯ãªãŒã³ã§ä¿¡é Œæ§ã®é«ãã€ã³ã¹ããŒã«ãæäŸããã²ãŒã ã®OriginããŒãžã§ã³ãšSteamããŒãžã§ã³ã§ããŸãæ©èœããŸããASIããŒããŒããã®ä»ã®ãµãŒãããŒãã£ãœãããŠã§ã¢ãå¿ èŠãšããã«ãããã«äœ¿çšã§ããŸãã
ç§ãã¡ãç解ããŠããéããã²ãŒã ã¯ãç §æãå°ãå£åãããããšãªããæ¬æ¥ã®ããã«èŠããŸãã
ãããªã¢
ã€ãã¹
ããŠã³ããŒã
å€æŽã¯ModsïŒPatchesããããŠã³ããŒãã§ããŸãããããã¯ãªãã¯ããŠãã²ãŒã ããŒãžã«çŽæ¥ç§»åããŸãã
ãã¹ãšãã§ã¯ãçšã®SilentPatchãããŠã³ããŒãããŸããããŠã³ããŒãããã
ãã¢ãŒã«ã€ããã²ãŒã ãã©ã«ãã«æœåºããã ãã§ãã次ã«äœããã¹ããããããªãå Žåã¯ãã»ããã¢ããæé ããèªã¿ãã ããã
modã®å®å šãªãœãŒã¹ã³ãŒãã¯GitHubã§å ¬éãããŠãããåºçºç¹ãšããŠèªç±ã«äœ¿çšã§ããŸã
ãGitHubã®ãœãŒã¹
ããŒã
- çè«çã«ã¯ãd3d9.dllå ã®ãã°ã§ããå¯èœæ§ããããå°ãè€éã«ãªããŸãã幞ããããã§ã¯ãããŸããã§ããã
- ãã¡ãããSSE2åœä»€ã»ããããããšä»®å®ãããšããããã®åœä»€ã®ãªãIntelããã»ããµã¯ãMassEffectã®æå°ã·ã¹ãã èŠä»¶ãããã¯ããã«è匱ã§ãã
åç §ïŒ