doom3 源代码评测 1

2023-10-27

原文地址 http://fabiensanglard.net/doom3/

2012年6月8日

DOOM3源代码评测:简介(第1部分,共6部分)>>

2011年11月23日,id软件保持传统,并发布了其以前引擎的源代码。这一次是轮到了idTech4,使用它,创造出Prey,quake4,当然是Doom 3.在几个小时之内,GitHub上的源代码被下载了400多次,人们开始看游戏内部机制/在其他平台上引导引擎。我也跳上它,并及时完成了Mac OS X的Intel版本 约翰·卡马克


在清晰度和评论方面,这是 Doom iPhone代码库(这是更新的,因此更好的评论)的id软件最好的开源代码我强烈建议大家阅读,编译和实验。


下面是我的笔记就我的理解。像往常一样,我已经清理了它:我希望它会节省一个人几个小时,我也希望它会激励我们中的一些人阅读更多的代码,并成为更好的程序员。

第1部分:概述
第2部分:Dmap
第3部分:渲染器
第4部分:剖析
第5部分:脚本
第6部分:访谈(包括与约翰·卡马克的问答)


从笔记到文章...

我注意到我正在使用越来越多的绘图和越来越少的文本来解释代码库。到目前为止,我已经使用gliffy绘制,但这个工具有一些令人沮丧的限制(如缺乏alpha通道)。我正在考虑编写一个专门用于使用SVG和Javascript绘制3D引擎的工具。我想知道这样的事情是否已经存在?无论如何,回到代码...


背景

掌握这样一个突破性引擎的源代码是令人兴奋的。Doom III于2004年发布,为实时引擎设定了新的视觉和音频标准,最为显着的是“统一照明与阴影”。这项技术首次允许艺术家以好莱坞的规模表达自己。即使8年后,在Delta-Labs-4中与HellKnight的第一次遭遇仍然看起来非常棒:


第一次联系

源代码现在通过Github进行分发,这是一件好事,因为来自id Software的FTP服务器几乎总是关闭或重载。

来自TTimo原始版本与Visual Studio 2010 Professional编译良好。不幸的是Visual Studio 2010“Express”缺少MFC,因此无法使用。这是令人失望的释放,但有些人已经删除了依赖

	
	
    Windows 7的 :
    ===========
	
    
    
    git clone https://github.com/TTimo/doom3.gpl.git
	
    
	



对于代码阅读和探索,我更喜欢在Mac OS X上使用XCode 4.0:SpotLight的搜索速度,变量亮点和“命令点击”达到定义使得体验优于Visual Studio。XCode项目在发布时被破坏,但是很容易解决几个步骤,现在有一个Github存储库由“坏扇区”,在Mac OS X Lion上运行良好。

	
	
    MacOS X:
    =========
	
    
    
    git克隆https://github.com/badsector/Doom3-for-MacOSX-
	
    
    
	

注意:安装 Visual Studio 2010生产力电动工具后,Visual Studio 2010中也可以看到“变量hightlights”和“Control-Click”我不明白为什么这不是香草安装的一部分。

两个代码库现在都处于最佳状态:一次点击可执行文件!

  • 下载代码
  • 击中F8 / Commmand-B。
  • 跑 !

琐事:为了运行游戏,您将需要base包含Doom 3游戏文件夹。因为我不想浪费时间从Doom 3 CD中提取它们并更新它们:我下载了Steam版本。似乎id软件团队做的一样,因为Visual Studio项目发布仍然包含"+set fs_basepath C:\Program Files (x86)\Steam\steamapps\common\doom 3"在调试设置!

琐事:引擎是用Visual Studio .NET开发的。但代码不具有单行的C#,发布的版本需要Visual Studio 2010 Professional才能编译。

琐事: Id软件团队似乎是Matrix电影系列(黑客帝国)的粉丝:Quake III的工作题目是“Trinity”,Doom III的工作题目是“Neo”。(都出自黑客帝国电影中)


建筑

该解决方案分为反映引擎整体架构的项目:

项目 构建 意见
  视窗 MacO SX  
