Opaque

iOS开发——内存优化

吃可爱长大的小学妹 提交于 2020-08-10 02:16:16
前言: 当app经过一段儿时间的迭代,往往会出现一些性能问题,这时能够协助开发解决这些性能问题也成为我们测试的重要工作。凑巧最近一段时间就一直在协助开发去进行app内存优化。这里整理了一份关于内存优化的心得分享给大家。 目的: 首先我们先要明确我们的目的,在保证程序运行流畅的前提下尽可能的优化使用内存。所以千万不要掉进为了优化而优化的陷阱。程序要先保证能运行,然后再谈良好运转。所以解决问题比较宽泛,必要的时候在交互或者运转机制上小动刀子来保证既能完成任务,程序又能正常运转,不必去对代码进行完全重构。毕竟在优化效率达到上限的时候,只能用时间换空间了。 1. 用ARC管理内存 ARC(Automatic ReferenceCounting, 自动引用计数),它避免了最常见的由于我们忘记释放内存所造成的内存泄露。它自动为你管理retain和release的过程,所以你就不必去手动管理了。编写代码的时候很容易忘掉结尾的release。而ARC会自动在底层为你做这些工作。除了帮你避免内存泄露,ARC还可以帮你提高性能,它能保证释放掉不再需要的对象的内存。 2. 在正确的地方使用 reuseIdentifier 一个开发中常见的错误就是没有给UITableViewCells, UICollectionViewCells设置正确的reuseIdentifier。 为了性能最优化,table

iOS开发——内存优化

家住魔仙堡 提交于 2020-08-08 04:56:41
前言: 当app经过一段儿时间的迭代,往往会出现一些性能问题,这时能够协助开发解决这些性能问题也成为我们测试的重要工作。凑巧最近一段时间就一直在协助开发去进行app内存优化。这里整理了一份关于内存优化的心得分享给大家。 目的: 首先我们先要明确我们的目的,在保证程序运行流畅的前提下尽可能的优化使用内存。所以千万不要掉进为了优化而优化的陷阱。程序要先保证能运行,然后再谈良好运转。所以解决问题比较宽泛,必要的时候在交互或者运转机制上小动刀子来保证既能完成任务,程序又能正常运转,不必去对代码进行完全重构。毕竟在优化效率达到上限的时候,只能用时间换空间了。 1. 用ARC管理内存 ARC(Automatic ReferenceCounting, 自动引用计数),它避免了最常见的由于我们忘记释放内存所造成的内存泄露。它自动为你管理retain和release的过程,所以你就不必去手动管理了。编写代码的时候很容易忘掉结尾的release。而ARC会自动在底层为你做这些工作。除了帮你避免内存泄露,ARC还可以帮你提高性能,它能保证释放掉不再需要的对象的内存。 2. 在正确的地方使用 reuseIdentifier 一个开发中常见的错误就是没有给UITableViewCells, UICollectionViewCells设置正确的reuseIdentifier。 为了性能最优化,table

RAC <三> 循环引用的解决

与世无争的帅哥 提交于 2020-08-05 05:13:13
比起上一篇,更简单的写法: //更简洁的写法 信号三部曲 创建 发送 订阅 [[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) { NSLog(@"Here I am!"); [subscriber sendNext:@"This is RAC"]; return nil; }] subscribeNext:^(id _Nullable x) { NSLog(@"x的内容是:%@",x); }]; 苹果有自己的事件处理和一些监听机制为什么不用,非要用RAC? 利用RAC处理事件方便,可以把要处理的事情,和监听的事情的代码放在一起,这样非常方便我们管理,就不需要跳到对应的方法里。非常符合我们开发中的:高聚合,低耦合的思想。 比较有意思和有用的例子: [[self.testTextField rac_textSignal] subscribeNext:^(NSString * _Nullable x) { NSLog(@"x信号内容:%@",x); }]; 输入框输入什么,就打印什么,时时监听,这样写 直观 简单。比写代理或者单独加一个方法监听要好点。 [[self.btn rac_signalForControlEvents:

Xcode 调试技巧 --常用命令和断点

