我已经开始遇到与WebGLRenderingContext.linkProgram
相关的IE11和Edge下的奇怪性能问题。虽然我所定位的其他平台(Chrome,Firefox,Opera,Chrome Android,Firefox Android和iOS Safari)在几毫秒内成功链接了所有着色器,但IE11和Edge将主线程挂起最多4秒!在nVidia GTX笔记本电脑和仅支持i7的笔记本电脑上发生两者。
我有点不知道是什么原因造成这种情况 - 着色器都很大(包括每个片段着色器顶部的一个大型公共库),但只有其中一个真的窒息。
更新:
似乎使用以下功能导致了悲伤:
float getShadowCoefficient() {
if(shadowType == SHADOW_SINGLE)
return shadowDepthSingle();
if(shadowType == SHADOW_LERP4)
return shadowDepthLerp4();
if(shadowType == SHADOW_PCF)
return shadowDepthPCF();
if(shadowType == SHADOW_PCF_LERP)
return shadowDepthPCFLerp();
if(shadowType == SHADOW_VSM)
return shadowDepthVSM();
return 1.0;
}
是。这是一个由制服而不是#ifdef
驱动的ubershader。正是为了避免这种缓慢的启动。
目前我能想出的这个令人难以置信的慢编译的唯一合理解释是IE和Edge正在将这些调用扩展到所有着色器组合中。这看起来有可能吗?