游戏 gamex86.dll gamex86.so Doom3游戏
游戏d3xp gamex86.dll gamex86.so Doom3 eXPension(Ressurection)游戏
MayaImport MayaImport.dll - 资产创建工具链的一部分:在运行时加载,以打开Maya文件并导入怪物,摄像头路径和地图。
毁灭战士 Doom3.exe Doom3.app Doom 3引擎
所属类别 TypeInfo.exe - 内部RTTI帮助器:生成GameTypeInfo.h:具有每个成员大小的所有Doom3类类型的映射。这允许通过TypeInfo类进行内存调试。
CurlLib CurlLib.lib - HTTP客户端用于下载文件(Staticaly链接到gamex86.dll和doom3.exe)。
伊德利卜 idLib.lib idLib.a id软件库。包括解析器,词法分析器,字典...(Staticaly链接到gamex86.dll和doom3.exe)。



像idTech2的每个引擎一样,我们找到一个封闭的源代码二进制(doom.exe)和一个开放源代码的动态库(gamex86.dll):


自2004年10月以来,大多数代码库已经通过Doom3 SDK访问:只有Doom3可执行源代码失踪。模式能够构建idlib.agamex86.dll但发动机的核心仍然是封闭源。

注意:引擎不使用标准C ++库:所有容器(映射,链接列表...)都被重新实现,但libc被广泛使用。

注意:在游戏模块中,每个类都扩展了idClass。这允许引擎执行内部RTTI,并通过类名实例化类。

琐事:如果你看图纸,你会看到几个基本框架(如Filesystem)在Doom3.exe项目中。这是一个问题,因为gamex86.dll也需要加载资源。这些子系统由doom3.exe中的gamex86.dll动态加载(这是图中箭头实现的)。如果我们用PE Explorer中的DLL我们可以看到,gamex86.dll导出一个方法:GetGameAPI



一切正常完全相同的方式Quake2中加载的渲染和游戏的DDL:交换对象的指针:

当Doom3.exe启动它:exe(这是图中箭头实现的)。如果我们用PE Explorer中的DLL我们可以看到,gamex86.dll导出一个方法: :一切正常完全相同的方式Quake2中加载的渲染和游戏的DDL:交换对象的指针:当Doom3.exe启动它:exe(这是图中箭头实现的)。如果我们用PE Explorer中的DLL我们可以看到,gamex86.dll导出一个方法: :一切正常完全相同的方式Quake2中加载的渲染和游戏的DDL:交换对象的指针:当Doom3.exe启动它:

  • 通过DLL加载其进程内存空间LoadLibrary
  • GetGameAPI使用win32来获取dll中的地址GetProcAddress
  • 打电话GetGameAPI

        
        
    gameExport_t * GetGameAPI_t(gameImport_t * import);
        
        
        

在“握手”结束时,Doom3.exe具有指向idGame对象的指针,Game.dll具有指向gameImport_t包含对所有缺少子系统的其他引用的对象的指针,例如idFileSystem

Gamex86对Doom 3可执行对象的看法:

        
        
        typedef struct {
            
            int                          版本;               // API版本 
            idSys * sys;                   //非便携式系统服务 
            idCommon * common;                // common 
            idCmdSystem * cmdSystem               // console command system 
            idCVarSystem * cvarSystem;            //控制台变量系统 
            idFileSystem * fileSystem;            //文件系统 
            idNetworkSystem * networkSystem;         //网络系统 
            idRenderSystem * renderSystem;          // render system 
            idSoundSystem * soundSystem;           // sound system 
            idRenderModelManager * renderModelManager;    //渲染模型管理器 
            idUserInterfaceManager * uiManager; //用户界面管理器 
            idDeclManager * declManager; //声明管理器 
            idAASFileManager * AASFileManager; // AAS文件管理器 
            idCollisionModelManager * collisionModelManager; //碰撞模型经理 //渲染模型管理器 idUserInterfaceManager * uiManager; //用户界面管理器 idDeclManager * declManager; //声明管理器 idAASFileManager * AASFileManager; // AAS文件管理器 idCollisionModelManager * collisionModelManager; //碰撞模型经理 //渲染模型管理器 idUserInterfaceManager * uiManager;             //用户界面管理器 idDeclManager * declManager;           //声明管理器 idAASFileManager * AASFileManager;        // AAS文件管理器 idCollisionModelManager * collisionModelManager; //碰撞模型经理 // AAS文件管理器 idCollisionModelManager * collisionModelManager; //碰撞模型经理 // AAS文件管理器 idCollisionModelManager * collisionModelManager; //碰撞模型经理
            
        } gameImport_t;
        
        

