有空研究一下vector的insert操作的效率(C++)

参考:http://stackoverflow.com/questions/15009442/c-push-back-vs-insert-vs-emplace

有时候会使用std::vector<char>作为buffer,很好用,但是经常担心insert的效率,通过参考页看出insert的效率貌似是最高的了。但是注意到insert的时候并不知道插入数据的总长度,操作时会先获取总长度,需要检查这个获取长度的操作是否快。如果不快,如何能从外部直接传入插入数据的长度呢?  如果有人已经有结论了可以在评论里交流。

Windows上Opengl开发UI遇到的两个坑

一、GLEW初始化后并不支持新版的opengl函数。 原因是piexlFormart选择了支持向BitMap绘制,这样会使当前opengl环境只支持OpenGL 1.1。

顺便记录一下GLEW使用的几个注意点:

1、头文件要在最前引用 不要在其前边引用gl.h文件 会导致错误。

2、初始化要在wglCreateContext   MakeCurrent之后初始化。并检查返回值是否是 GLEW_OK

3、支持的opengl版本判断使用if(GL_VERSION_x_x) {} (GL_VERSION_4_0)来判断

int bits = 32;
		static	PIXELFORMATDESCRIPTOR pfd =				// pfd Tells Windows How We Want Things To Be
		{
			sizeof(PIXELFORMATDESCRIPTOR),				// Size Of This Pixel Format Descriptor
			1,											// Version Number
			PFD_DRAW_TO_WINDOW |						// Format Must Support Window
			//PFD_DRAW_TO_BITMAP |
			PFD_SUPPORT_OPENGL,				// Format Must Support OpenGL
			//PFD_DOUBLEBUFFER,							// Must Support Double Buffering
			PFD_TYPE_RGBA,								// Request An RGBA Format
			bits,										// Select Our Color Depth
			0, 0, 0, 0, 0, 0,							// Color Bits Ignored
			0,											// No Alpha Buffer
			0,											// Shift Bit Ignored
			0,											// No Accumulation Buffer
			0, 0, 0, 0,									// Accumulation Bits Ignored
			16,											// 16Bit Z-Buffer (Depth Buffer)  
			0,											// No Stencil Buffer
			0,											// No Auxiliary Buffer
			PFD_MAIN_PLANE,								// Main Drawing Layer
			0,											// Reserved
			0, 0, 0										// Layer Masks Ignored
		};
		int piexelFormat = ChoosePixelFormat(mHDC, &pfd);
		if (!SetPixelFormat(mHDC, piexelFormat, &pfd)) {
			return false;
		}

		_context = wglCreateContext(mHDC);

		if (!wglMakeCurrent(mHDC, _context)) {
			return false;
		}

		GLenum err = glewInit();
		if (GLEW_OK != err)
		{
			return false;
		}

 

 

二、Opengl可以直接向DIB的DC(设备无关)上绘制,但透明度始终为0.导致updateLayeredWindows时将产生一种特殊的混合效果。(重点:透明度为零,其他颜色数据不为0时 update效果不是纯透明)这将导致误会,实际上只是没有透明度数据引起的。【注:这里的误会是指GDI+函数DrawRectangle  填充色为255时也会引起此效果,设置为254即可,这两个机制不知是否相同,有时间的同学可以试试 然后结果给大家分享一下】

Xcode 编译静态库的陷阱(Xcode7如何生成i386的静态库)

编译静态库时一般需要编译真机和模拟器两个库。XCode7中,默认Debug只编译当前环境的库。导致只会生成x86_64的.a文件,不包含i386(注释:32位)的库。需要调整Xcode的默认设置。 需要调整的设置如图:(如果Debug那里不设成No, 模拟器的release也会套用这个设置,只生成x86_64的库)Xcode setting for static lib

 

ES3.0 中 Vertex Shader 的out变量未赋值,导致 glLinkProgram 失败

GLSL中,定义了但是 没有使用的变量会被优化掉,在之前就遇到过。

