转自3DM
为何GTA4 PC版要求高得离谱?
答案:GTA4 PC版根本没有经过任何优化,纯粹就是糊弄人的移植。不相信?
看看这段代码:
SetRenderState(p,a,b)
RenderState22 1
SetVertexShader(p,a)
SetVertexShaderConstantF(p,a,b,c)
SetPixelShader(p,a)
SetTexture(p,a,b)
SetSamplerState(p,a,b,c)
SetSamplerState(p,a,b,c)
SetSamplerState(p,a,b,c)
SetSamplerState(p,a,b,c)
SetVertexDeclaration(p,a)
SetStreamSourceFreq(p,a,b)
SetStreamSourceFreq(p,a,b)
SetStreamSource(p,a,b,c,d)
DrawPrimitive(p,a,b,c)
FontIndex 1,D
SetRenderState(p,a,b)
RenderState22 1
SetVertexShaderConstantF(p,a,b,c)
SetTexture(p,a,b)
SetVertexDeclaration(p,a)
SetStreamSourceFreq(p,a,b)
SetStreamSourceFreq(p,a,b)
SetStreamSource(p,a,b,c,d)
DrawPrimitive(p,a,b,c)
FontIndex 1,a
SetRenderState(p,a,b)
RenderState22 1
SetVertexShaderConstantF(p,a,b,c)
SetTexture(p,a,b)
SetVertexDeclaration(p,a)
SetStreamSourceFreq(p,a,b)
SetStreamSourceFreq(p,a,b)
SetStreamSource(p,a,b,c,d)
DrawPrimitive(p,a,b,c)
FontIndex 1,v
SetRenderState(p,a,b)
RenderState22 1
SetVertexShaderConstantF(p,a,b,c)
SetTexture(p,a,b)
SetVertexDeclaration(p,a)
SetStreamSourceFreq(p,a,b)
SetStreamSourceFreq(p,a,b)
SetStreamSource(p,a,b,c,d)
DrawPrimitive(p,a,b,c)
FontIndex 1,e
SetRenderState(p,a,b)
RenderState22 1
SetVertexShaderConstantF(p,a,b,c)
SetTexture(p,a,b)
SetVertexDeclaration(p,a)
SetStreamSourceFreq(p,a,b)
SetStreamSourceFreq(p,a,b)
SetStreamSource(p,a,b,c,d)
DrawPrimitive(p,a,b,c)
FontIndex 1,i
SetRenderState(p,a,b)
RenderState22 1
SetVertexShaderConstantF(p,a,b,c)
SetTexture(p,a,b)
SetVertexDeclaration(p,a)
SetStreamSourceFreq(p,a,b)
SetStreamSourceFreq(p,a,b)
SetStreamSource(p,a,b,c,d)
DrawPrimitive(p,a,b,c)
FontIndex 1,s
SetRenderState(p,a,b)
RenderState22 1
SetVertexShaderConstantF(p,a,b,c)
SetTexture(p,a,b)
SetVertexDeclaration(p,a)
SetStreamSourceFreq(p,a,b)
SetStreamSourceFreq(p,a,b)
SetStreamSource(p,a,b,c,d)
DrawPrimitive(p,a,b,c)
FontIndex 1,n
SetRenderState(p,a,b)
RenderState22 1
SetVertexShaderConstantF(p,a,b,c)
SetTexture(p,a,b)
SetVertexDeclaration(p,a)
SetStreamSourceFreq(p,a,b)
SetStreamSourceFreq(p,a,b)
SetStreamSource(p,a,b,c,d)
DrawPrimitive(p,a,b,c)
FontIndex 1,o
SetRenderState(p,a,b)
RenderState22 1
SetVertexShaderConstantF(p,a,b,c)
SetTexture(p,a,b)
SetVertexDeclaration(p,a)
SetStreamSourceFreq(p,a,b)
SetStreamSourceFreq(p,a,b)
SetStreamSource(p,a,b,c,d)
DrawPrimitive(p,a,b,c)
FontIndex 1,t
SetRenderState(p,a,b)
RenderState22 1
SetVertexShaderConstantF(p,a,b,c)
SetTexture(p,a,b)
SetVertexDeclaration(p,a)
SetStreamSourceFreq(p,a,b)
SetStreamSourceFreq(p,a,b)
SetStreamSource(p,a,b,c,d)
DrawPrimitive(p,a,b,c)
FontIndex 1,c
SetRenderState(p,a,b)
RenderState22 1
SetVertexShaderConstantF(p,a,b,c)
SetTexture(p,a,b)
SetVertexDeclaration(p,a)
SetStreamSourceFreq(p,a,b)
SetStreamSourceFreq(p,a,b)
SetStreamSource(p,a,b,c,d)
DrawPrimitive(p,a,b,c)
FontIndex 1,o
SetRenderState(p,a,b)
RenderState22 1
SetVertexShaderConstantF(p,a,b,c)
SetTexture(p,a,b)
SetVertexDeclaration(p,a)
SetStreamSourceFreq(p,a,b)
SetStreamSourceFreq(p,a,b)
SetStreamSource(p,a,b,c,d)
DrawPrimitive(p,a,b,c)
FontIndex 1,m
SetRenderState(p,a,b)
RenderState22 1
SetVertexShaderConstantF(p,a,b,c)
SetTexture(p,a,b)
SetVertexDeclaration(p,a)
SetStreamSourceFreq(p,a,b)
SetStreamSourceFreq(p,a,b)
SetStreamSource(p,a,b,c,d)
DrawPrimitive(p,a,b,c)
FontIndex 1,i
SetRenderState(p,a,b)
RenderState22 1
SetVertexShaderConstantF(p,a,b,c)
SetTexture(p,a,b)
SetVertexDeclaration(p,a)
SetStreamSourceFreq(p,a,b)
SetStreamSourceFreq(p,a,b)
SetStreamSource(p,a,b,c,d)
DrawPrimitive(p,a,b,c)
FontIndex 1,n
SetRenderState(p,a,b)
RenderState22 1
SetVertexShaderConstantF(p,a,b,c)
SetTexture(p,a,b)
SetVertexDeclaration(p,a)
SetStreamSourceFreq(p,a,b)
SetStreamSourceFreq(p,a,b)
SetStreamSource(p,a,b,c,d)
DrawPrimitive(p,a,b,c)
FontIndex 1,g
SetRenderState(p,a,b)
RenderState22 1
SetVertexShaderConstantF(p,a,b,c)
SetTexture(p,a,b)
SetVertexDeclaration(p,a)
SetStreamSourceFreq(p,a,b)
SetStreamSourceFreq(p,a,b)
SetStreamSource(p,a,b,c,d)
DrawPrimitive(p,a,b,c)
FontIndex 1,.
这么多次调用,就是干了一件事:显示了一个“Dave is not coming.”
稍微懂行的人,就会知道,实际上这件事只用这么几行就行了:
SetRenderState(p,a,b)
SetVertexShaderConstantF(p,a,b,c)
SetTexture(p,a,b)
SetVertexDeclaration(p,a)
SetStreamSourceFreq(p,a,b)
SetStreamSourceFreq(p,a,b)
SetStreamSource(p,a,b,c,d)
DrawPrimitive(p,a,b,c)
不过还不算完,上面的代码竟然在一桢中重复了足足五次!也就是,平白无故的多了15*5*8=600次Directx调用。
随便再NB的机器也跑不动。这还仅仅是显示几个字符,游戏程序其他地方的优化大家可以想象了
这样的代码完全是程序员故意的,是软硬勾结的最典型范例而已
[ 本帖最后由 FalloutIII 于 2008-12-29 13:12 编辑 ] |