游戏/ Modd对象中的Doom 3的视图:



    typedef结构 
    {

        int             版本;     // API版本 
        idGame *game;        //界面运行游戏 
        idGameEdit * gameEdit;    //界面进行游戏内编辑

    } gameExport_t;

    

注意:了解更好的每个子系统的一个很好的资源是Doom3 SDK文档页面(该页面现在需要翻墙人机验证后打开):它似乎是在2004年深入了解代码的人写的(所以可能是开发团队的成员)。


代码

在挖掘之前,一些统计数据来自cloc

        
        
     ./cloc-1.56.pl新
        
     2180个文本文件。
     2002独特文件。                                          
     626个文件被忽略。
            
     http://cloc.sourceforge.net v 1.56 T = 19.0 s(77.9 files / s,47576.6 lines / s)
        
     -------------------------------------------------- -----------------------------
     语言文件空白评论代码
     -------------------------------------------------- -----------------------------
     C ++ 517 87078 113107 366433
     C / C ++标头617 29833 27176 111105
     C 171 11408 15566 53540
     Bourne Shell 29 5399 6516 39966
     使43 1196 874 9121
     m4 10 1079 232 9025
     HTML 55 391 76 4142
     Objective C ++ 6 709 656 2606
     Perl 10 523 411 2380
     yacc 1 95 97 912
     Python 10 108 182 895
     目标C 1 145 20 768
     DOS批次5 0 0 61
     Teamcenter def 4 3 0 51
     Lisp 1 5 20 25
     awk 1 2 1 17
     -------------------------------------------------- -----------------------------
     SUM:1481 137974 164934 601047
     -------------------------------------------------- -----------------------------
            
        
        


代码行的数量通常不是一个很好的指标,但是在这里,为了评估引擎的理解力度可能非常有帮助。与Quake III相比,601,047行代码使引擎两倍“难”。关于id的历史的几个统计软件引擎#代码行:

#代码线 厄运 idTech1 idTech2 idTech3 idTech4
发动机 39079 143855 135788 239398 601032
工具 341 11155 28140 128417 -
39420 155010 163928 367815 601032


注意:对于工具来说,idTech3的巨大增长来自lcc代码库(用于生成QVM字节码的C编译器)。
注意:由于Doom3被集成到引擎代码库中,所以没有任何工具被归结为Doom3。

从高层来看,这里有几个有趣的事实:

  • 在第一次在软件历史上,代码是C ++而不是C.约翰·卡马克在我们的问答中阐述了这一点
  • 抽象和多态在代码中使用很多。但是一个好的技巧避免了一些对象的vtable性能。
  • 所有资产都以人类可读的文本形式存储。没有更多的二进制该代码正在广泛使用词法分析器/解析器。约翰·卡马克(John Carmack)在我们的问答中阐述了这一点
  • 模板用于低级实用程序类(主要是idLib),但从来没有在上层看到,所以他们不会让你的眼睛流血的方式谷歌的V8源代码。
  • 在代码评论方面,它是来自id软件的第二好的代码库,唯一一个更好的是Doom iPhone,可能是因为它比Doom3更新。30%的评论仍然很出色,很少找到一个很好的评论的项目!在代码的某些部分(参见dmap页面)实际上比语句更多的注释。
  • OOP封装使代码清洁,易于阅读。
  • 低级装配优化的时代已经过去了。这里有一些技巧idMath::InvSqrt和空间本地化优化,但大多数代码只是尝试在可用时使用这些工具(GPU着色器,OpenGL VBO,SIMD,Altivec,SMP,L2优化(R_AddModelSurfaces每个模型处理)...) 。

查看由John Carmack定义的idTech4编码标准镜像)也很有意思(我特别赞赏关于const布局的评论)。


展开循环

