小编pro*_*mer的帖子

Unity插件纹理是不可变的

我有一个复杂的问题。在 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)

game-development unity-game-engine webgl

3
推荐指数
1
解决办法
1633
查看次数