虚幻引擎到底有多少行代码

2

主题

5

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2022-12-20 17:13:38 | 显示全部楼层

恭喜你找到一篇很无聊的文章,因为此时此刻写文章的人也在无聊的等着引擎5.1的编译。

之前看风神和大钊老师直播聊到过这个话题,很多人应该也聊到过,其实我也挺好奇的,所有就有了这篇文章
视频中风神用的比较早期的版本他统计的是一千多万行
每个人的统计方法不一样,所以结果也会不一样,从github上Clone下源代码你会发现里面的文件类型太多了,除了.h和.cpp 还有cs结尾的c#文件等等等等。
那这些文件要不要纳入统计呢?空行和注释算不算进去呢?每个人的统计需求不一样,很难有一个统计的结果,最好的办法是根据需求做一个脚本。
首先我们先看一下虚幻引擎到底有多少个文件吧
#!/usr/bin/python
#coding=utf-8
import os
import time

ProjectDir= '/Users/hotmac/Desktop/UnrealEngine-release/' #待统计的项目路径

#遍历文件, 递归遍历文件夹中的所有
def getFileNum(basedir):
    filelists = []
    for parent,dirnames,filenames in os.walk(basedir):
        for filename in filenames:
            filelists.append(os.path.join(parent,filename))
    return filelists


if __name__ == '__main__' :
    fileNum = len(getFileNum(ProjectDir))
    print('文件个数:',str(fileNum))


我们遍历后发现光文件就有147109个
但是这14W个文件不仅仅是代码,还有图片等其他的资产,考虑到这里我们在看下引擎里有哪些文件类型吧
#!/usr/bin/python
#coding=utf-8
import os
import time

ProjectDir= '/Users/hotmac/Desktop/UnrealEngine-release' #待统计的项目路径
fileExt = []

#遍历文件, 递归遍历文件夹中的所有
def getFile(basedir):
    for parent,dirnames,filenames in os.walk(basedir):
        for filename in filenames:
            ext = filename.split('.')[-1]
            if ext not in fileExt:
              fileExt.append(ext)


if __name__ == '__main__' :
    getFile(ProjectDir)
    print("文件类型数量:"+str(len(fileExt)))
    print("文件类型列表:"+str(fileExt))
文件类型数量:205
文件类型列表:['bat', 'sh', 'md', 'DS_Store', 'uprojectdirs', 'editorconfig', 'gitignore', 'command', 'gitattributes', 'txt', 'uproject', 'json', 'ini', 'cs', 'h', 'cpp', 'udn', 'css', 'html', 'uplugin', 'csproj', 'xml', 'ispc', 'tps', 'inl', 'ush', 'usf', 'js', 'ts', 'py', 'LICENSE', 'rc', 'filters', 'vcxproj', 'sln', 'hpp', 'Makefile', 'def', 'c', 'pl', 'flite', 'lang', 'lex', 'vcproj', 'README', 'dsw', 'mk', 'dsp', 'cc', 'inc', 'mm', 'makefile', 'cmake', 'exp', 'tsx', 'VERSION', 'isph', 'java', 'AUTHORS', 'config', 'manifest', 'resx', 'settings', 'H', 'xaml', 'template', 'rc2', 'xcconfig', 'dockerfile', 'ps1', 'Dockerfile', 'm', 'gitmodules', 'aspx', 'hlsl', 'linux', 'windows', 'gmake', 'win', 'test', 'tbbproxy', 'tbbmalloc', 'tbb', 'rml', 'yml', 'ChangeLog', 'am', 'in', 'C', 'mingw32', 'unx', 'sgi', 'w32', 'dec', 'solaris', 'msys', 'hpgcc', 'beos', 'amiga', 'clang-asan', 'darwin', 'linux-opt', '64sunu', 'hpux', 'cegcc', 'openbsd', 'hp64', 'aix', 'vcwin32', 'ibmc', 'so9', 'bc32', 'freebsd', 'dj2', 'intel', 'mips', 'clang', 'netbsd', 'sggcc', 'sunos', 'acorn', '32sunu', 'std', 'atari', 'gcc', 'sco', 'gcc-asan', 'tc3', 'bor', 'msc', 'solaris-x86', 'ne12bsd', 'knr', 'x86', 'x64', 'watcom', 'elf', 'vsprops', 'glsl', 'mingw', 'TXT', 'os4', 'PIC', 'Epic', 'git-blame-ignore-revs', 'testing', 'sources', 'swift', 'common', 'sphinx', 'tests', 'unittest', 'FAQ', 'emx', 'tc', 'riscos', 'os2', 'sas', 'pup', 'version', 'CHANGELOG', 'XML', 'Version', 'hcustom', 'unix', 'pandora', 'minimal', 'wiz', 'psp', 'changelog', 'mac', 'cygwin', 'fip', 'gnu', 'iphone', 'osx', 'srcs', 'PL', 'vc', 'dll', 'createdump', 'dylib', 'GitDependencies', 'exe', 'so', 'xbuild', 'mono-sgen64', 'csc', 'mcs', 'mono', 'pbxproj', 'plist', 'png', 'entitlements', 'xib', 'strings', 'jpg', 'storyboard', 'gif', 'vms', 'com', 'DOS', 'ami', 'snippet', 'cmd']
引擎内光是文件类型就是两百多个
既然这样那我们统计的时候只找常见的一些文件类型做统计吧,
#!/usr/bin/python
#coding=utf-8
import os
import time

ProjectDir= '/Users/hotmac/Desktop/UnrealEngine-release/' #待统计的项目路径

# 指定想要统计的文件类型
whitelist = ['h',  'cpp',  'html',  'css',  'js',  'python']
ignoreSpaces = True    #忽略空行


#遍历文件, 递归遍历文件夹中的所有
def getFile(basedir):
    filelists = []  # 要统计的文件列表
    for parent,dirnames,filenames in os.walk(basedir):
        for filename in filenames:
            ext = filename.split('.')[-1]
            if ext in whitelist:
                filelists.append(os.path.join(parent,filename))
    return filelists

#统计单个文件的行数
def countLine(fname):
    count = 0
    try:
        for file_line in open(fname).readlines():
            if ignoreSpaces:
                if  file_line != '' and file_line != '\n'  : #过滤掉空行
                    count += 1
            else:
                count += 1
        return count
    except:
        return 0;

if __name__ == '__main__' :

    TotalNumber = 0
    for filelist in getFile(ProjectDir):
        TotalNumber = TotalNumber + countLine(filelist)
    print('总行数:',TotalNumber)


通过代码我们可以看到在排除空行的情况下,总行数是两千两百多万行

这下我们就彻底知道引擎到底多少行代码了
回复

举报 使用道具

2

主题

7

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2022-12-20 17:13:58 | 显示全部楼层
IncrediBuild,你值得拥有[机智]
回复

举报 使用道具

4

主题

7

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2022-12-20 17:14:07 | 显示全部楼层
magic!
回复

举报 使用道具

3

主题

5

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2022-12-20 17:15:07 | 显示全部楼层
不止一个人推荐了,可惜有一点点贵[发呆]
回复

举报 使用道具

您需要登录后才可以回帖 登录 | 立即注册
快速回复 返回顶部 返回列表