- 博客(2954)
- 资源 (44)
- 收藏
- 关注
原创 C#开发的OpenRA的游戏主界面逻辑
在这里通过mainmenu.yaml定义的文本名称VERSION_LABEL来找到对应的标签控件,然后再设置文本显示。这行代码是用来设置主菜单是否显示出来,如果菜单显示的类型为MenuType.Main,就显示出来,其它类型不显示。比如点击了按钮,就需要有正确的反应,比如显示另外一个菜单,或者显示一段文字。其它的控件也是通过这样的方式来找到对应的控件,然后进行设置。可见游戏主界面,就是设置按钮显示,并设置按钮的响应的动作。前面介绍了主界面的布局,以及界面内容的显示,C#开发的OpenRA的游戏主界面逻辑。
2023-04-19 09:58:37 321 1
原创 C#开发的OpenRA的游戏主界面怎么样创建8
接着显示是一个单人玩的游戏按钮,显示的内容为Singleplayer。这是定义扩展菜单的内容,当用户点击上面扩展菜单时会显示这些菜单内容。这是定义游戏管理内容按钮,显示内容为Manage Content。这里定义这个菜单的标题,显示的内容为Main Menu。这是多人玩的游戏按钮,显示内容为Multiplayer。接着下来,就剩最下面的功能了,但是也是最复杂的一部分,因为这是实现整个游戏的交互功能,比如单人玩游戏的选择,这是定义游戏切换到另外的按钮,显示内容为Extras。继续游戏主界面创建的主题,
2023-03-12 13:55:16 481
原创 C#开发的OpenRA的游戏主界面怎么样创建7
这里先定义一个容器Container,容器相当于一个窗口,容器的名称叫做SHELLMAP_DECORATIONS,图片的来源,跟前面那篇文章是一样的,都是来源于集合logos,名称分别是nod-load、gdi-load。在文件mainmenu.yaml定义了一个版本显示标签,通过这个标签就可以显示当前正在运行游戏的版本,然后在这个容器里添加两个子图片控件,一个用来显示NOD图片,一个用来显示GDI图片。所以在版本里显示DEV_VERSION,没有写任何的版本信息。继续游戏主界面创建的主题,
2023-03-09 16:49:50 648
原创 C#开发的OpenRA的游戏主界面怎么样创建6
来源位置为图片字典,查找的键是logos,这时就找到上面的字典对象,再根据名称eva来找到对应的较图片,这里使用的图片,都是来源于文件chrome.png,因此我们只需要定义使用那一个图片的坐标位置即可。最右边就是显示EVA的图片和版本号,本文就来介绍图片EVA和版本号的显示。要想显示图片EVA,那么就得搞懂图片的来源,才能显示出来。我们发现所有图片的显示,都是基于纹理的,所以这里显示也不例外。所以这些坐标位置,都定义在文件chrome.yaml里,有了图片的基础,再来显示EVA这个图标,就相对容易了。
2023-03-09 15:03:30 553
原创 C#开发的OpenRA的游戏主界面怎么样创建5
这里定义了一个滚动显示面板ScrollPanel,包含了一个新联显示的模板NEWS_ITEM_TEMPLATE,一个标签显示新闻状态NEWS_STATUS。这行代码是用来加载已经创建布局的对话框, NEWS_PANEL并不是在文件mainmenu.yaml里定义的,由于这部分UI,还是基于主游戏界面,那么它的组成部分,必然在mainmenu.yaml里有所体现,第二个参数就是显示新闻的窗口newsBG,它就是前面创建的窗口“NEWS_BG”。当点击这个按钮时,就会弹出一个对话框窗口来显示对应的新闻。
2023-03-08 13:51:49 710 1
原创 C#开发的OpenRA的游戏主界面怎么样创建4
这行代码的第二个参数"LOCAL_PROFILE_PANEL",它是一个id参数,说明它已经在其它地方定义过这个窗口。其它的相关逻辑功能,就比较简单了,它的逻辑功能定义在类LocalProfileLogic里。因为在这里所有UI的显示,都是需要我们自己动手实现,操作系统的UI已经没有任何关系。前面加载窗口时,就使用到这个id,可见这个窗口是在前面的代码进行预先加载,在这里非常简单,只是定义它显示的X轴和Y轴的坐标,其它参数都没有。显然不可能是在这里定义的,需要我们继续分析后面的代码,
2023-03-07 14:58:33 658
原创 C#开发的OpenRA的游戏主界面怎么样创建3
widgetType是传入子部件的类型,比如Label@VERSION_LABEL,表示使用标签。widgetType.Split('@')[0],这行代码就是把字符串Label@VERSION_LABEL进行拆分,并且获得最前面的字符串,那么就是Label,然后在第二行代码里组合,也就是与"Widget"字符串组合,就生成新的字符串LabelWidget,由此可见,在yaml文件里定义子控件时,前面都是类型的名称,后面窗口名称。在这个类里,主要调用Draw()函数来实现显示,计算字符串显示位置和颜色,
2023-03-06 11:21:12 767 1
原创 C#开发的OpenRA的游戏主界面怎么样创建2
这行代码是对窗口最后初始化进行处理,比如创建逻辑处理类,并进行初始化,这样窗口就可以进入显示和响应消息操作了。这段代码是找到这个窗口的逻辑处理类,比如游戏主界面就是通过yaml文件里找到MainMenuLogic类。这种方式有点像先把对象参数保存在文件里,然后创建一个空白的对象,再从文件里把这个对象的数据恢复过来。这段代码是找到所有已经初始化的类对象,然后进行遍历,其中就有主界面的初始化。继续游戏主界面创建的主题,前面已经说明了怎么样找到游戏主界面的入口,这就是使用到前面提到的成员变量从文件加载的功能。
2023-03-04 15:15:01 2193
原创 C#开发的OpenRA的游戏主界面怎么样创建
这样就加载了mod.yaml的Rules定义,接着就可以找到world.yaml文件。其实在mod.yaml的Rules里定义文件world.yaml的字段World,都是需要在程序里创建所有属性,这些属性是通过文件来定义,然后动态地创建。现在就来解决这个问题,其实整个游戏都是可以通过yaml文件进行配置的,通过前面加载界面布局数据,可以把整个界面逻辑的数据加载到内存,当加载界面在完成加载数据之后,就会关闭,接着出现游戏的主界面,world.yaml文件是定义整个游戏世界配置的文件,
2023-03-04 10:41:45 744
原创 C#开发的OpenRA的界面布局数据加载
在这个节点里,经过var key = w.Key.Substring(w.Key.IndexOf('@') + 1)的处理,就会得到MENU_BACKGROUND为键,modData.Manifest.ChromeLayout是保存所有界面布局的文件列表,它主要保存文件mod.yaml里下面的键:ChromeLayout。widgets用来保存所有文件里的键值对,方便后面使用时,只要给出键,就可以找到对应的值。包含所有UI的布局文件参数,它是比较多内容的,所以加载时间会比较长一些。然后再处理时间长的加载。
2023-03-02 13:42:39 515
原创 C#开发的OpenRA的加载游戏UI绘制
这段代码前面三行,直接调用DrawSprite函数来显示图标出来,并没有像边框那样进行切分,因为整个图标是一个整体,进行切分显示是不可能的。loadingPos是用来保存加载字符串显示位置,这里计算是屏幕的X轴中间位置,Y轴位置是barY,也就是屏幕的底部。总共有16块,分成两段,左右各8块,两边显示的位置是一样的。到这里就完成了加载界面的分析,从纹理的加载,再到OpenGL着色器初始化,再到顶点数据到着色器的处理,因为字符串是一个文本串,也就是一个编码代号,并没有图像信息,所以是不能直接显示到显示卡的。
2023-03-02 09:19:13 215
原创 C#开发的OpenRA的纹理图片显示到顶点缓冲区
vertices是保存所有需要显示顶点坐标的缓冲区,它是Vertex类的数组,默认创建的大小是8K个顶点,如果空间不足,它就会立即把这些顶点进行显示,并清空才能写入下一批显示内容。这里调用的函数是属于类SpriteRenderer的函数,它主要实现像素图进行显示,也就是实现纹理图片显示,在这里是显示UI的内容。来显示加载游戏界面的边框,bounds整个屏幕的大小,border是9个边框的纹理数组。因为每一个边框的长度,可能都大于纹理图片的尺寸,如果使用整个纹理,就会需要插值,
2023-03-01 15:01:33 356
原创 C#开发的OpenRA的Shader加载、编译和设置使用
也即开发人员写的短小的自定义程序,他们是在图形卡的GPU (Graphic Processor Unit图形处理单元)上执行的,然后调用函数glCreateShader来创建一个着色器对象,调用函数glShaderSource来替换当前着色器对象的代码,在这个类Shader的构造函数里,首先是加载编译Vertex Shader(顶点着色器)和Fragment(片断着色器),通过上面的设置,就可以设置好着色器,可以在后面的代码里调用它来显示相应的纹理和顶点数据,并且设定了交互数据的接口。
2023-03-01 10:15:22 414
原创 C#开发的OpenRA的GLSL介绍
因此,接着下来需要编写一个GLSL程序,GLSL使用类型限定符而不是通过读取和写入操作来管理输入和输出。所有这些动作,都需要OpenRA里实现,所以要理解这个,涉及到的知识就非常多。有了上面两个文件,还不能直接使用,需要对这两个文件进行加载、编译、连接、检查是否出错,这个结构决定了程序里向显示卡输入数据的格式,所有数据格式都需要定义为这个数组的形式,如果没有学习过这门语言,要写一个着色程序又是一个大工程,幸好这里有一个简单的例子,需要设置界面的纹理,然后再创建三角形顶点,这样由两个三角形组成一个平面,
2023-02-28 11:19:14 394
原创 C#开发的OpenRA的加载界面边框的细节
Top, Left, Bottom, Right是纹理坐标UV值,在-1.0到1.0之间,用在物体渲染时,纹理图片贴图怎么样放置。在这行代码里,第一个参数是显示对象,第二个参数是Sheet对象,它就是纹理图片管理的对象,第三个参数是图片的大小倍数。density是图片的大小倍数,用来计算纹理图片在图片里的像素的位置。(129, 129)是原来加载纹理图片里的坐标位置,32是X轴方向的大小,另外一个32是Y轴方向的大小。切分时,就可以得到四边形的坐标,然后把这个四边形显示在坐标(x,y)的地方。
2023-02-26 15:19:47 598
原创 C#开发的OpenRA的OpenGL渲染显示
我们可以指定一个矩形的剪裁窗口,当启用剪裁测试后,只有在这个窗口之内的像素才能被绘制,其它像素则会被丢弃。换句话说,无论怎么绘制,剪裁窗口以外的像素将不会被修改。接着调用函数Flush(),这个函数就会触发SpriteRenderer类进行Flush运行,最后调用OpenGL的。DisplayInner()负责创建当前UI界面显示的内容,比如按钮,文本显示等等。首先判断是否是UI类型RenderType.UI的显示,如果不是就会报错,并返回。由于图象的数据已经绘制,最后就是压入到显示缓存了。
2023-02-26 11:08:44 580
原创 C#开发的OpenRA的管理FBO(Framebuffer Object)
如果纹理是立方体贴图纹理,则GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE的值设置为textarget;GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME的值设置为0. GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL和GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE分别设置为默认值0和GL_TEXTURE_CUBE_MAP_POSITIVE_X。
2023-02-22 08:55:15 274
原创 C#开发的OpenRA的NextPowerOf2
0000 0000 0000 0001 1000 0000 0000 0000 //与原值或 ,1的位数翻倍。0000 0000 0000 0001 1110 0000 0000 0000 //与原值或,1的位数再翻倍。0000 0000 0000 0000 0000 0000 0000 0001 //右移16位。0000 0000 0000 0000 1000 0000 0000 0000 //右移1位。0000 0000 0000 0000 0110 0000 0000 0000 //右移2位。
2023-02-21 10:07:04 634
原创 C#开发的OpenRA的OpenGL创建纹理流程
在这里设置了纹理被缩小(GL_TEXTURE_MIN_FILTER)情况,采用线性插值(OpenGL.GL_LINEAR)还是近邻插值(OpenGL.GL_NEAREST)。GL_TEXTURE_BASE_LEVEL表示纹理最小使用级别为0, GL_TEXTURE_MAX_LEVEL表示纹理最大级别也为0,不做多级纹理优化。当超过纹理坐标时,GL_TEXTURE_WRAP_S表示X轴方向采用GL_CLAMP_TO_EDGE边缘颜色扩展。纹理被放大(GL_TEXTURE_MAG_FILTER)情况也是一样。
2023-02-20 17:38:24 610
原创 C#开发的OpenRA游戏高性能内存访问的方法
可以看到A是放在高位,B是放在低位。由于INTEL的内存是小端格式,所以就是BGRA了。由于这里是采用垃圾回收的方式语言C#,那么在不优化的情况下,它是使用管制的内存。(1).单纯的图像文件是无法被我们直接用来在Scene视图中看见或则进行操作的。不管来源的格式是什么样的,最终都需要转换为ARGB的格式,即是32位表示的颜色。比如王者荣耀里,一个大招是否及时地放得出来,就会影响到一场比赛的关键。虽然这样会比危险一些,但是为了性能的提升,这些冒险是值得的。而这个大招的释放,又取决于游戏运行在手机上的性能。
2023-02-20 11:14:06 527
原创 C#开发的OpenRA游戏加载界面的实现
BlankLoadScreen实现了显示一个空白的界面,SheetLoadScreen实现显示一个带有纹理的界面。Image是不放大的图片,它是1024X512的大小png图片。在这里是通过后面的值:CncLoadScreen,这个值决定了加载那个类的界面,它是mod.dll里的类名称,通过这个名称,就可以找到这个类,并且创建类实例。但是游戏的UI都是自己处理的,不能使用像Windows自带的UI。这样游戏的UI,其实也是使用游戏的方式来显示的,游戏的界面有很多,先从一个简单的加载界面开始。
2023-02-17 17:45:52 984
原创 C#开发的OpenRA游戏帧计时的实现
这样就可以降低CPU和GPU的运算,让电脑少费点电,多多节能,这样也能社会起到很好的环保作用。所以游戏帧速度,就需要使用一个时间来计数,如果超过60帧之后,就要增加延时,一般情况下,人的眼睛只有超过24帧每秒,就已经感觉不出来画面是否不连续了。特别游戏的界面渲染时,可以把帧率降到很低,每秒钟几帧就可以了。也就是说非常费电的,如果这个不控制好,使用最高的帧率,因此,软件开发人员也是为社会的能源消耗作出很大的贡献。下面用一个简单的例子演示类Stopwatch的使用。游戏里显示每个画面,都是通过实进渲染进行的。
2023-02-17 09:45:39 390
原创 C#开发的OpenRA使用自定义字典的比较函数
比如一个盒子的大小,不能通过对象的HASH值来认为它们是相等的,因为盒子的大小是通过长宽高来决定。由于字典是采用HASH算法,所以它的查找时间是非常快,并且索引类型也没有太多限制,只要认值地理解后面的例子,就可以熟悉相关的内容,才可以看懂OpenRA里的代码。默认的情况可能是采用对象的HASH值,但是这种情况在普通的对象是可以使用的。这是比较困难的,如果有一个模板,再从这个模板上进行扩展,可以适用的类型就普通数据的范围就大得多了。字典由于键的唯一性,如果自定义的类作为键,后面提供的例子,就是这样的作用。
2023-02-16 11:53:18 478
原创 C#开发的OpenRA加载文件的管理
并且这些文件各种各样,也有很多小文件,为了避免过多的小文件,发行时会把众多的小文件合并成一个大文件。一个游戏里,文件管理是一件比较常见的事情,因为很多游戏图片、动画都是基于文件的方式保存。在前面我们分析了mod.yaml文件,发现里面有很多文件列表,这些文件是主要的资源文件,所以需要提前打开,并缓存起来。这个函数,就是为从缓存文件里获得对应文件而准备的。后面就可以通过上面的容器来访问所有这些文件。C#开发的OpenRA加载文件的管理。因此还会涉及到文件压缩和解压的需求。
2023-02-16 09:55:46 326
原创 C#开发的OpenRA动态加载插件DLL里的类实现
比如Mix类型文件,就需要使用类MixLoader来加载,它是定义在文件MixFile.cs里,通过上述的方式,就可以通过加载不同的DLL,从而实现加载不同的类,就可以读取不同格式的文件。要实现上述的目的,就需要先加载DLL的程序集信息,这个在前面的文章里有讨论过。意思就是说,每个类定义一定的接口,然后把这些类写在不同的DLL里,并且游戏里有很多资源类型的文件,不同的文件采用读取算法不一样,那么每个人实现的代码是不一样的,算法也是不一样的。所以实现的代码也不一样,这时候就有多个类。
2023-02-15 10:31:02 618 1
原创 C#开发的OpenRA的只读字典IReadOnlyDictionary实现
但是在OpenRA里大量使用这种方式,可见这个特性使用起来还是有一点难度的。因为要实现IReadOnlyDictionary接口,需要实现比较多的接口。但是如果在一个大型的代码,或者要求比较严格的代码里,就需要考虑这个问题了。我们其实可以学习OpenRA里的代码,这样就可以很方便使用这个功能了。这是一个高级的实现方式,一般情况下,开发人员不会考虑这个问题的。毕竟代码里,只要小心地使用,还是不会出问题的。不仅可以实现字典的迭代访问,还可以只读的方式。在普通的教科书,也没有提到这个功能的实现。
2023-02-14 17:30:02 508
原创 C#开发的OpenRA的mod配置文件的容器Manifest类
这些内容就会通过List保存,然后保存在Dictionary结构里。由于一个游戏里有多个mod可能,所以采用字典Dictionary来保存多个mod的配置。最后通过函数MiniYaml.FromStream()返回整个文件mod.yaml的内容,因此,最后所有mod.yaml文件的内容都会保存类Manifest里,最后通过这个结构来访问所有mod.yaml的内容。
2023-02-14 11:04:51 501
原创 C#开发的OpenRA的yaml文件读取和分析
在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。类MiniYamlNode是用来描述每一个节点的键和值,由于值可以是yaml文件,所以的值可能是类MiniYaml。从前面分析整个mod.yaml文件可以知道,它是一个键值对的描述文件。
2023-02-13 14:08:08 572
原创 C#开发的OpenRA使用TrimExcess方法
所以在这里为了减少内存的占用,就调用了方法TrimExcess来进行压缩列表刚好等于列表里元素的实际数量。在上面代码里遍历整个节点列表,把所有节点都调用TrimExcess方法处理一下,对于平时的应用来说,创建List对象是比较少的,所以不用关心浪费内存的空间。要回答这个问题,就需要了解List类型存储的内存分配机制。它会分配一个适合内存管理大小的内存,当你只保存一个元素时,这样做的意义就是提高整个代码的运行速度,不过有一个缺点,由于保存的节点较多,那么这样浪费的内存就非常可观了。
2023-02-13 10:47:06 545
原创 C#开发的OpenRA的扩展方法
但是我们也没有Stream的代码,所以不能采用继承的方法来实现,只能采用扩展方法。扩展方法的第一个参数必须包含关键字this,并且在后面指定扩展的类的名称。2)如果扩展方法和该类型中定义的方法具有相同的签名,则扩展方法不会被调用。在OpenRA游戏里,由于需要读取大量的图片文件,为了减少内存的操作,1)扩展方法必须为静态方法,但可以向扩展类型上的实例方法一样进行调用。对一个类进行扩展方法,只有继父类,然后在子类里创建新的内容。在后面的例子里,演示了扩展方法,也演示了怎么样减少内存操作。
2023-02-10 17:02:13 1742 1
原创 C#开发的OpenRA的mod.yaml文件
这个标签是列出一个或多个yaml文件,这些文件定义游戏UI界面的颜色、字体大小、字体种类等等。这个标签是列出一个或多个yaml文件,这些文件定义地图可用的贴图,例如雪、温带地区、内陆等。这个标签是列出一个或多个yaml文件,这些文件定义游戏里可放置的物品,比如人、汽车、房等等。可见这个文件的重要性是非常高的,如果这个游戏目录下不存在这个文件,说明根据不用会加载资源。这个标签是列出一个或多个yaml文件,这些文件定义游戏UI界面的贴图。由此可见,这个文件是一个资源描述文件,是一个所有游戏文件的描述清单。
2023-02-10 13:35:54 387
原创 C#开发的OpenRA的读取文件的函数
而当下的游戏,都是每周进行热更新,并且数据量越来越大,就是因为需要更多的图片。在读取这些文件时,需要注意的只能读取,不要去更改它,因为这些图片不容修改。因为游戏跟电影是一样,就是不断地展示场景,以及人物的动作。其实游戏的大部分工作都不是在开发上,而是在美工方面。很久以前,我以为开发游戏的主要功能是在程序开发上,在OpenRA游戏里,读取文件是必备的功能。C#开发的OpenRA的读取文件的函数。它是打开一个文件,返回只读的流对象。这里的函数都是上一个文章里类函数。也有可能是一个压缩的ZIP文件。
2023-02-10 09:11:07 732
原创 C#开发的OpenRA的判断文件是否存在和目录文件读写
这行代码创建一个目录管理类Folder,这个类Folder主要作用是对一个目录进行管理,比如获取整个目录的文件列表、文件读取、文件删除、文件更新。Directory.GetFiles方法获取整个目录的文件列表, Directory.GetDirectories方法获取整个目录的子目录列表,在这个类里,有一个函数实现是比较经典,它主要用来获取整个目录里文件和子目录的列表,并且排序。在这个函数里,先用Directory.Exists函数来判断游戏资源的目录是否存在,就根据用户选择来打开指定的目录的游戏。
2023-02-10 08:37:49 308
原创 C#开发的OpenRA的Enumerable.Concat方法应用
这行代码,是把一个字符列表都遍历一遍,然后每一项路径取出最后的目录名称和路径组成一个新的元组(Id, Path).在这里调用GetCandidateMods(searchPaths).Concat方法,这里需要注意关注的。从搜索目录searchPaths里返回的结果,再拼接到指定搜索目录explicitPaths里。它是采用了Enumerable.Concat方法,实现两个列表的结果集进行合并。在OpenRA游戏里,可以让用户指定搜索目录,也可以搜索应用程序所在的目录。
2023-02-09 15:16:01 556
原创 C#开发的OpenRA实现目录搜索
在这行代码里,subdir.Name表示目录的名称,subdir.FullName表示整个路径的名称。可以把所有目录生成一个列表,比如像 List 类型。在这里目录的名称作为不同游戏的名称,路径作为游戏资源所在的目录。这样就可以记住了游戏所需要加载的资源,以及对应不同游戏的种类。而进行目录搜索的关键,就是熟练地使用系统的目录相关的API,说明输入的搜索的目录,也是一个路径列表,可以搜索多个目录。那么就需要对整个游戏的目录进行搜索,它对应的是(游戏id, 路径)。
2023-02-09 13:28:17 291
原创 C#开发的OpenRA实现应用程序目录的获取
当调用一次这个函数之后engineDirAccessed就会设置为true,后面就不再调用前面获取应用程序目录的函数了。在这里,modSearchPaths就会获取Platform.EngineDir + "mods"的目录。在OpenRA里,通过函数EngineDir来获取OpenRA\mods的目录。现在就来说说怎么样使用应用程序来定位,通过定位就可以获取游戏资源的目录,一般来说有两种方法,第一种是由安装程序来写入安装的目录,由于用户会安装在不同的目录,不同的盘符上,
2023-02-09 08:57:44 402
原创 C#里动态加载插件的信息收集
要找到这样的项目是一件不容易的事情,经过反复比较,感觉还是OpenRA这个游戏项目比较值得学习。其实可以向开源项目学习,毕竟开源的项目可以拿到代码,这样就可以编译,修改和运行。即使写出来了,也是一个难懂的项目,还需要数年的修改,才会有让别人学习的可能。要找一个中型的项目,又要比较有趣,又有比较好的设计,还是C#的项目。而在实践的过程中,如果只写100多行的代码,只会学会某个知识点,比如一个游戏可以有不同的版本,但是每一个版本写在不同的DLL里。因为自己是刚学习的,想写一个大型项目出来,也是写不出来。
2023-02-08 11:28:43 369
原创 C#里使用UdpClient和线程来创建UDP网络通讯
UDP是无法发送大量的数据,如果要发送大量的数据,需要自己控制重发机制,需要自己重发丢包的数据包。虽然UDP是无连接的协议,比TCP要差那么一些,但是对于简单的数据读取,又是很方便的。如果只是用来不断地读取数据,那么丢掉几个数据包是不会影响应用,那么就可以使用。又或者与PLC通讯,而PLC采用UDP的协议,而不是使用TCP协议。打开两个程序,然后修改为不同的端口,就可以在同一台电脑上测试了。作为一个软件开发人员,所以必须要熟练地使用UDP进行通讯,在开发的过程中,时不时就需要使用到UDP通讯。
2023-02-06 13:56:10 1301
原创 C#里最简单向文件追加文本的方法AppendAllText
在开发的过程中,经常会碰到这样的问题,就是当一个文件没有创建时,就需要创建。但是文件已经创建了,就直接追加数据。这个函数使用比较方便,只要给出文件路径,把写入的内容放到函数里,就可以实现追加,每天都在固定的时间去记录一下这个温度,那么就需要在这个文件后面追加数据。最新添加的内容2023/2/3 10:22:03。最新添加的内容2023/2/3 10:22:07。最新添加的内容2023/2/3 10:22:34。最新添加的内容2023/2/3 10:22:37。不用自己去打开文件,以及关闭文件的过程。
2023-02-03 14:03:42 2798
原创 C#里error CS0136: 无法在此范围中声明名为“e”的局部变量或参数
又有于我们经常把异常的Exception,也定义为e,如果这时候不关注到参数里已经定义这个变量,说明函数参数的定义的变量,与后面自己声明的变量重复了,就会导致这个出错信息。特别在一些按钮函数里,当你写的代码比较长时,更加容易出现,这是为什么呢?因此发现这个出错码之后,主要检查是否重复定义了相同的变量。在开发的过程中,一不小心,就会碰到这个出错CS0136。这时候只需要修改任何一个参数不为e,就可以了,比如把异常。那么就会提示这个出错,就会一直找不到错误的地方。修改为上面代码之后,就可以编译通过。
2023-02-02 16:29:21 1852
python抓取天气并分析 实例源码
2017-08-28
书《深度学习》
2017-03-13
国产8051模拟器
2016-09-10
tinyxml2配套源码
2016-06-27
selenium的浏览器驱动
2016-06-14
开源鸿蒙4.0不能进入桌面的补丁
2024-03-17
开源鸿蒙 4.0 RK3566开发板配置
2024-03-17
svm_hog_data.rar
2020-03-02
实现numpy的C++库扩展
2019-11-24
python web py入门配套源代码
2018-02-23
webpy演示例子1
2018-02-21
胶囊模型的代码
2018-02-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人