Shader的这里的改革更彻底怎么改

网游AssetBundle依赖打包,在修改Shader属性时,报如下异常Deleting persistent object without writing it first!急求!
我的AssetBundle的资源是通过 依赖 打包实现 的。
在AssetBundle资源在加载完成后一些Shader出现大量丢失!
我找到一个解决方案,是WWW加载完成后,去手动的修改Material文件的Shader,丢失的问题是解决了!
但在资源Unload的时候,出现Deleting persistent object without writing it first,找了些资料,说是在不应该修改AssetBundle的原始资源,好吧,那就不修改呗,那就实例后,再修改GameObject内的材质啊,可惜的是,我在实例后的GameOjbect里,根本就找不到原来各个Material的记录信息!
暂时未找到解决方案!求知道这块的朋友,给出解决方案,谢谢!!
726 || this.offsetHeight>700){if(this.offsetWidth/726 > this.offsetHeight/700){this.width=726;}else{this.height=700;}}" style="max-width:726max-height:700" onclick="if(this.parentNode.tagName!='A'&&this.width>screen.width-461) window.open(this.src);" />
要评论请先&或者&
脚本类的东西好像不可能打包到AssetBundle内吧, &在发布游戏时,想不用的Shader 也打包要放在Resources文件下
我现在还是在编辑器内运行!如果是在编译到移动平台,确实 是要将Shader文件,放置到Resource目录 ,我也查到一些资料!
现在的问题是,我用WWW加载出来的AssetBundle资源,Shader出现丢失,当我去修改这个AssetBundle对象以后,在Unload时,就出现了以上的这个错误! Error,我曾经傻傻的去Try Catch了!..........
这是修改AssetBundle.mainAsset的Shader属性的代码!
public static void ResetShader(UnityEngine.Object asset)
&& &{
&& & & &Material sm = (Material)
&& & & &if (sm == null)
&& & & &{
&& & & & & &Debug.LogWarning(&!!!!! case Exception !!!!!!!!!!!!!!!!&);
&& & & & & &
&& & & &}
&& & & &var shaderName = sm.shader.
&& & & &if (shaderName == null || shaderName.Trim().Length == 0)
&& & & &{
&& & & & & &shaderName = &Unlit/Transparent&;
&& & & &}
&& & & &Debug.LogWarning(&---------Shader Name:& + shaderName);
&& & & &var newShader = Shader.Find(shaderName);
&& & & &if (newShader != null)
&& & & &{
&& & & & & &sm.shader = newS
&& & & &}
&& & & &else
&& & & &{
&& & & & & &Debug.LogWarning(&unable to refresh shader: & + shaderName + & in material & + sm.name);
&& & & &}
&& &}
刚才我尝试将Unload(true) 改成 UnLoad(false) &,奇怪了,Error消失了! 不明觉厉害!!!
摘抄:
Unity默认资源(Asset)在为实例化的时候不能够修改。但有些开发者就会说,我没有修改它,我只是用WWW方式下载下来,一关闭程序他就抱着个错误,我的理解是,当你把资源下下来后,关闭程序的时候,Unity会删除资源,这是就相当于修改了。对于这个错误我的解决办法是,在每次加载完资源后马上卸载
);这个错误就会消失了。
我有一个疑问,那我的镜像AssetBundle怎么回收了?!
&Resources.UnloadUnusedAssets();
System.GC.Collect();
& & 难道这样?!~ &~~~~~~ & 实际测试,镜像资源没有释放干净!~
问题依然没有完美解决,虽然我在Unload(false)时不会报Deleting persistent object without writing it first,但是在编辑器停止运行时,也就是Unity自动删除资源时,又报出这个异常了!! &
而且AssetBundle镜像资源释放不干净,导致内存大啊!!!...........
是不是要这样理解,我必须在移动平台,检测到应用退出时,来手动释放我的全部AssetBundle资源!
最后解决了吗?? 怎样解决的? 我也遇到同样问题
关注一下~~~
我也遇到这样的问题,求大神指点!
shader丢失应该只是在编辑器下吧?打成真机是没问题的。。以前也遇到过。。以前问了几个问题,好象这是个硬件?还需要设置?请高手指点一下,应该怎么设置?
如果你用的是相关信息上DX9.0以上的卡,那么默认开启Pixel shader2.0和某些Vertex 2.0部分),即使你在游戏设置介面把画质特效 设成低 也改变不了.(注:原以前版本在画质低的状态下是Pixel shader1.4,Vertex1.1;而画质中才是Pixel shader2.0,Vertex2.0),),差别就在新版本里默认为DX9.0的显卡开启了Pixel shader2.0和 某些Vertex shader2.0部分,而这个恰恰是按N卡FX5系列的弱点:DX9特效发挥效能不高,特别是Vertex shader2.0部分.
因此,想流畅玩BF2的FX列系的朋友(特别是FX5700系列以下的)必须想办法使显卡的特效发挥最高设成Pixel shader1.4,Vertex1.1.但是,当设成这样时,与bf21.12版本不同的是:EA在1.2对不开Pixel shader2.0的显卡效果的,强制采用cpu软模拟,所以造成cpu资源严重浪费,玩起来超卡(3fps)和有些物件模拟不出的.解决方法:应设成Pixel shader2.0,Vertex1.1。
方法:我...
如果你用的是相关信息上DX9.0以上的卡,那么默认开启Pixel shader2.0和某些Vertex 2.0部分),即使你在游戏设置介面把画质特效 设成低 也改变不了.(注:原以前版本在画质低的状态下是Pixel shader1.4,Vertex1.1;而画质中才是Pixel shader2.0,Vertex2.0),),差别就在新版本里默认为DX9.0的显卡开启了Pixel shader2.0和 某些Vertex shader2.0部分,而这个恰恰是按N卡FX5系列的弱点:DX9特效发挥效能不高,特别是Vertex shader2.0部分.
因此,想流畅玩BF2的FX列系的朋友(特别是FX5700系列以下的)必须想办法使显卡的特效发挥最高设成Pixel shader1.4,Vertex1.1.但是,当设成这样时,与bf21.12版本不同的是:EA在1.2对不开Pixel shader2.0的显卡效果的,强制采用cpu软模拟,所以造成cpu资源严重浪费,玩起来超卡(3fps)和有些物件模拟不出的.解决方法:应设成Pixel shader2.0,Vertex1.1。
方法:我用的是nVHardPageSE build1.2版本软件来改(riva tuner也可以)
步骤:
1.点击nVHardPageSE.exe启动nVHardPageSE软件.
2.选择Directx下箭嘴最低的shader setting 这项.(如附图所示)
3.然后依据上述问题的分析,把分别把Pixel shader设成2.0,Vertex设成 1.1版本.
4.点击apply setting now.
5.重启电脑(虽然此软件没提示,但经测试证明,一定要重启电脑才能生效.)
6.重启后,到 我的文档\Battlefield 2\mods目录,把里边所有这些存放战地2的shader缓存目录东西删除掉(即清空 我的文档 的战地2里mods目录). 看清楚:是在 我的文档 目录的Battlefield 2,不是安装目录的Battlefield 2,否则误认错了就不好了.(请不要忽略第六步 )
这样,你玩BF2时的游畅度 就可以达到 以前版 一样.
(补充说明:为什么要做第六步? 因为如果不做,那么BF2仍会误认为你目前是处于Vertex shader2.0特效渲染状态,进去游戏后,你会发现有些贴图没有了,这些没有了的贴图正是靠Vertex shader2.0特效渲染的,而你当前显卡已降为Vertex shader1.1特效渲染,因此会渲染不出这些靠Vertex shader2.0,特效渲染的图.所以,你必须清空这些shader缓存,来让BF2系统重新确定你的显卡最高特效渲染状态是Vertex shader1.1,这样就可以才能正常贴图,否则建筑物变灰)
最后,要说明一下的是:使用nVHardPageSE build1.2的朋友,如果设置后,重新安装驱动或系统,它依保留上次设置的结果,其实质因驱动已重新安装,所以已经变回原来了,需重新设置一次,再重启,方可再生效。
当然,如ATI9000,ATI9200等显卡本身为DX8.1卡,本应不受影响,但上面我提到了,EA在这个1.2版在底层强制要用Pixel shader 2.0,造成要用cpu模拟且有些模拟不出,浪费cpu资源。因此,对于ATI9000,ATI9200的玩家要等待EA在后来的版本解决或玩1.2以下的版本了。
中文译名为优化渲染引擎2.0你只要安装DirectX9.0B以上版本就能够支持
2004年NVIDIA GeForce4 后面各级别的独立显卡都支持或更高技术至于后面某些集成显卡虽然级别比GeForce4级别高,但是却不一定支持。所以某些集...
1.支持WDDM以及PixelShader2.0的DirectX9图形处理器2.每象素最少32bit3.根据显示器分辨率不同,网业[教7.`XZ1络j显存需求不...
手工清除该病毒时先结束病毒进程 winlogon.exe,然后删除 C:\Windows 目录下的 winlogon.exe、winlogon.dll、winl...
答: 我就想住悦泰 能确定是这个吗
答: 3.交流机依据帧头的信息进需瞰脾,是以说交流机是工作在数据链路层的收集设备(此处所述交流机仅指传统的二层交流设备)
答: 打10060找网通维修
大家还关注
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区
相关问答:123456789101112131415最近遇到一个很囧的问题,
由于各种原因,编译PixelShader后的ConstantTable出错,也就是如需要动态改变一些常量的需求无法实现,
使用了各种方法无法实现,万般无奈,在最后放弃之前又一次拿出了压箱底的DXSDK,
慢着,好像通过Device可以直接设置,真是孤陋寡闻了,
ID3DXEffectStateManager::SetPixelShaderConstantF Method
A callback function that must be implemented by a user to set an array of vertex shader floating-point constants.
HRESULT SetPixelShaderConstantF(
UINT StartRegister,
const FLOAT *pConstantData,
UINT RegisterCount
Parameters
StartRegister [out] UINT
The zero-based index of the first constant register.
pConstantData [out] FLOAT
An array of floating-point constants.
RegisterCount [out] UINT
The number of registers in pConstantData.
Return Value
The user-implemented method should return S_OK. If the callback fails when setting the device state, either of the following will occur:
The effect will fail during .
The dynamic effect state call (such as ) will fail.
Requirements
D3DX9Effect.h
但是这里这个StartRegister如何取得?
首先想到是再建立了一个简单的工程,
直接通过Effect加载Shader:
    D3DXEFFECT_DESC tEffectD
    g_pMotionBlurEffect-&GetDesc(&tEffectDesc);
    int iCount=tEffectDesc.P
    for(int i=0;i&iC++i)
    {
        hHand1=g_pMotionBlurEffect-&GetParameter(NULL,i);
        g_pMotionBlurEffect-&GetParameterDesc(hHand1,&tDesc);
    }
调整了下HLSL代码,如愿以偿地把想要动态改变的Parameter放在了第一位,
pd3dDevice-&SetPixelShaderConstantF(0,&m_fTimeSin_X,1 );
结果杯具了,
IDirect3DDevice9::GetPixelShaderConstantF Method
Gets a floating-point shader constant.
HRESULT GetPixelShaderConstantF(
UINT StartRegister,
float *pConstantData,
UINT Vector4fCount
Parameters
StartRegister [in] UINT
Register number that will contain the first constant value.
pConstantData [in, out] float
Pointer to an array of constants.
Vector4fCount [in] UINT
Number of four float vectors in the array of constants.
好吧,再改,
通过,一批量的参数获得,
m_pd3dDevice-&GetPixelShaderConstantF(0,g_fData,100 );
动态修改,通过Watch找到了该死的参数(囧,相当得山寨),原来前段是由Effect做的管理,自己的参数被远远地放在了后面:好吧,这回再改,可是效果神奇得花屏了,
这时终于想起了我还有PIX,
调试,找到指定渲染位置,打开Device,
真相大白:
Register无论你的参数是Float,Float2抑或Float3,其实在实际的GPU中都是按Float4放置的,
这点就与CPU的内存对齐是一个道理,
明白了这点问题也就迎刃而解了,
如需通过SetPixelShaderConstantF设置参数,
StartRegister的值就是Float4的跨度,
诶,都是吃了不明白机制的亏,做了很多无用功,吃一堑长一智吧~~
阅读(...) 评论()2010年10月 专题开发/技术/项目大版内专家分月排行榜第三
2010年10月 专题开发/技术/项目大版内专家分月排行榜第三
2010年10月 专题开发/技术/项目大版内专家分月排行榜第三
2010年10月 专题开发/技术/项目大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 我的世界怎么改名字 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信