老子叫甜甜 提交于 2020-07-27 05:28:42
Xcode 中的调试技巧与我们的日常开发息息相关,而这些调试技巧在我们解决Bug时,常常有事半功倍的作用,经常会用到的有各种断点 和 命令。而这些调试技巧也经常会在面试中问到,所以不知道的就来看看吧。 调试主要观看区 调试命令 在上图中,右侧绿色区域就是Log 输出区,在 Log 输出区可以使用一些命令,来辅助调试。 那有哪些调试命令呢? 想要看所有的调试命令,可以在上图的右侧区域输入 help ,就会列出所有的调试命令。 本文就介绍几个使用频率比较高的,其他就查看后,自行了解吧。 1. p 命令 -- ('expression --') Evaluate an expression on the current thread. Displays any returned value with LLDB's default formatting. p 命令是 print 命令的简写,使用p 命令可以查看基本数据类型的值,但是如果 使用 p 命令 查看的是对象,那么只会返回对象的指针地址。 p 命令后面除了可以接 变量、常量,还可以接 表达式。(❌但是不可以使用宏❌) 2. po 命令 po 命令可以理解为打印对象。功能与 p 命令类似,所以也是可以打印 常量、变量,打印表达式返回的对象等。(❌也不可以打印宏❌) p 和 po 使用范例 当然,这些打印功能,除了使用命令外

[原] OpenGL ES 学习笔记 (二)

最后都变了- 提交于 2020-05-02 13:53:29
OpenGL ES 2 的渲染流程 实际绘制环境,流程细化 操作流程: 配置环境:   a. CAEAGLLayer 替换默认的 CALayer,配置绘制属性;   b. EAGLContext,即 Render Context ,设置成 OpenGL ES 2 API 环境,并使其成为当前活跃的上下文环境;   c. Frame Buffers / Render Buffer 的创建和使用,以及内容绑定;   d. EAGLContext 绑定渲染的窗口 (on-screen),CAEAGLLayer;   [注] CAEAGLLayer 继承于 CALayer, 专门用来渲染 OpenGL 、OpenGL ES 内容的图层;如果要使用,则要重写 layerClass 类方法。 在 EAGLContext 绑定 CAEAGLLayer 为渲染窗口之前,可以通过修改 drawableProperties 属性来改变渲染属性。   使用注意:   a. 修改 opaque 属性为 YES ( CAEAGLLayer.opaque = YES; );   b. 不要修改 Transform ;   c. 当横竖屏切换的时候,不要去修改 CAEAGLLayer 的 Transform 而进行 Rotate, 而是要通过 OpenGL / OpenGL ES 来 Rotate 要渲染的内容

Unity渲染基础

假装没事ソ 提交于 2020-05-01 12:30:57
渲染 1.何为渲染? 所有我们能看到的东西都是需要进行渲染的。 比如:天空盒,场景模型,角色模型,特效...... 如果没有渲染,游戏世界将是一片黑暗。 2.各版本渲染区别 Unity4.X:渲染使用的事AutoDesk的Beast技术; Unity5.X:渲染使用的事Enlighten引擎; Unity5.6后:渲染使用的还是Enlighten引擎,但是有了升级; 3.移动端渲染 移动端的模型大多是使用两张类型的贴图作为渲染的素材: 一张是漫反射贴图,一张是法线贴图。 4.PC主机端渲染 PC主机端(国外的大型单机游戏)大多是真实的模拟现实中的效果来进行渲染的,使用了很多种类型的贴图(Unity的标准着色器中有支持10种贴图类型)。 PBR:基于物理规则的渲染方式。 GI:全局光照,用于模拟 光的互动 和反弹等复杂行为的算法。 核心要点 1.标准着色器 Unity5.X 后提供了两个标准着色器(Shader)。 使用这两个Shader我们可以实现大部分物体的渲染。 2.Lighting面板 主要对场景中的灯光渲染进行统一的设置。 场景灯光分:实时和烘焙。 3.反射探头 主要用于实现模型的反射。 4.灯光探头组 主要用于在烘焙后的场景中模型实时光的效果。 Shader 1.Shader的重要性 shader好比是画家手中的画笔和颜料。如果画家没有了这两样东西后

TLS1.3实现篇

