CAEAGLLayer

CAEAGLLayer

当iOS要处理高质量图形绘制,要求时就是OpenGL。应该说它应当是最后的绝招,至少对于非游戏的运用来说是的。因为相比较Core
Animation和UIkit框架,它玄而又玄地复杂。

OpenGL提供了Core
Animation的根基,它是底层的C接口,直接和HTC,surface的硬件通讯,极少地抽象出来的措施。OpenGL没有对象恐怕图层的存在延续概念。它只是简短地处理三角形。OpenGL中负有东西都是3D空间中有颜色和纹理的三角。用起来分外复杂和有力,可是用OpenGL绘制iOS用户界面就须要广大过多的做事了。

为了能够以高质量使用Core
Animation,你必要看清你须要绘制哪类内容(矢量图形,例子,文本,等等),但后采取合适的图层去变现这一个剧情,Core
Animation中唯有局地门类的内容是被高度优化的;所以若是您想绘制的事物并不可能找到专业的图层类,想要得到高品质就比较费事情了。

因为OpenGL根本不会对你的情节开展尽管,它亦可绘制得一定快。利用OpenGL,你可以绘制任何你领会要求的集聚新闻和样子逻辑的情节。所以重重游戏都快乐用OpenGL(那个景况下,Core
Animation的限量就明摆着了:它优化过的剧情类型并不一定能满意须求),但是如此借助,方便的万丈抽象接口就没了。

在iOS
5中,苹果引入了3个新的框架叫做GLKit,它去掉了一些设置OpenGL的复杂,提供了二个称作CLKViewUIView的子类,帮你处理大部分的装置和制图工作。前提是二种各样的OpenGL绘图缓冲的最底层可配备项还是须要你用CAEAGLLayer完成,它是CALayer的叁个子类,用来展示任意的OpenGL图形。

超越四分之二动静下你都不要求手动设置CAEAGLLayer(假诺用GLKView),过去的日子就无须再提了。尤其的,大家将设置二个OpenGL
ES 2.0的上下文,它是现代的iOS设备的正规做法。

即使不须要GLKit也足以实现那总体,不过GLKit囊括了无数外加的做事,比如设置终点和部分着色器,这个都是类C语言叫做GLSL自包罗在程序中,同时在运营时载入到图片硬件中。编写GLSL代码和装置EAGLayer不曾什么关系,所以我们将用GLKBaseEffect类将着色逻辑抽象出来。其余的业务,我们依旧会有过去的措施。

在开头此前,你须要将GLKit和OpenGLES框架参加到你的花色中,然后就足以兑现清单6.第114中学的代码,里面是设置2个GAEAGLLayer的至少工作,它使用了OpenGL
ES 2.0 的绘图上下文,并渲染了二个有色三角(见图6.15).

清单6.14 用CAEAGLLayer绘图3个三角

图片 1图片 2

  1 #import "ViewController.h"
  2 #import 
  3 #import 
  4 
  5 @interface ViewController ()
  6 
  7 @property (nonatomic, weak) IBOutlet UIView *glView;
  8 @property (nonatomic, strong) EAGLContext *glContext;
  9 @property (nonatomic, strong) CAEAGLLayer *glLayer;
 10 @property (nonatomic, assign) GLuint framebuffer;
 11 @property (nonatomic, assign) GLuint colorRenderbuffer;
 12 @property (nonatomic, assign) GLint framebufferWidth;
 13 @property (nonatomic, assign) GLint framebufferHeight;
 14 @property (nonatomic, strong) GLKBaseEffect *effect;
 15 
 16 @end
 17 
 18 @implementation ViewController
 19 
 20 - (void)setUpBuffers
 21 {
 22     //set up frame buffer
 23     glGenFramebuffers(1, &_framebuffer);
 24     glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer);
 25 
 26     //set up color render buffer
 27     glGenRenderbuffers(1, &_colorRenderbuffer);
 28     glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderbuffer);
 29     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _colorRenderbuffer);
 30     [self.glContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:self.glLayer];
 31     glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &_framebufferWidth);
 32     glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &_framebufferHeight);
 33 
 34     //check success
 35     if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
 36         NSLog(@"Failed to make complete framebuffer object: %i", glCheckFramebufferStatus(GL_FRAMEBUFFER));
 37     }
 38 }
 39 
 40 - (void)tearDownBuffers
 41 {
 42     if (_framebuffer) {
 43         //delete framebuffer
 44         glDeleteFramebuffers(1, &_framebuffer);
 45         _framebuffer = 0;
 46     }
 47 
 48     if (_colorRenderbuffer) {
 49         //delete color render buffer
 50         glDeleteRenderbuffers(1, &_colorRenderbuffer);
 51         _colorRenderbuffer = 0;
 52     }
 53 }
 54 
 55 - (void)drawFrame {
 56     //bind framebuffer & set viewport
 57     glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer);
 58     glViewport(0, 0, _framebufferWidth, _framebufferHeight);
 59 
 60     //bind shader program
 61     [self.effect prepareToDraw];
 62 
 63     //clear the screen
 64     glClear(GL_COLOR_BUFFER_BIT); glClearColor(0.0, 0.0, 0.0, 1.0);
 65 
 66     //set up vertices
 67     GLfloat vertices[] = {
 68         -0.5f, -0.5f, -1.0f, 0.0f, 0.5f, -1.0f, 0.5f, -0.5f, -1.0f,
 69     };
 70 
 71     //set up colors
 72     GLfloat colors[] = {
 73         0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
 74     };
 75 
 76     //draw triangle
 77     glEnableVertexAttribArray(GLKVertexAttribPosition);
 78     glEnableVertexAttribArray(GLKVertexAttribColor);
 79     glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, vertices);
 80     glVertexAttribPointer(GLKVertexAttribColor,4, GL_FLOAT, GL_FALSE, 0, colors);
 81     glDrawArrays(GL_TRIANGLES, 0, 3);
 82 
 83     //present render buffer
 84     glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderbuffer);
 85     [self.glContext presentRenderbuffer:GL_RENDERBUFFER];
 86 }
 87 
 88 - (void)viewDidLoad
 89 {
 90     [super viewDidLoad];
 91     //set up context
 92     self.glContext = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES2];
 93     [EAGLContext setCurrentContext:self.glContext];
 94 
 95     //set up layer
 96     self.glLayer = [CAEAGLLayer layer];
 97     self.glLayer.frame = self.glView.bounds;
 98     [self.glView.layer addSublayer:self.glLayer];
 99     self.glLayer.drawableProperties = @{kEAGLDrawablePropertyRetainedBacking:@NO, kEAGLDrawablePropertyColorFormat: kEAGLColorFormatRGBA8};