这是主要循环展开引擎最重要的部分:

        
        
    idCommonLocal commonLocal;                   // OS专用对象  
    idCommon * common =&commonLocal;         //接口指针(因为Init是依赖于操作系统的,它是一种抽象的方法
        
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
    {
            
        
        Sys_SetPhysicalWorkMemory(192 << 20,1024 << 20);   //最小= 201,326,592最大= 1,073,741,824
        Sys_CreateConsole();
            
        //由于引擎是多线程的互斥体在这里初始化:每个“关键”(并发执行)代码的一个互斥体。
        forint i = 0; i <MAX_CRITICAL_SECTIONS; i ++){
            InitializeCriticalSection(&win32.criticalSections [i]);
        }
            
        common-> Init(0,NULL,lpCmdLine);              //评估VRAM有多少(不是通过OpenGL完成但OS调用)
            
        Sys_StartAsyncThread(){                           //下一个查找运行是一个单独的线程。
            (1){
                usleep(16666);                         //运行在60Hz 
                common-> Async();                         //做工作 
                Sys_TriggerEvent(TRIGGER_EVENT_ONE);   //解锁其他线程等待输入 
                pthread_testcancel();                    //检查主线程是否被取消(在关机时)。
            }
        }
        
        Sys_ShowConsole
            
        (1){
            Win_Frame();                                 //显示或隐藏控制台
            共>框架(){
                session-> Frame()                          //游戏逻辑
                {
                    forint i = 0; i <gameTicsToRun; i ++)
                        RunGameTic(){
                            game-> RunFrame(&cmd);      //从这一点起,执行跳转到GameX86.dll的地址空间。
                              for(ent = activeEntities.Next(); ent!= NULL; ent = ent-> activeNode.Next())
                                ent-> GetPhysics() - > UpdateTime(time);  //让实体思考
                        }
                }
                
                session-> UpdateScreen(false); //正常的,按序屏幕更新
                {
                    renderSystem-> BeginFrame
                        idGame :: Draw             // Renderer前端。实际上并没有与GPU沟通!
                    renderSystem-> EndFrame
                        R_IssueRenderCommands    //渲染器后端。将GPU优化的命令发布到GPU。
                }
            }
        }
    }        
        
        


有关详细信息,请参阅阅读代码时作为地图使用完全展开循环

它是id软件引擎的标准主循环。除了Sys_StartAsyncThread表示Doom3是多线程的。此线程的目标是处理引擎不希望限制帧速率的时间关键功能:

  • 声音混合
  • 用户输入生成。

琐事: idTech4高级对象都是具有虚拟方法的抽象类。这通常会涉及性能问题,因为每个虚拟方法地址在运行时调用之前都必须在vtable中查找。但是有一个“伎俩”来避免这种情况。所有对象都静态实例化:

        
        
    idCommonLocal commonLocal;                   //实现 
    idCommon * common =&commonLocal;         //指针for gamex86.dll
        
        

由于在数据段中静态分配的对象具有已知类型,编译器可以commonLocal在调用方法时优化远程执行vtable查找接口指针在握手期间使用,因此doom3.exe可以交换对象引用,gamex86.dll但在这种情况下,vtable的成本未被优化。

琐事:从id软件中读取大多数引擎,我发现一些方法名称自从doom1引擎以来就没有改变:负责抽取鼠标和操纵杆输入的方法仍然被称为:IN_frame()


渲染

两个重要部分:

  • 由于Doom3使用门户系统,所以预处理工具dmap完全脱离了传统的bsp构建器。在一个专门的页面上深入审查了它




  • 运行时渲染器具有非常有趣的体系结构,因为它在前端和后端分为两部分:更多的专用页面


剖析

我使用Xcode的仪器来检查CPU周期在哪里。结果和分析在这里


脚本和虚拟机

在每个idTech产品中,VM和脚本语言从以前的版本都完全改变了,他们再次做到了: 细节在这里


面试

在阅读代码时,几个新奇使我感到困惑,所以我写信给约翰·卡马克,他很高兴回复深入的解释:

  • C ++。
  • 渲染器分为两块。
  • 基于文本的资产。
  • 解释的字节码

我还编辑了关于idTech4的所有视频和新闻采访。这些都在采访页面

推荐读数

像往常一样你可以享受的书,如果你喜欢的代码:

还有一件事

夏天来了,并不总是很容易集中






...但总的来说,这是一个大部分的阅读。由于idTech5源代码将不会很快被发布(如果有的话),这让我与idTech3(Quake III)尚未被审查。也许如果有足够的人有兴趣,我会写一些关于它的内容。

