UE4的Linux内存共享

最近要用UE4的服务器做网络同步,但是看了一下UE4自带的一张地图一个进程感觉有点浪费,找了一下,发现UE4 Linux端提供了子进程共享内存的方案,记录一下。

共享内存

        目前都是参考WaitAndFork(),只明白一个大概,具体的等不加班了看相关书籍补齐吧。

源代码:

        FUnixPlatformProcess类中提供了一个WaitAndFork()用于创建子进程,启服务器时额外加入-NumForks=x参数。

        该函数需要在需要时调用,可以在自定义的AssetManager中加载完所需资源后调用,主进程进入该函数死循环挂起,创建子进程,当子进程关闭时会重启保证子进程数量和参数所需一致。但是4.23之后有所改动,看代码似乎子进程关闭后父进程会关闭进程,因为后来只是拿这个参考自己做了动态启子进程,所以并没有做过测试,只是看代码和LOG内容应该时这么处理的。

动态创建:

        熟悉Linux的应该都能自己写,不熟悉Linux的可以参考一下吧。

        WaitAndFork中主要的是pid_t ChildPID = fork();

        创建的子进程会从该行一下句开始继续执行。

        ChildPID == -1表示创建失败

        ChildPID == 0 子进程进入该分支处理(自己写的话逻辑在这个分支里面处理就好了,不会的话可以参考原版的,我在这里做了一些参数处理。)

        ChildPID > 0 父进程进入该分支处理,ChildPID为子进程的进程ID

        死循环中,如果不需要走创建流程的分支(等待创建队列为空),需要循环已有子进程获取信号量waitpid(),否则子进程结束后,会成为一个僵尸进程。

优化:

        目前的方案是在AssetManager中加载完资源后处理这个事情,但是其实可以移到GameMode::InitGame中处理,不过需要调用ShutdownWorldNetDriver,而在创建出来的子进程中需要重新Listen,否则子进程将和父进程共享NetDriver,即新创建出来的子进程客户端无法进入(监听的端口号是一致的所以无论有多少个子进程都无法进入,详细流程在后续的笔记中有)

        试过建一个空项目起DS但是还是会有大概80M左右的内存占用(Development),跟虚幻的支持聊过,还算正常。但是在正常游戏中还是可以做一些其他优化的,比如Actor,Component这些类本身有很多属性其实是不需要的(只是大部分Actor,Component),所以其实可以整理一下将大部分不用的属性抽出来做一个pool,需要的时候进行分配,应该能在一定程度上节省很多不必要的内存开销。

        其他优化配合一些参数进行优化筛选不必要的资源(不过如果有规划过资源,感觉应该还是会很好处理的。),如GEngine->Exec(NULL, TEXT("memreport -full"))\GEngine->Exec(NULL, TEXT("obj list class=typename(如AnimSequence) -alphasort"))\ -llm -llmcsv

你可能感兴趣的:(UE4的Linux内存共享)