100 
101     //set up base effect
102     self.effect = [[GLKBaseEffect alloc] init];
103 
104     //set up buffers
105     [self setUpBuffers];
106 
107     //draw frame
108     [self drawFrame];
109 }
110 
111 - (void)viewDidUnload
112 {
113     [self tearDownBuffers];
114     [super viewDidUnload];
115 }
116 
117 - (void)dealloc
118 {
119     [self tearDownBuffers];
120     [EAGLContext setCurrentContext:nil];
121 }
122 @end

View Code

 

 

图6.15 用OpenGL渲染的CAEAGLLayer图层

在叁个当真的OpenGL应用中,大家大概会用NSTimerCADisplayLink周期性地每分钟调用-drawRrame措施5柒回,同时会将几何图形生成和制图分开以便不会每一次都再也生成三角形的巅峰(那样也能够让大家绘制别的的部分事物而不是多个三角形而已),不过上边这几个事例已经足足演示了绘图原则了。

     _         _
\. _(9>       <6)_ ,/

 \==_)         (_==/     
  -'=           ='-

成都百货上千商厦,尤其互连网公司,都把“思路决定出路”以种种形式写在公司文化墙上。配套的切近还有两句,记不得了(通常那时候小编会百度时而……)。说二个老生常谈的意况,一些营业后台常见的模糊查询数据作用。
数量访问架构:db是mysql,orm是dapper。开发语言.net(C#)
对于dapper框架,模糊查询须求先写sql语句,然后通过MySqlConnection的Query<T>从db把满意条件的数据检索出来。
既是是生死攸关字模糊匹配,就要用到LIKE了。

 

一初叶的sql恐怕是那样的:

public static List<t_info_payaccount> GetList(t_info_payaccount ifModel)
{
    string sql = "SELECT * FROM t_info_payaccount WHERE 1=1 ";
    ...
    if (null != ifModel.MerName && ifModel.MerName.Trim() != "")
    {
        sql += " AND merName LIKE '%@merName%'";
        ifModel.MerName = ifModel.MerName.Trim();
    }
    using (var conn = ConnUtility.GateWayConntion)
    {
        return conn.Query<t_info_payaccount>(sql, new
        {
            ...
            merName = ifModel.merName,
            ...
        }).ToList();
    }
}

 

测试发现,断言失利,db里有多少,不过查不出来。
那时,你大概觉得很奇怪,程序也绝非万分,为啥就是不出来吧。你当时想到的是:小编要看看最后实施的sql是怎么?SqlServer是能够因此Profiler工具来跟踪执行的sql指令的。mysql不驾驭怎么搞出来?然后伊始百度“mysql
监测请求的sql语句”
扫了部分网页,太难为。————以往寻找技术很先进,百度时而就一大堆。大家对寻找引擎的借助格外之大,以至于甚至大家平日三思而行碰着难题就百度。那么些习惯对大家的话危机性依旧挺大的,很多的百度时而,并没有让我们拥有收获,反而是带走了大家很多的小运。其实,有一些付出经历的,用右脑先分析一下,你就了然,’%@merName%’中因为中间的“%@merName%”被“’”引起来了,那必将是真是文本了。所以,你前面指定的参数值也是用不上了。

 

大概,你是如此达成的:

    ...
    if (null != ifModel.MerName && ifModel.MerName.Trim() != "")
    {
        sql += " AND merName LIKE '%'+@merName+'%'";
    }
    ...

 

测试发现,程序出了老大。

错误码: 1064
You have an error in your SQL syntax;
check the manual that corresponds to your MariaDB server version for the
right syntax to use near ‘+’厦门%” at line 3
百度时而,说字符串的一连不是用+,而是用三个CONCAT(str1,str2,…)函数。然后改成用这么些函数。
程序是ok了,殊不知,那样子的贯彻,并非全盘。首先,sql里有函数会稳中有降查询品质。其余,注重db自带的函数,尽管那样的依赖性太多,那么,一旦日后将mysql改成mssql,重构就变得很倒霉。

 

大概,那样达成才算好:

    ...
    if (null != ifModel.MerName && ifModel.MerName.Trim() != "")
    {
        sql += " AND merName LIKE @merName";
        ifModel.MerName =string.Format("%{0}%", ifModel.MerName.Trim());
    }
    ...

 

写最简便的sql,至于逻辑,交给程序。是还是不是很好?

图片 3

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图