注释


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

doom3 源代码评测 1 的相关文章

  • 在运行时更改 AR core 中对象的纹理

    我正在创建一个应用程序 我需要在其中更改 3d 对象的纹理 图案 我正在使用 AR Core SDK 和 android 我已经使用了下面的代码 但它不起作用 Texture builder setSource this R drawabl
  • 如何插值旋转?

    我有两个描述旋转的向量 起始旋转 A 和目标旋转 B 我如何最好地通过因子 F 对 A 进行插值以接近 B 当需要插值多个维度时 即产生不需要的旋转 在向量上使用简单的 lerp 不起作用 也许从旋转向量构建四元数并使用Slerp http
  • xna 防止下坡或上太陡的山

    如何防止在高度图地形上过于陡峭的斜坡或上山 我有一个可以在地形上移动的 3D 相机 它现在可以在任何地方移动 甚至在大斜坡和太陡的山丘上 我该怎么办 如果你试图朝一个方向移动 你应该预测你最终会到达哪里 然后弄清楚是否slope http
  • 给定一个 4x4 齐次矩阵,我如何获得 3D 世界坐标?

    所以我有一个正在旋转然后再次平移和旋转的对象 我将这些翻译的矩阵存储为对象成员 现在 当我进行对象拾取时 我需要知道该对象的 3D 世界坐标 目前我已经能够像这样获得物体的位置 coords 0 finalMatrix 12 坐标 1 最终
  • 受约束景观的程序生成

    我想实现地形的程序生成 经过彻底的研究后 我得出的结论是 应该使用梯度 相干 噪声生成算法之一来实现 例如 Perlin 噪声算法 然而 我不希望生成是完全随机的 我想应用一些限制 例如哪里应该是山脉 或者哪里应该是低地等 问题 例如 我有
  • 使用相机将 3D 透视投影到 2D 屏幕上的基本渲染(无需 opengl)

    假设我有一个如下的数据结构 Camera double x y z ideally the camera angle is positioned to aim at the 0 0 0 point double angleX angleY
  • 是否可以在 Netbeans 7.0 应用程序中使用 Jzy3D?

    好吧 我们正在尝试将 3D 散点图合并到 Netbeans 7 0 中的项目中 我们选择测试的库之一是 Jzy3D 看起来它会做我们需要它做的一切 但不幸的是 它什么也没做 我已经正确安装了 JOGL 并对其进行了测试 发现它可以正常工作
  • 使用 glFrustum 进行离轴投影

    我正在尝试使用 OpenGL 对场景进行离轴投影 并且我阅读了该文档罗伯特 库伊马的离轴投影 http csc lsu edu kooima pdfs gen perspective pdf现在对实际需要做什么有了更好的了解 但仍然有一些部
  • 将点云转换为深度/多通道图像

    我有一个通过使用立体相机扫描平面生成的点云 我已经生成了法线 fpfh 等特征 并使用这些信息我想对点云中的区域进行分类 为了能够使用更传统的 CNN 方法 我想将此点云转换为 opencv 中的多通道图像 我将点云折叠到 XY 平面 并与
  • 编写每个三角形/面具有纯色的 GLSL 片段着色器的方法

    我有顶点和三角形数据 其中包含每个数据的颜色triangle 面 不是每个顶点 即单个顶点由多个面共享 每个面可能具有不同的颜色 我应该如何在 GLSL 中解决这个问题以获得每个的纯色分配face正在渲染 通过平均顶点相邻多边形的颜色来计算
  • 如何在 OpenCV 中绘制图像的 3D 直方图

    更新 我找到更多例子 我现在可以做到 我可以在 3d 中绘制多个直方图吗 https stackoverflow com questions 35210337 can i plot several histograms in 3d 我知道这
  • 如何在plotly 3D曲面图中标记区域?

    我使用plotly从xyz数据创建3D高程剖面图 它与以下代码配合得很好 import plotly graph objects as go import pandas as pd import numpy as np Read data
  • 如何在SceneKit中实现逼真的景深效果?

    我正在尝试渲染具有真实景深效果的帧 我已经尝试过景深属性camera节点 但它不会产生可用的结果 是否可以切换到景深效果的最大渲染质量 性能不是一个因素 我只需要渲染一帧 用户可以等待它 SceneKit 中逼真的景深效果 在SceneKi
  • 3D 数学:根据“向上”和“向上”正交向量计算倾斜(滚动)角度

    我希望这是提出这个问题的正确位置和这个一样 https stackoverflow com questions 3035590 bank angle from up vector and look at vector 但表示为纯数学而不是图
  • 使用 Scipy/Numpy 在浊点的二维插值中仅获取“有效”点

    我有一个通过人的背部摄影测量获得的浊点 我正在尝试对其进行插值以获得规则网格 为此我正在使用scipy interpolate到目前为止取得了良好的成果 问题是 我正在使用的函数 scipy interpolate griddata 使用平
  • CSS3DObject 始终位于 WebGL Mesh 前面

    我正在混合CSS3D Renderer with WebGL Renderer to add HTML3D 空间中的元素WebGL场景 这CSS3DObject在前面WebGL网格即使WebGL Renderer具有较高的 z index
  • 改变for循环的顺序?

    我遇到一种情况 我需要根据用户输入以不同的顺序循环遍历 xyz 坐标 所以我是 3D 空间中的一个区域 然后是一组像这样的 for 循环 for int x 0 x lt build getWidth x for int y 0 y lt
  • 在 RGL 中将立方体绘制到 3D 散点图中

    我正在尝试向 3D 散点图添加较小的立方体 网格 具有指定边长 我希望立方体位于原点 我该怎么做呢 我已经玩过cube3d 但我似乎无法将立方体正确定位 也无法使其成为网格 因此我可以看到它包含的数据点 这是我所拥有的 library rg
  • 不明确的 OpenGL 默认相机位置

    在我的Opengl程序中 在我应用透视投影矩阵之前 每当我绘制一些对象时 我都会在世界坐标系的原点处绘制它 但是几乎所有Opengl教程都指出相机 我的投影视图 位于原点朝向正 z 轴 这取决于您稍后如何处理投影矩阵中的 z 值 但是如果这
  • DirectX::SpriteFont/SpriteBatch 阻止 3D 场景绘制

    我使用时遇到问题DirectX SpriteFont DirectX SpriteBatch 来自 DirectXTK 与此处讨论的问题完全相同 使用 SpriteFont 类绘制文本时出现问题 https stackoverflow co