我是研究僧i 提交于 2020-04-21 05:17:19
前言 前面我已经写过一些有关TLS1.3协议的文章,主要是从理论出发去了解TLS1.3协议,为了更加深入的理解TLS1.3协议,我将尝试去实现它,目前有部分站点已经开始支持TLS1.3,我们可以利用这些站点来进行测试代码是否成功实现TLS1.3的部分结构,我现在主要实现了ClientHello的整体结构和部分扩展,但是在进行测试的时候不尽如人意,我们先来看一下测试情况。 测试站点www.github.com 我们发现服务器并没有回应,具体原因我还没有找到。 添加TLS1.2cipherSuites测试www.baidu.com 服务器发送回了ServerHello和Certificate以及ServerHelloDone消息可以说明整体结构编写没有问题,可能还存在一些不符合协议的错误,我会及时更新改正后的实现到博客,下面我们先来看一下整体结构的实现。 TLS1.3实现-整体架构 下面给出我实现的整体架构 通过这张图就可以清晰的了解到TLS1.3实现的基本流程,首先是实现ClientHello的结构以及里面包含的扩展,然后实现handshake的整体结构,获取ClientHello的数据放入handshakeData中,之后实现TLSPlaintext的结构,获取handshake的数据放入fragment字段,最后封装数据采用大端字节编码,将数据发送给服务器

Wang Tile的Shader简易实现

依然范特西╮ 提交于 2020-04-20 17:11:03
在使用大面积的平铺纹理时,会导致重复感较强的贴图呈现在画面中。我们可以通过许多方法进行优化,WangTile就是其中一种。 WangTile(王浩瓷砖)方法通过对每条边标记颜色,并在平铺时将相同颜色的边拼接在一起,最终铺满整个平面。 参考《GPU Gems2》中的做法,但这里使用一组预先设定好的可循环组合值,以及一个4x4的瓷砖纹理。 4x4纹理图: 假设y坐标朝向为从下到上,x坐标朝向为从左到右,则索引(0,0)表示数字16的色块,索引(2,3)表示数字3的色块,以此类推。 这里首先配置好可循环的组合,他们的x轴和y轴不同的序列为: X_seq: 1 , 2 , 2 , 3 , 0 , 1 , 3 , 1 , 2 , 3 , 0 , 0 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 Y_seq: 0 , 1 , 2 , 3 , 0 , 1 , 3 , 1 , 2 , 3 , 1 , 2 , 2 , 2 , 3 , 0 , 1 , 3 , 0 , 1 , 3 这个序列可以给不同的瓷砖贴图重复使用,我们把这个作为数组传入Shader,数组长度写死为21,其Shader如下: Shader " Unlit/WangTileTesGPU " { Properties { _TileTex( " Tile Texture " , 2D) = " white " {

一步步实现windows版ijkplayer系列文章之三——Ijkplayer播放器源码分析之音视频输出——音频篇

こ雲淡風輕ζ 提交于 2020-04-20 15:19:05
一步步实现windows版ijkplayer系列文章之一——Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二——Ijkplayer播放器源码分析之音视频输出——视频篇 一步步实现windows版ijkplayer系列文章之三——Ijkplayer播放器源码分析之音视频输出——音频篇 一步步实现windows版ijkplayer系列文章之四——windows下编译ijkplyer版ffmpeg 一步步实现windows版ijkplayer系列文章之五——使用automake一步步生成makefile 一步步实现windows版ijkplayer系列文章之六——SDL2源码分析之OpenGL ES在windows上的渲染过程 一步步实现windows版ijkplayer系列文章之七——终结篇(附源码) #一步步实现windows版ijkplayer系列文章之三——Ijkplayer播放器源码分析之音视频输出——音频篇 这篇文章的ijkplayer音频源码研究我们还是选择Android平台,它的音频解码是不支持硬解的,音频播放使用的API是OpenSL ES或AudioTrack。 OpenSL ES & AudioTrack OpenSL ES 什么是OpenSL ES?下面来自官网的说明: OpenSL

Qt信号槽使用结构体作为参数

廉价感情. 提交于 2020-04-06 13:05:35
信号可以带参数,参数的类型,必须是元对象系统能够识别的类型, 即元类型。 下面这几个类型是自动注册的,不需要使用Q_DECLARE_METATYPE这个宏: 1.QObject继承下来的子类的指针; 2.QList<T>, QVector<T>, QQueue<T>, QStack<T>, QSet<T> or QLinkedList<T>这些T都是自动注册的; 3.QHash<T1, T2>, QMap<T1, T2> or QPair<T1, T2> T1,和T2都是自动注册的; 4.QPointer<T>, QSharedPointer<T>, QWeakPointer<T>这3个T必须是QObject的子类; 5.枚举类型要用Q_ENUM or Q_FLAG; 6.拥有Q_GADGET宏的类。 例如:自定义结构体,connect想通过结构体参数来传递 struct _ColorBalance { bool preserve_luminosity; int cyan_red[3]; int magenta_green[3]; int yellow_blue[3]; }; signals: void state_changed(_ColorBalance *color_balance); connect(this, &ColorBalance::state_changed,