Unity3d_Light Probe使用方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3d_Light Probe使用方法相关的知识,希望对你有一定的参考价值。

参考技术A

** 运行环境:Unity5.4.0f3 **

我们都知道在unity3d中烘焙lightmap的作用及方法,可以将实时灯光烘焙在一张或者多张lightmap上,成为静态光照,好处就是可以提高运行效率,但是坏处就是,针对场景中的动态物体,物体与灯光之间没有任何的交互,比如某一片区域被照射为红色的光,这时候一个运动的"Cube"进入红色光区域,自身没有任何变化。

可以看到上图中,实时灯光,Cube会被灯光照亮,这毫无疑问,烘焙过后Cube是有颜色了,但是cube移动到别的地方依然是保持当时烘焙的位置的效果,说白了,就是烘焙完,不能动,不然就穿帮。
这个时候就需要用到 Light Probe ,下面说一下,Light Probe具体该怎么操作。

My Blog

MPI_Probe 的线程安全

【中文标题】MPI_Probe 的线程安全【英文标题】:Thread Safety with MPI_Probe 【发布时间】:2015-06-01 02:03:22 【问题描述】:

我正在使用MPI_Probe 动态发送消息(接收方不知道正在发送的消息的大小)。我的代码看起来有点像这样 -

if (world_rank == 0) 
    int *buffer = ...
    int bufferSize = ...
    MPI_Send(buffer, buffersize, MPI_INT, 1, 0, MPI_COMM_WORLD);
 else if (world_rank == 1) 
    MPI_Status status;
    MPI_Probe(0, 0, MPI_COMM_WORLD, &status);
    int count = -1;
    MPI_Get_count(&status, MPI_INT, &count);
    int* buffer = (int*)malloc(sizeof(int) * count);
    MPI_Recv(buffer, count, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

如果我在多个线程中运行此代码,是否有可能MPI_Probe 在一个线程中被调用,MPI_recv 在另一个线程中被调用,因为调度程序交错线程。本质上,上面的代码是线程安全的。

【问题讨论】:

你说得对,这是一个竞争条件,在 MPI 3 之前没有办法解决它,MPI_Mprobe 可能还有 MRecv。例如见Jeff Squyres' blog post。 @JonathanDursi,链接已损坏。 Jeff Squyres 来自 Internet Archive web.archive.org/web/20151015111933/https://blogs.cisco.com/… 的博客文章。不幸的是,图片(帖子的重要部分)丢失了。 【参考方案1】:

首先,MPI 默认不是线程安全的。您必须检查您的特定库是否已针对线程安全进行编译,然后使用 MPI_Init_thread 而不是 MPI_Init 初始化 MPI。

假设您的 MPI 实例已针对线程安全例程进行了初始化,由于您已经确定的竞争条件,您的代码仍然不是线程安全的。

MPI_ProbeMPI_Recv 在多线程环境中的配对不是线程安全的,这是 MPI-2 中的一个已知问题:http://htor.inf.ethz.ch/publications/img/gregor-any_size-mpi3.pdf

至少有两种可能的解决方案。您可以使用 MPI-3 MPI_MprobeMPI_MRecv,或者在关键代码周围使用锁/互斥锁。这可能如下所示:

MPI-2 解决方案(使用互斥锁/锁):

int number_amount;
if (world_rank == 0) 
    int *buffer = ...
    int bufferSize = ...
    MPI_Send(buffer, buffersize, MPI_INT, 1, 0, MPI_COMM_WORLD);
 else if (world_rank == 1) 
    MPI_Status status;
    int count = -1;
    /* aquire mutex/lock */
    MPI_Probe(0, 0, MPI_COMM_WORLD, &status);
    MPI_Get_count(&status, MPI_INT, &count);
    int* buffer = (int*)malloc(sizeof(int) * count);
    MPI_Recv(buffer, count, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    /* release mutex/lock */

MPI-3 解决方案

int number_amount;
if (world_rank == 0) 
    int *buffer = ...
    int bufferSize = ...
    MPI_Send(buffer, buffersize, MPI_INT, 1, 0, MPI_COMM_WORLD);
 else if (world_rank == 1) 
    MPI_Status status;
    MPI_Message msg;
    int count = -1;
    MPI_Mprobe(0, 0, MPI_COMM_WORLD, &msg, &status);
    MPI_Get_count(&status, MPI_INT, &count);
    int* buffer = (int*)malloc(sizeof(int) * count);
    MPI_Mrecv(buffer, count, MPI_INT, &msg, MPI_STATUS_IGNORE);

【讨论】:

两个MPI_Mprobe(都取ANY_TAG或者同一个tag)可以同时在这两个线程中运行,然后互相干扰吗?

以上是关于Unity3d_Light Probe使用方法的主要内容,如果未能解决你的问题,请参考以下文章

Psi Probe 安装及使用说明

MPI - 在使用 MPI_Probe() 时发送我自己的结构

workbench 计算后,使用PROBE查看结果后,结果数据如何去掉

Psi Probe 安装及使用说明

MPI_Probe 的线程安全

FPGA editor 的使用之一 ------ Probe探针