随机推荐

  • 解决win10相机无法使用,相机崩溃问题

    win10系统可能因很多原因无法使用 例如权限设置 或者win10系统本身问题 此教程教大家如何解决 1 进入电脑系统设置 在里面找到 隐私 并点击进入 2 进入隐私设置界面后 向下滑动找到 相机 并点击进入相机设置 3 在相机设置界面将
  • Reverse入门[不断记录]

    文章目录 前言 一 SWPUCTF 2021 新生赛 re1 二 SWPUCTF 2021 新生赛 re2 三 GFCTF 2021 wordy 花指令 四 NSSRound 3 Team jump by jump 花指令 五 NSSRou
  • win10家庭版没有组策略怎么办?

    转到知乎 https www zhihu com question 53834660 请将以下4行命令复制并粘贴到记事本中 另存为bat文件 之后右击以管理员身份运行即可 pushd dp0 dir b C Windows servicin
  • maven配置多仓库镜像

    maven配置多仓库镜像 问题场景 1 国内访问maven默认远程中央镜像特别慢 解释 因为maven默认的远程仓库是在国外的 2 用阿里的镜像替代远程中央镜像 3 大部分jar包都可以在阿里镜像中找到 部分jar包在阿里镜像中没有 需要单
  • QT 关于如何生成包含多个自定义类的DLL以及如果调用

    新年新气象 新年第一篇 近期想把几个常用的函数的生成dll 这样方便更新的时候 只更新dll就可以了 否则又是发布又是打包比较麻烦 网上有很多例子 不过大部分是简单调用个函数 我遇到的问题是函数中有多个自定义类 下面用两种方法来解决这一问题
  • S7-300哪些24V数字量输入模块需要电源,与电源如何连接

    西门子S7 300哪些24V数字量输入模块需要电源 与电源如何连接 下表说明了S7 300 PLC的24V数字量输入模块的电源插针连接 L M 不在此表上的S7 300 PLC数字量输入模块不需要外部电源 表1 S7 300 PLC模块电源
  • GBT9706.1中B型BF型和CF型各表示什么意思的啊?

    就拿心电仪为例 根据跟患者接触部件的应用部分的防电击分类 B型 BF型 CF型 F型应用部分具有更高的保护要求 漏电流 B代表身体 C代表心脏 B型设备 对电击有特定防护程度的设备 允许漏电流 保护接地连接 若有 的可靠性 BF型 有F型应
  • AI助力航母大变脸:无人机航母浮出海面

    来源 无人机 作者 魏岳江 2023年4月10日 土耳其打造的首艘 无人机航空母舰 正式入列海军 总统雷杰普 塔伊普 埃尔多安出席了这艘名为 阿纳多卢 号的轻型航母服役仪式 该航母长231米 宽32米 排水量逾2 7万吨 满载时最高航速20
  • name="viewport" width="device-width" 到底都是啥

    TOC 参考文件 CSS Pixel与绝对像素 参考文件 移动端适配 dpr浅析 参考文件 pixel is not a pixel is not a pixel 参考文件 此像素非彼像素 参考文件 关于HTML5中meta name vi
  • Node JS 的基本使用

    1 概述 1 什么是Node js Node js 是一个基于 Chrome V8 引擎 的JavaScript 运行环境 2 什么是V8引擎 V8引擎是一款专门解释和执行JS代码的虚拟机 任何程序只要集成了V8引擎都可以执行JS代码 例如
  • 基于SSM+layui实现用户登录功能

    一 搭建SSM框架环境 1 Spring配置文件 applicationContext xml
  • 相随与欢-彩色泡泡机的设计与实现

    相随与欢 长安大学 信息工程学院 人工智能系 大一下 面向对象课程设计 彩色泡泡机题目详解 与欢行 一 题目与需求分析 基于Qt框架的GUI设计与实现 需求 1 绘制泡泡 颜色 大小等配置信息随机产生 2 点击游戏区域即可产生泡泡 3 泡泡
  • 从sampleMNIST看什么是TensorRT

    kagula 2021 11 15 内容概要 在想什么是TensorRT 就这样做个总结 写下自己的理解 环境 On Win10 Pro OS 1 cuda v11 4 3 2 cudnn v8 2 4 3 TensorRT v8 2 0
  • unity接入VR设备(0-1)

    unity接入VR设备 unity2018 4 2f1 1 需要安装Steam 去百度Steam官网 下载并安装Steam 2 登录Steam后 搜索SteamVR 版本1 16 10 并安装 3 在Package Manager中搜索Op
  • 正则提取文章里面的一级标题和对应的一级标题内容

    最近公司项目有个需求 富文本编辑器上传一篇文章后 需要对文章内容里面的一级标题和对应的标题内容做提取处理 然后文章展示的时候就可以用来做锚链接导航处理 此功能主要用到了以下正则 const reg
  • (原)使用mkl中函数LAPACKE_sgesv计算矩阵的逆矩阵

    转载请注明出处 http www cnblogs com darkknightzh p 5578027 html 参考文档 mkl的说明文档 lapack int LAPACKE sgesv int matrix layout lapack
  • Firefox默认可以调用JSON.stringify而IE却不行

    Firefox默认可以调用JSON stringify而IE却不行 如果使用IE浏览器的话则需要加上 jquery json 通过 toJSON 使用
  • 科技赋能,教育革新——大步迈向体育强国梦

    在 全民健身 体育强国建设 战略的推进下 体育考试成绩被纳入重要升学考试且分值不断提高 体育科目的地位逐步上升到前所未有的高度 在此趋势下 体育教学正演变出更多元化 个性化的需求 然而现实中却面临不少问题 学生对体育学科的兴趣不足 体育师资
  • IOS 内购IAP 自动订阅收据验证返回结构体

    exclude old transactions 参数等于true时 数据通过json decode 转换后 1 首次订阅支付通过票据进行验单的返回结构体 Array status gt 0 environment gt Sandbox r
  • doom3 源代码评测 1

    原文地址 http fabiensanglard net doom3 2012年6月8日 DOOM3源代码评测 简介 第1部分 共6部分 gt gt 2011年11月23日 id软件保持传统 并发布了其以前引擎的源代码 这一次是轮到了idT