- 博客(29)
- 收藏
- 关注
原创 [Lua]实现类似C#的 string.Format 函数
Lua 的字符串格式化是继承 C 的方式,采用%s、%d、%f 等方式进行格式化,而在 C# 中采用 {0}、{0:D2} 的方式进行格式化,下面代码在 Lua 中实现 C# 形式的格式化,这里只实现了{0}形式,对于{0:D2}等形式不支持。这种实现与 lua 的格式化相比,并不具备性能优势,完全是因为个人习惯使用 C# 的格式化形式。function Format(fmt,...) a...
2018-10-31 14:33:49 1370
原创 [Lua] 优化列表多元素删除
[Lua] 从列表中删除多个元素在 Lua 的内置库中,table 提供了 table.remove(t,[num]) 来删除列表中的元素,因为在该函数的执行过程涉及到了内存的移动,所以在删除多个元素的时候,如果每次都调用该函数,就会造成多次内存移动。针对这一点,对 table 进行一些删除操作上的性能优化,代码基本上是从 C# 源码中抄过来的:-D,介绍在这里,下面直接附上代码,里面注释比较...
2018-10-25 23:46:46 852
原创 UGUI最佳实践(5) -其他 UI 优化技术和技巧
其他UI优化技术和技巧本章主要包含一些有助于提高 UI 性能的建议,但是其中的一些方法可能难以维护,或者可能产生讨厌的副作用。也有一些方法是简化开发的变通方法,还有一些是解决性能问题的变通方法。基于RectTransform的布局Layout 组件比较昂贵,因为每次标记为dirty时,它们必须重新计算子元素的大小和位置。(详细可以参考图形重构部分)。如果给定布局中元素数量相对较少且固定,且布...
2018-10-10 21:23:42 286
原创 字符编码:ASCII 与 UTF-8编码
字符编码:ASCII 与 UTF-8 编码在计算机内部,所有的数据都是以二进制0、1表示,每个二进制位为一个比特(Bit),但是一个Bit能表示的信息太少,所以一个最小的操作单位应该包含多个多个比特,起初这个单位并没有统一标准,有4比特一个单位的,也有7个、8个比特一个单位的,但是最终还是8比特单位一统江湖,这就有了后来的 1Byte= 8Bit。为什么需要对字符编码呢?如果没有字符编码,通过...
2018-10-04 22:42:09 15859 2
原创 UGUI中实现多边形网格显示图形
UGUI中实现多边形渲染在使用UGUI Image组件显示不规则图片、镂空图片时,Image总是会创建一个四边形网格来显示图形,渲染过程中,GPU需要对完全透明的区域进行计算,这不利于性能的优化,一个解决办法是采用多边形网格显示图形,来减少这种不必要的消耗。整个方案的实现过程包括以下几个步骤: 1. 生成图集,这里推荐使用 Texture Packer,这里要求导出 tpsheet 格式...
2018-09-16 14:29:11 1229
原创 TexturePacker 图集转成 Unity Sprite
首先在 Texture Packer 将图片导出成 Json格式,然后将导出的 图片和json文件放到项目中同一目录下。将工具放到工程的 Editor 目录下。选中导入的贴图,右键选择转换菜单”TexturePacker–>UnitySprite”。using UnityEngine;using System.Collections;using UnityEditor;us...
2018-09-15 11:43:36 1319
原创 UGUI最佳实践(4) - UI 控件优化
UI控件优化本章主要讨论特定类型UI控件的优化,虽然大多数UI控件在性能方面变化不大,但是有两个控件在项目后期经常会出现性能问题,这两个控件分别是 Text 和 ScrollRect。UI TextUGUI内置的 Text 组件可以方便的显示文字,然而,我并不知道它底层的很多行为,这些往往会成为性能的热点,必须记住的一点是,当我们向 UI 添加一个 Text 组件的时候,它会为每个字符...
2018-09-13 22:23:28 1009
原创 UGUI最佳实践(3) - 填充率、画布、输入
填充率、画布、输入解决填充率问题在第一篇中介绍了填充率以及过度绘制,过度绘制会造成GPU片段管线处理压力,主要有两种方式来减少这种压力(片段管线主要是负责像素输出): 1. 减少 shader 片段的复杂度,详细参考下面 “UI Shader和低配设备” 章节内容。 2. 减少需要采样的像素数量。由于内置的UI Shader都是标准通用的,一个很大问题就是填充率过高。这通常是因...
2018-09-09 21:58:03 788 1
原创 UGUI最佳实践(2) - UGUI性能分析工具
UGUI性能分析工具性能分析有很多可用的工具,下面是常用的几种:Unity ProfilerUnity Frame DebuggerXcode InstrumentsXcode Frame DebuggerUnity ProfilerUnity Profiler主要用来进行比较分析:在Unity Profiler运行的时候,通过启用、禁用一些 UI 元素,如果发现波形的振...
2018-09-06 21:36:35 1919
原创 UGUI最佳实践(1) - UGUI基础
UGUI基础在学习和使用UGUI之前,首先理解UGUI的各个组成部分非常重要,UGUI是由多个类和组件构成的系统。本章主要介绍一些相关术语,这些术语将贯穿整个系统,然后还会涉及到一些UGUI底层的知识。术语Canvas - 画布组件Canvas组件是将其下的各个排序好的图形提供给渲染系统,然后再由渲染系统将之显示到屏幕或者三维世界中。Canvas需要对它下面的网格进行批...
2018-09-05 22:37:46 842
原创 关于C#中List<T>类的使用建议
C#在为我们提供便捷的同时,也遮蔽了很多内部的实现,而研究这些实现能够帮助我们更好的优化程序。本篇主要简单介绍 List &amp;amp;amp;amp;lt; T &amp;amp;amp;amp;gt; 类在使用时的一些注意事项,List &amp;amp;amp;amp;lt; T &amp;amp;amp;amp;gt; 类内部是通过静态数组进行实现的,所以就有会有一下几点问题:1. 添加元素时数组容量变化每次添加(Add、I
2018-08-11 14:04:09 902
原创 UGUI 分屏显示BUG解决办法
UGUI提供了分屏显示功能,可以通过 Canvas 的 TargetDisplay 属性指定在哪个显示器进行显示,但是经过实践发现,该功能存在一些Bug,主要是两个分屏的UGUI会相互干扰,(点击屏幕A内的UI,其他界面相应位置也会被点击),根据官方的说法,由于当前版本(2017.4.2f2)多屏显示存在问题,所以UGUI的多屏显示无法进行修复。(吐槽下Unity对PC端的支持和更新真是差) ...
2018-07-30 11:29:10 1079 15
转载 (转)高效代码审查的十个经验
原文地址:http://www.williamlong.info/archives/3272.html 代码审查(Code Review)是软件开发中常用的手段,和QA测试相比,它更容易发现和架构以及时序相关等较难发现的问题,还可以帮助团队成员提高编程技能,统一编程风格等。 1. 代码审查要求团队有良好的文化 团队需要认识到代码审查是为了提高整个团队的能力,而不是针对个体设置的检查...
2018-07-20 10:29:42 255
转载 C++操作符的优先级 及其记忆方法
优先级 操作符 描述 例子 结合性 1 () [] -> . :: ++ -- 调节优先级的括号操作符 数组下标访问操作符 通过指向对象的指针访问成员的操作符 通过对象本身访问成员的操作符 作用域操作符 后置自增操作符 后置自减操作符 (a + b) / 4; arra...
2018-07-19 22:17:15 169
转载 轻松学正则表达式
原文地址什么是正则表达式? 正则表达式是一组由字母和符号组成的特殊文本, 它可以用来从文本中找出满足你想要的格式的句子.一个正则表达式是在一个主体字符串中从左到右匹配字符串时的一种样式. “Regular expression”这个词比较拗口, 我们常使用缩写的术语”regex”或”regexp”. 正则表达式可以从一个基础字符串中根据一定的匹配模式替换文本中的字符串、验证表...
2018-06-26 13:38:53 288
翻译 C# 堆内存 vs 栈内存 (2)
C# 堆内存与栈内存 - 参数传递第一部分了解了堆内存和栈内存的基本概念,以及值类型和引用了类型的内存分配,同时也了解了指针的基本情况。本节主要是介绍在函数调用时参数的传递情况。参数概述在第一部分了解了函数调用时内存分配的基本情况,这一部分将对做进一步详细介绍。当调用一个函数时,会发生如下操作: 1. ...
2018-06-13 23:02:04 517
原创 简单的 CSV 文件解析库
直接上代码,最后附下载地址。using System;using System.Collections.Generic;using System.IO;using System.Runtime.InteropServices;namespace Frame.Data{ /// &amp;lt;summary&amp;gt; /// 数据表 /// &amp;lt;/summary&amp;...
2018-05-30 21:46:59 725 2
原创 【Unity3D Shader】实现流光效果
流光效果图: 演示工程:下载地址//功能需求:模拟数据传送效果,高亮色块从模型上方移动到下方//功能分析:这里采用UV动画的方式来实现,利用Alpha贴图控制流动的形状// 利用Alpha遮罩贴图,控制模型中哪些地方需要进行流动Shader "Custom/DataFlowEffect"{ Properties { _MainC...
2018-05-17 18:23:39 6432
原创 Unity3D WebGL异常:RangeError:Maximum call stack size exceeded
造成该异常通常有两种原因: 1. UnityLoader路径设置问题。 2. StreamingAssets文件夹目录问题。默认发布WebGl之后,会有一个 Index.html 文件,内容大致如下:<!DOCTYPE html><html lang="en-us"> <head> <meta charset="utf-8">...
2018-05-14 16:21:41 4738
翻译 C# 堆内存 vs 栈内存 (1)
概述在.Net当中,有Clr帮我们进行内存管理和垃圾回收,但这并不意味着我们不需要关心这些机制。为了优化程序的性能,在编写程序时,就必须要考虑内存管理和垃圾回收。同时,理解内存管理机制,能够帮我们理解各个类型变量的特性。在这篇文章中,将介绍栈内存和堆内存的基础,以及各种类型变量和他们的特性。 当程序运行时,.Net会在两个地方存储程序信息,堆内存和栈内存,它们只是对内存的逻辑分段,在程序...
2018-05-06 22:50:52 1964 1
原创 Mac OSX系统下使用DosBox编写汇编
Mac OSX系统下使用DosBox编写汇编在这篇文章介绍了Win8、Win7下面如何设置DosBox进行汇编,今天在看下在Mac OSX下怎么搭建环境。首先下载安装DosBox for mac版本:下载地址 然后下载Debug、Masm、Link等工具,用Windows同一个版本就可以:下载地址, 备用下载地址然后在 Users/your name/ 目录下创建目录 DOS文件夹,...
2018-04-29 23:15:47 4779 2
转载 Win8下用DOSBox编写汇编语言
Win8下用DOSBox编写汇编语言 DOSBox 是一个 DOS模拟程序,可以很方便的移植到其他的平台,因此可以使用它在Win8系统中编写汇编语言。下面提供相关下载链接: DOSBox下载: http://pan.baidu.com/s/1qWwkss0 汇编工具下载: http://pan.baidu.com/s/1i3taKmT DOSBox使用指南:(1)在你...
2018-04-27 15:44:11 969 1
原创 C#与非托管DLL进行交互
C#与非托管DLL进行交互PInvoke介绍PInvoke是.Net Framework提供的一项服务,它使得托管代码与非托管之间的交互变得非常简单,一般来说,只需要声名一个方法并指定System.Runtime.InteropServicesDllImportAttribute属性,就可以调用非托管方法。先看一个最简单的例子: using System.Runtime.Intero...
2018-04-25 23:48:38 3084 2
原创 C#委托异步编程
委托异步编程原文参考:《.Net 指南》功能概述在C#中,委托有两种调用方式:Invoke同步调用;BeginInvoke异步调用。Invoke同步是在当前线程,直接调用委托方法,BeginInvoke则通过线程池中的线程实现异步调用。 常用的异步调用有四种方式: 1. 使用EndInvoke对调用线程进行阻止,直到异步方法调用完成 2. 使用IAsyncResult.Asy...
2018-04-19 22:29:40 269
原创 C#如何重写Equals
C#如何重写Equals在自定义struct的时候,经常需要重写Equals方法,原因是一方面ValueType内部使用反射进行各字段相等判断,效率比较低;另一方面在调用基类Equals的时候,会造成值类型的装箱,(详细可以参考《值类型的拆箱与装箱》),除非能够确定类型不会进行相等性判断,否则建议进行Equals重写来提高性能。同一性与相等性同一性是指两个变量引用的是内存中的同一个...
2018-04-15 20:08:03 6689
原创 值类型的拆箱与装箱
值类型的装箱与拆箱介绍概述在之前文章中提到了,值类型具有两种表现形式:已装箱和未装箱,这两种状态的转换过程称之为装箱和拆箱。从内存分配的角度来说,装箱就是将值类型经过处理从线程栈复制到托管堆;拆箱则是将已装箱的值类型实例从托管堆复制到线程栈。装箱与拆箱的性能损耗装箱流程:在托管堆中分配内存,内存大小 = 值类型大小 + 对象指针 + 同步块索引。逐字段将值类型复制到...
2018-04-14 22:02:51 527
原创 值类型与引用类型
值类型与引用类型对比概述Clr包括两种类型:值类型、引用类型 引用类型和值类型都可以通过new来实例化,引用类型在调用new时,clr在托管堆为实例分配内存,并将内存地址返回,而值类型再调用new时,clr在线程栈上为实例分配内存,并返回值本身。 下面从几个方面对值类型和引用类型进行对比。值类型与引用类型对比 值类型 引用类型 内存分配 ...
2018-04-13 21:49:58 132
原创 优化System.Reflection.MemberInfo存储
优化System.Reflection.MemberInfo类型的存储简述在使用反射的过程中,有可能会涉及到将反射到的MemberInfo进行保存,以便后续进行调用。在存储这些对象的过程中,可以采用绑定句柄减少内存的消耗。 Type优化Type实例的优化,通过采用RuntimeTypeHandle与Type互转实现 public void OptimizeTyp...
2018-04-12 18:22:10 476
原创 反射创建各种类型对象
反射构造各种类型实例一般类型对象对于一般类型,直接使用Activity.CreateInstance(Type)进行创建。public class Data{}public class Program{ static void Main() { Type type = typeof(Data); object obj = ...
2018-04-12 09:13:05 350
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人