查看: 2640|回复: 2
打印 上一主题 下一主题

[其他] Unity3D技术之插件底层本地插件接口浅析

[复制链接]

2722

主题

42

听众

3万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
38268
精华
111

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2015-1-31 23:41:17 |只看该作者 |倒序浏览
底层本地插件接口

除基本的脚本接口以外,Unity 的本地代码插件可以在某些事件发生时接受回调。这项功能通常用来在插件中实现底层渲染并使其能够使用 Unity 的多线程渲染。

请注意:目前移动平台不支持插件的渲染回调。


访问图形设备

插件可以通过输出 UnitySetGraphicsDevice 函数,接受图形设备的事件通知。这种方法将在图形设备创建、设备摧毁之前以及在“重置”设备前后调用(仅出现在 Direct3D 9 中)。此函数拥有可以接受设备指针、设备类型和正在发生的事件的参数。

// 如果通过插件输出,此函数将在图形设备创建、摧毁之时   
// 以及在重置设备前后(例如,分辨率更改)调用。
   
extern "C" void EXPORT_API UnitySetGraphicsDevice (void* device, int deviceType, int eventType);

deviceType 可能的值:

  1.   // 如果通过插件输出,此函数将在图形设备创建、摧毁之时
  2.     // 以及在重置设备前后(例如,分辨率更改)调用。
  3.     extern "C" void EXPORT_API UnitySetGraphicsDevice (void* device, int deviceType, int eventType);
  4. deviceType 可能的值:

  5.     enum GfxDeviceRenderer {
  6.         kGfxRendererOpenGL = 0,              // OpenGL
  7.         kGfxRendererD3D9 = 1,                // Direct3D 9
  8.         kGfxRendererD3D11 = 2,               // Direct3D 11
  9.         kGfxRendererGCM = 3,                 // Sony PlayStation 3 GCM
  10.         kGfxRendererNull = 4,                // "null" device (used in batch mode)
  11.         kGfxRendererHollywood = 5,           // Nintendo Wii
  12.         kGfxRendererXenon = 6,               // Xbox 360
  13.         kGfxRendererOpenGLES = 7,            // OpenGL ES 1.1
  14.         kGfxRendererOpenGLES20Mobile = 8,    // OpenGL ES 2.0 mobile variant
  15.         kGfxRendererMolehill = 9,            // Flash 11 Stage3D
  16.         kGfxRendererOpenGLES20Desktop = 10,  // OpenGL ES 2.0 desktop variant (i.e. NaCl)
  17.     };
  18. eventType 可能的值:

  19.     enum GfxDeviceEventType {
  20.         kGfxDeviceEventInitialize = 0,
  21.         kGfxDeviceEventShutdown = 1,
  22.         kGfxDeviceEventBeforeReset = 2,
  23.         kGfxDeviceEventAfterReset = 3,
  24.     };
复制代码
渲染线程插件回调

如果平台及可用 CPU 数量允许,Unity 可以进行多线程渲染。若使用多线程渲染,渲染 API 命令将在与运行 MonoBehaviour 脚本完全分离的线程中执行。因此,插件不一定能立刻开始执行渲染工作,因为它可能与正在执行的渲染线程产生冲突。

为了在插件中执行所有渲染,应从脚本中调用 GL.IssuePluginEvent,它将导致从渲染线程中调用插件。例如,如果从相机的 OnPostRender 函数调用 IssuePluginEvent,就可以在相机完成渲染之后立即进行插件回调。


// 如果有插件输出,此函数将被调用 IssuePluginEvent 的脚本调用。   
// 此函数将在渲染线程中被调用;注意在使用线程渲染时,   
// 渲染线程与执行所有脚本和其他游戏逻辑的主线程有所不同!  
// 在发生其他插件脚本调用时,应该确保任何必要的同步。

extern "C" void EXPORT_API UnityRenderEvent (int eventID);

示例

可以点击此处下载底层渲染插件的示例。它演示了两项操作:

  • 完成所有规则渲染之后,从 C++ 代码渲染旋转的三角形。
  • 从 C++ 代码填充程序纹理,并使用 Texture.GetNativeTexturePtr 访问。

此工程适用于 Windows (Visual Studio 2008) 和 Mac OS X (Xcode 3.2),并根据平台使用 Direct3D 9、Direct3D 11 或 OpenGL。Direct3D 9 代码部分还演示了如何处理“丢失”的设备。


分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

100

主题

3

听众

7683

积分

高级设计师

Rank: 6Rank: 6

纳金币
2378
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2015-2-1 01:02:40 |只看该作者
感谢分享。。。
回复

使用道具 举报

100

主题

3

听众

7683

积分

高级设计师

Rank: 6Rank: 6

纳金币
2378
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2015-2-1 22:44:32 |只看该作者
感谢分享!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-7-21 07:57 , Processed in 0.272575 second(s), 28 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部