小编Art*_*hur的帖子

在Unity的C#中无阻塞加载和复制大型Texture2D

我正在为Android构建一个Unity应用程序,它可以动态加载大量的大纹理(所有图像的大小都超过6MB).这些纹理可以来自Amazon S3服务器,在这种情况下它们以流的形式出现,或者来自用户的设备本身.

在这两种情况下,我都可以异步地保持原始数据或纹理而不会出现问题.在第一个我查询服务器并获得带有数据流的回调,在第二个我使用WWW类来获取使用"file://"协议的纹理.

一旦我想将这些数据复制到Texture2D到我可以使用的某个地方,例如在Texture2D私有成员上,问题就会发生.

使用流我将其转换为byte []并尝试调用LoadImage(),而使用WWW类我只需尝试使用myTexture = www.texture进行复制.在纹理加载或复制时,我都会得到一个巨大的帧.我想彻底根除这个框架,因为App简直无法发布.

using (var stream = responseStream)
{
   byte[] myBinary = ToByteArray(stream);
   m_myTexture.LoadImage(myBinary);  // Commenting this line removes frame out
}

...

WWW www = new WWW("file://" + filePath);
yield return www;
m_myTexture = www.texture;  // Commenting this line removes frame out
Run Code Online (Sandbox Code Playgroud)

不幸的是,Unity似乎不喜欢在主线程的单独线程上运行这些操作,并在我尝试时抛出异常.

有没有什么方法可以将这些操作分块,以便需要多个帧?或者做一些不会拖延主线程的快速memcopy操作?

提前致谢!

PS:我在以下回购中创建了一个问题的工作示例:https://github.com/NeoSouldier/Texture2DTest/

c# performance android texture2d unity-game-engine

9
推荐指数
2
解决办法
4714
查看次数

静态初始化C++

我对C++的有限理解意味着我不知道如何正确地执行以下操作:

#include "Platform.h"
#include "Global.h"

SDL_Surface *ms_pSmall (Global::sharedGlobal()->loadImage(RESOURCE_SMALL_PLATFORM) );
SDL_Surface *ms_pMedium(Global::sharedGlobal()->loadImage(RESOURCE_MEDIUM_PLATFORM));
SDL_Surface *ms_pLarge (Global::sharedGlobal()->loadImage(RESOURCE_LARGE_PLATFORM) );

//Initialise platform variables
Platform::Platform()
{   
    int imgSize = rand() % 3;
    switch (imgSize)
    {
        case 2:
            m_pImage = ms_pSmall;
            break;
        case 1:
            m_pImage = ms_pMedium;
            break;
        case 0:
            m_pImage = ms_pLarge;
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

其中ms_pSmall等是静态指针,Global是具有以下函数声明的单例:

static Global* sharedGlobal();
SDL_Surface* loadImage(const std::string& filename) const;
Run Code Online (Sandbox Code Playgroud)

代码似乎正确编译但链接器抱怨:

Undefined symbols for architecture i386:"Platform::ms_pMedium", referenced from:
  Platform::Platform() in Platform.o    "Platform::ms_pLarge", referenced from:
  Platform::Platform() in Platform.o    "Platform::ms_pSmall", referenced from:
  Platform::Platform() in …
Run Code Online (Sandbox Code Playgroud)

c++ static initialization

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

如何在 Android 的 Unity 中将 System.IO.Stream 转换为纹理?

我正在 Unity 中构建一个客户端 Android 应用程序,当它从 AWS S3 服务器下载 jpg 时,结果会以 System.IO.Stream 的形式返回。

然而,我对 Mono 和 .Net 的了解有限,这意味着我正在努力弄清楚如何将这个 System.IO.Stream 数据块转换为 Unity 中的纹理,然后我可以将其设置在场景中的四边形上。

我在网上看到了一些有前途的代码示例,例如:var img = Bitmap.FromStream(stream); 据我所知,Unity for Android 不支持 System.Drawing.Bitmap - 有人有什么建议吗?

提前致谢!

(我用来从 AWS S3 下载的确切示例代码是 GetObject() 函数,可以在此处找到http://docs.aws.amazon.com/mobile/sdkforunity/developerguide/s3.html,但在其例如,他们使用 System.IO.StreamReader ,它仅适用于读取文本而不是图像的字节数据)

c# mono android amazon-s3 unity-game-engine

2
推荐指数
1
解决办法
3358
查看次数

如何使用 C++ 本机代码链接到 Android Studio 项目中的 GLES2

我正在尝试在 Android 应用程序的一些本机 C++ 代码中调用 OpenGL ES 2 函数,该代码是通过带有 Gradle 的 Android Studio 构建的。

但是,在调用任何单个 OpenGL 函数时,我都会遇到链接器错误,并且没有找到原因。

感觉它应该像以某种方式配置 Gradle 一样简单,但它只是不清楚如何这样做(特别是因为我几乎没有使用 Gradle 的经验)。

我在以下 Github 位置为我的问题创建了一个非常简单的测试用例:https : //github.com/NeoSouldier/GLESTest

使用 Android Studio 打开项目,您将在“native-lib.cpp”文件中看到无法链接的代码。

如果有人能够正确获得此建筑物/链接,请告诉我我错过了什么!

谢谢!

c++ opengl-es-2.0 android-studio android-gradle-plugin

2
推荐指数
1
解决办法
2115
查看次数