(GLSL 中 ,如果定义的 变量 没有在代码中使用到,那么不会被编译,用 glget* 是获取不到的,返回 -1 。算是被优化掉了。

http://blog.csdn.net/huutu/article/details/50322905 )

而且如果 Vertexshader 中的定义的 Out 变量未使用,被优化掉后,会引起 FragmentShader 的问题,导致 glLinkProgram  失败!

群里朋友 学习 ES3.0的时候 碰到一个问题:

编译下面的Shader 并没有出错,但是使用

[cpp] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. glGetUniformLocation(program, “s_texture”);

去获取 的时候,却返回了 -1 。转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

Vertex Shader:

[cpp] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. #version 300 es
  2. precision mediump float;
  3. in vec3 inPos;
  4. in vec2 vTexCoord;
  5. out vec3 Color;
  6. out vec2 texCoord;
  7. uniform mat4 myMat;
  8. void main() {
  9.     gl_Position = vec4(inPos, 1.0) * myMat;
  10.     Color = inPos;
  11. }

Fragment Shader:

[cpp] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. #version 300 es
  2. precision mediump float;
  3. in vec3 Color;
  4. in vec2 texCoord;
  5. out vec4 fragmentColor;
  6. uniform sampler2D s_texture;
  7. void main() {
  8.     fragmentColor = texture(s_texture, texCoord);
  9. }

我的第一反应是:

s_texture 没有使用,被优化掉了。

然而并没有,让朋友把工程传过来看了一段时间才发现

在Vertex Shader 中的 out vec2 texCoord; 没有赋值!!

所以 texCoord 是被优化掉了的。

但是 在 FragmentShader 中的 in vec2 texCoord 是存在的变量,所以呢 glCompileShader 操作的时候是不会报错的!

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

难道 OpenGL 没有处理这个问题?当然不是。

这个错误是在 glLinkProgram 阶段抛出的。 朋友没有去获取 glLinkProgram 的状态,所以没有发现这个错误。

抛出了很详细的错误

[html] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. WARNING: Output of vertex shader ‘Color’ not read by fragment shader
  2. ERROR: Input of fragment shader ‘texCoord’ not written by vertex shader
  3. (lldb)

利用dSYM文件解析IOS的崩溃文件*.crash(开源小软件

看了很多介绍如何用命令行解析的贴子,由于本人太笨,敲命令行觉得太费劲,还有点记不住,写了这么一个小工具。开源的目的是可能有bug,希望大家帮忙完善。

使用非常简单,选中对应的crash、dsym、ipa文件拖入窗口中释放即可。

 如果已经拖过对应的dsym和ipa会在本app文件夹内留下缓存、下次只拖入crash文件即可。占用空间过大时暂时请右键后选择『显示包内容』自行清理。

GitHub:https://github.com/wudijimao/VisualSymbolicateCrash

app下载https://github.com/wudijimao/VisualSymbolicateCrash/raw/master/VisualSymbolicateCrash.app.zip

软件运行效果图如下:

7959FBBE-CA92-462A-A4F8-E92C02F4EA69 4861DCEB-3F09-4F55-8358-D614590AA65D C15939AC-559A-4716-AE12-213CA803F047

 

PS:如果系统的符号解析不能请插入崩溃的手机打开XCode等待同步符号文件。

IOS开发中遇到转发delegate的时候不要再那么傻了

http://sam.dods.co/blog/2014/08/03/secondary-delegate/

delegate代理(截取delegate消息用)

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface MovieSDKDelegateProxy : NSObject <UITableViewDelegate>
@property (nonatomic, weak)id primaryDelegate;
@property (nonatomic, weak)id secondaryDelegate;
@end
@implementation MovieSDKDelegateProxy
- (BOOL)respondsToSelector:(SEL)aSelector {
    return ([self.primaryDelegate respondsToSelector:aSelector] || [self.secondaryDelegate respondsToSelector:aSelector]);
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector
{
    NSObject *delegateForResonse = [self.primaryDelegate respondsToSelector:selector] ? self.primaryDelegate : self.secondaryDelegate;
    return [delegateForResonse respondsToSelector:selector] ? [delegateForResonse methodSignatureForSelector:selector] : nil;
}
- (void)forwardInvocation:(NSInvocation *)invocation
{
    [self invokeInvocation:invocation onDelegate:self.primaryDelegate];
    [self invokeInvocation:invocation onDelegate:self.secondaryDelegate];
}

- (void)invokeInvocation:(NSInvocation *)invocation onDelegate:(id)delegate
{
    if ([delegate respondsToSelector:invocation.selector]) {
        [invocation invokeWithTarget:delegate];
    }
}
@end

use:注意设置每个delegate时必须重新将_proxy设置给tableView的delegate。这样才能保证tableView重新检查delegate支持的方法。(tableView会在设置delegate时将大多数方法都检查一下是否支持,回调时不再检查)

@implementation MovieSDKRefreshTableView {
    MovieSDKDelegateProxy *_proxy;
}
- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style {
    self = [super initWithFrame:frame style:style];
    if (self) {
        _proxy = [MovieSDKDelegateProxy new];
        _proxy.primaryDelegate = self;
        [super setDelegate:self];
    }
    return self;
}
- (id<UITableViewDelegate>)delegate {
    return _proxy.secondaryDelegate;
}

- (void)setDelegate:(id<UITableViewDelegate>)delegate {
    _proxy.secondaryDelegate = delegate;
    [super setDelegate:nil]; //Important:must reset delegate, because tableView check all response to @selecter when set delegate
    [super setDelegate:_proxy];
}
@end