【XBOX360 Porting Trick】三

Posted on 2008-10-25 13:34  活着就是幸福  阅读(300)  评论(0)    收藏  举报

1. Datatype misalignment: 指针地址未对齐(float必须为4字节对齐)
    解决方法:拷贝源数据到新的float数组里,使用数组里的副本进行运算,对于PC上原始未对齐的数据可以免于修改。

2. PC上由于可以直接将Texture作为RenderTarget进行渲染,所以在切换RenderTarget时只要保存当前的 RenderTarget的指针即可。但在XBOX360上由于EDRAM内的不同RenderTarget有可能是重叠的,所以不只能是简单的保存指针,还要将RenderTarget先Resolve到Texture上,在还原RenderTarget的时候再将Texture弄回到 RenderTarget上,会产生两次Resolve,效率比较低下。

(Resolve对于1280x720是0.25ms), 具体步骤如下:

1.Save the pointer pointing to the current render-target:[pOldOne] and resolve the current render-target to a texture[pOldTex].
2.Set another render-target[pNewOne], render, and reslove the result to the texture[pNewTex].
3.Set the [pOldOne] as the original render-target.
4.Clear and render from pOldTex to the render-target [pOldOne].

[ Step 1 and 3 on PC are not needed because textures can be set as render-target on PC directly.  ]

对于保存的原始RenderTarget和Depth/Stencil的Texture, 在Restore的时候:
1. Render-target使用DrawPrimitiveUP方法,覆盖到原始Surface上(先Clear)PixelShader
   1. float4 psMainRTSwitch( float2 Tex0 : TEXCOORD0 ) : COLOR0 {  return tex2D( sam0, Tex0 ); }
2. Depth/Stencil使用DrawPrimitiveUP方法,覆盖到原始Surface上(先Clear)PixelShader(对于D24S8格式)
   1. float   psMainDSSwitch( float2 Tex0 : TEXCOORD0 ) : DEPTH0 {  return tex2D(sam0, Tex0 ).x; }