我有一个复杂的问题。在 Unity WebGL 中,加载纹理(使用 LoadImage)会导致引擎冻结几毫秒,从而导致游戏卡顿,在加载大型纹理时情况更糟。这是一个已知问题。
为了避免冻结,我决定尝试让浏览器加载纹理,并将该纹理应用于游戏对象。这样就不会出现冻结,因为浏览器是在线程上执行的。
要做到这一点有点复杂,所以我将此解决方案基于 WebGLMovieTexture,这是资产商店中的免费资产,允许您使用内置播放器的浏览器(而不是 unity VideoPlayer)播放电影,将其应用到纹理,然后是游戏对象。我经常使用它并且它有效,所以我决定对图像尝试同样的方法。
为此,必须在 Javascript 中创建一个插件,在 C# 中创建该插件的接口类,然后创建一个使用该接口类的类。
首先是 Javascript 插件,我在这里只包含了重要的部分
var LibraryWebGLImageTexture = {
$imageInstances: [],
WebGLImageTextureCreate: function(url)
{
var str = Pointer_stringify(url);
var img = document.createElement('img');
img.onload=function() {
console.log("image load completed"); <<<-------------
}
img.style.display = 'none';
img.src = str;
return imageInstances.push(img) - 1;
},
WebGLImageTextureRefresh: function(img, tex)
{
GLctx.bindTexture(GLctx.TEXTURE_2D, GL.textures[tex]);
GLctx.pixelStorei(GLctx.UNPACK_FLIP_Y_WEBGL, true);
GLctx.texImage2D(GLctx.TEXTURE_2D, 0, GLctx.RGBA, GLctx.RGBA,GLctx.UNSIGNED_BYTE, imageInstances[img]);
GLctx.pixelStorei(GLctx.UNPACK_FLIP_Y_WEBGL, false);
}
Run Code Online (Sandbox Code Playgroud)
这是插件的 C# 接口类,同样只包含重要部分
public class WebGLImageTexture
{
[DllImport("__Internal")]
private static extern …Run Code Online (Sandbox Code Playgroud)