OpenGL ES 纹理图片解析第一波 - 无耐地放弃重写这一部分

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: OpenGL ES 纹理图片解析第一波 - 无耐地放弃重写这一部分太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)本文遵循“署名-非商业用途-保持一致”创作公用协议转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。

OpenGL ES 纹理图片解析第一波 - 无耐地放弃重写这一部分

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino否则,出自本博客的文章拒绝转载或再转载,谢谢合作。



重写,意味着有个参照,当然啦,我是参照老罗同志的示例代码。

可是纹理图片解析这一部分,真的好多东西,之前已有发主要部分,但那个确实经不起推敲,还有好多相关的参数解析,确实搞不太清楚。

所以还是觉得老罗的两个类写的比较内敛:TextureLoader 和 TextureHelper,直接调用一个类方法,传一个图片路径就能得到纹理对象:

    tempMaterial.textureUnit = [TextureHelper createTexture:textureImagePath isPVR:FALSE];

细节问题,全部掩藏起来,不失为上等代码与结构。

不过,不要高兴的太早了,如果你的纹理图片不在应用包中,而是在应用沙盒里,那么这样的简单使用,就要出问题了,一看下面代码,就全明白了:

@implementation TextureLoader

- (void)loadImage:(NSString *)filepath isPOT:(Boolean)isPOT
{
    [self unload];

    NSString* resourcePath = [[NSBundle mainBundle] resourcePath];
    NSString* fullPath = [resourcePath stringByAppendingPathComponent:filepath];

    UIImage* uiImage = [UIImage imageWithContentsOfFile:fullPath];

从上面代码中,可以发现,纹理图片都是应用包内的路径,也就是开发应用时直接预置里面的图片资源。

那么我们要想使图片灵活起来,想放哪儿就放哪儿,那就得让其目录可配置,怎么办呢?

有人说,那就把增加个路径属性,或者将 resourcePath 改成类的属性来声明,初始构建时给个默认值是应用包路径,这样如果还是原来的使用方式,默认就是这个路径,保持不变;如果指定了新路径,那么就按新路径来搜索。如下:

@interface TextureLoader : NSObject
@property (nonatomic, strong) NSString* resourcePath;

@implementation TextureLoader

- (id)init {
    
    self = [super init];
    if (self) {
        
        self.resourcePath = [[NSBundle mainBundle] resourcePath];
    }
    return self;
}


- (void)loadImage:(NSString *)filepath isPOT:(Boolean)isPOT {
    
    [self unload];
    
    NSString* fullPath = [_resourcePath stringByAppendingPathComponent:filepath];
    UIImage* uiImage = [UIImage imageWithContentsOfFile:fullPath];
    

经过以上的修修改改,就可以在帮助类中,增加个路径参数了:

+ (GLuint)createTexture:(NSString *)textureFile isPVR:(Boolean)isPVR {

    return [self createTexture:textureFile textureDir:nil isPVR:isPVR];
}

+ (GLuint)createTexture:(NSString *)textureFile textureDir:(NSString *)textureDir isPVR:(Boolean)isPVR {
    
    TextureLoader * loader = [[TextureLoader alloc] init];
    if (nil != textureDir) {
        
        loader.resourcePath = [NSString stringWithString:textureDir];
    }

记得,原来的函数名要保留,如上面的方式,这样原逻辑完全没变,只是多一次调用,对于现在的手机,也是影响不大的。


经过以上的修改,是否感觉功能已经实现了呢?好像,差不多,基本上吧,能指定目录了。

不过我这里重心,不是要说这些个路径的操作问题,而是要重谈面向对象程序设计的准则,不清楚的可到此查看一篇别人的文章,简单概要如下:

1、单一职责原则(Single-Resposibility Principle)

2、开放封闭原则(Open-Closed principle)

3、Liskov替换原则(Liskov-Substituion Principle)

4、依赖倒置原则(Dependecy-Inversion Principle)

5、接口隔离原则(Interface-Segregation Principle)

我们这里,要涉及的是 2、开闭原则 :

Software entities(classes,modules,functions,etc.) should be open for extension, but closed for modification。

软件实体(类、模块、函数等)应当对扩展开放,对修改关闭,即软件实体应当在不修改的前提下扩展。

那么,我们上面所做的事情,真的有违这个原则噢!

有人说,这些个原则不用特意遵守,没啥用,写了好代码就行。

不过,我已经看到潜在的危险可能发生,一旦,我上面的修改再复杂点,出现问题,我想回到前面的思路,都有些困难。

什么SVN版本控制,什么......在这些小细节处,真的不起太大作用,做过实际开发,都了解的,您不会没做过开发吧!什么?一两年?噢,那可能你连基本技术都没掌握熟呢,估计这些感受确实还没有,报歉,请看上半部分即可。

第2条原则,其实,就是让我们再加一个重载方法而已,不要改原来的,

一是,确保不给原系统引入风险,毕竟原系统是经过反复测试验证过的;

二是,修改真正出现问题,可以直接转回原系统代码,无缝割接或零延时割接(这是电信术语,花架子,胡弄人儿的漂亮词儿);

三是,不过我还有一种理解,第2条原则,从某种角度,让代码本身就变成了一个即时可见(俺也学着用些花花词儿)版本控制库。

只要你用过的,好用的,经过反复测试确认没问题的代码,在这份代码中,就会保留下来,后续没有修改,只有新加和扩展。

新加和扩展的一旦出现问题,就可以直接在代码中进行对照,无形的版本控制系统。


曾经有带过的新入行小兄弟儿,抱怨局方一天都能有好几遍修改意见,问一回一个样,不过我见到局方,基本没见着这些修改。

因为,只要是局方的要求,就一定要在代码中留有痕迹,最后注释写明,当你再递交时,重申之前对要求的理解。

并且,局方的人转多大圈子,都万遍不离其中那几样,都留着,给他看清楚,按他的要求割 接代码就完了。

说来,并不是局方的人要玩死你,是因为他也不知道该咋办,随便给你个信号,你自个猜去吧,反正球踢给你了,责任不在他。

如果你没这么做,被局方人玩死,那是活该,谁让你懒了呢?!多写几行代码能累死你,况且更多是直接调用或者拷贝。

遇到这种情况,你全列出来了,他就没的话说,只能推拖:

一可能是,你的理解力太差

那么,不妨就当面承认,确实理解力比较差,请他再给指点一二,然后复述给他听,他确认后,是否要求他签字,这个得看情况而定了,涉及到撕没撕破脸的火侯问题;

二可能是,他也得现分析,根据他们局方的实际情况,最终算出个大概的规模和细节,然后还是要给你一句话,“跟你这人打交道真是繁复”

这个没办法,你的目的是索要到真正的需求,而这些需求是我们没办法自个瞎定的,他们又懒得分析,或者更准确地说,是怕担责任。

如果最终还是拿不出明确的需求来,这时侯无论他有没有这些个烂话跟着,都不重要了,问他要时间,态度依然谦逊,别让他抓到把柄,再以你态度不恭为由搁置你,是这种小人常干的事儿。

如果时间给不出来,那么球在他那里,他无力往出传球,那立即把这事儿向上汇报,有多大捅多大,这样有两点好处:

一、这事儿,大家都知道了,他想再整猫屎往你身上甩,是不太可能的了;

    怕他记恨,再阴你?那上面说的就不是在阴你吗?!时间久了,阴你就成家常便饭了,那时真是无力回天。

二、发现问题,你及时上报,你没责任,如果你不及时上报,他的领导,还会以你没有及时上报为由,打你个闪不及,即使是,暗中都已经知道了;

三、最后也是最关键的,我们谦虚作人,勤奋做事,还常被小人陷害,那一样是我们自已的错:

a、上面的你做到了吗?谦虚了吗?真诚了吗?低调了吗?没有的话,就继续做好再说!

b、你有让打你的人知道,他的手也很疼吗?没有,那么下次你再挨打,活该!妇人之仁,难成大事;

      杀敌一千,自损八百,在某些情况下,也是必须硬着头皮上的事情,要不然,你这八百早晚都让人家不费一兵一卒给干掉,至少自已还留有二百再生力量,而使敌人无生还余力

我们以解决问题为目标,一般是不会碰到这些个烂事儿的,经过沟通协商都能得到有效解决;

如果真的遇到上面的五花八门的人和伎俩,那么不妨一试,前提是你自已做得够好,让人挑不出大毛病。

至于被冠以什么样的说词,那个不重要,无能的人总是会给自已找很多理由,背后说三道四,当着面儿,为什么不把事情说清楚,说得他哑口无言的时侯,他默不做声,就等着回头背后使黑刀子,这样的人,就叫小人,俗话讲:小人常戚戚,就没什么好怕的了。


就一个不遵守面向对象设计原则2,就牵扯出这么多实际发生过的事情,两种做法,两种截然不同的结果,前者可能最后变成了奴隶,直到项目结束,你就祈祷别出问题,一旦有问题,人家都不怕,因为有你这个屎盆子,随时可以拿来上去晃两下,有接着的!后者,可能走后,背地里,不少坏话等着,不过至少我们是干事情的,当着面儿,话能说得出,舌头能捋得直,甚至,可以找茬,用他们背后说你的坏话,当面儿来埋汰对方,这个得看时机,而且看火侯,迫不得已不要这样,除非你需要让对方难受时,才这样做。

为什么要让对方难受?真是傻呀!他不难受,他就腾出空儿来,让你难受,当你觉得难受时,你得明白为啥难受啊,知道是他让你难受的,你就要给他个更大的难受,让他自顾不睱,哪还有工夫来玩你了。

其实,我们真的都是本份人,不过本份人,更应该能看懂一些事情,才能自我保护。

《菜根谭》有讲出污泥而不染、知机巧而不用”,看了十年的书了,越来越感觉能明白的词句要比十年前多些了。

出污泥而不染,明机巧而不用

势力纷华,不近者为洁,近之而不染者尤洁;智械机巧,不知者为高,知而不用者为尤高。

【大意】

权利和财势,以不接近这些的人为清白,接近而不受污染就更为清白;权谋术数,以不知道才算高明,知道而不使用就更为高明了。

不过,以上仅是针对没有明确需求的情况。

虽然需求始终在变,但至少,对于上一次明确的需求,你的工作成果得到确认,或者由需求改变而带来的开发周期的延长,这个都属正常的事情,敏捷开发,就是要拥抱变化。

不过一般需求变更人,常会为了推拖自已之前需求给的有问题,或者有了新的想法,确不想为之前自已的肤浅需求而埋单,所以故意把这个责任推给开发方,这也是敏捷开发经常难以有效实施的原因之一。

对此,如何解决,欲知后事如何,且听下回病好了,再分解!


好了,面向对象设计原则引发的另一桩血案,到此告破,谢谢大家。

我也该吃药了,感冒一天重于一天,晚上睡不着觉,这两天还要驾考,年关、年关,年年过难关啊!



目录
相关文章
|
6月前
|
存储 分布式计算 监控
Hadoop【基础知识 01+02】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
【4月更文挑战第3天】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
307 2
|
4月前
|
文字识别 Java Python
文本,文识08图片保存()上,最方便在于整体生成代码,serivce及实体类,base64编码保存图片文件,调用flask实现内部ocr接口,通过paddleocr识别,解析结果,base64转图片
文本,文识08图片保存()上,最方便在于整体生成代码,serivce及实体类,base64编码保存图片文件,调用flask实现内部ocr接口,通过paddleocr识别,解析结果,base64转图片
|
5月前
|
XML JSON Java
图文并茂:解析Spring Boot Controller返回图片的三种方式
图文并茂:解析Spring Boot Controller返回图片的三种方式
534 0
|
6月前
|
开发工具 数据安全/隐私保护 Android开发
视觉智能平台常见问题之图片解析出的水印图判断是自己添加的水印图如何解决
视觉智能平台是利用机器学习和图像处理技术,提供图像识别、视频分析等智能视觉服务的平台;本合集针对该平台在使用中遇到的常见问题进行了收集和解答,以帮助开发者和企业用户在整合和部署视觉智能解决方案时,能够更快地定位问题并找到有效的解决策略。
|
6月前
|
分布式计算 监控 Hadoop
Hadoop【基础知识 02】【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
【4月更文挑战第3天】Hadoop【基础知识 02】【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
276 0
|
6月前
|
存储 算法 编译器
【ffmpeg 到Qt的图片格式转换】精彩的像素:深入解析 AVFrame 到 QImage 的转换
【ffmpeg 到Qt的图片格式转换】精彩的像素:深入解析 AVFrame 到 QImage 的转换
242 0
|
移动开发 JavaScript 前端开发
数据可视化大屏百度地图手机端标注开发实战案例解析(jsAPI接口、标注分类图片、文本标签、分类筛选、自适应高度信息弹窗、PHP后端API)
数据可视化大屏百度地图手机端标注开发实战案例解析(jsAPI接口、标注分类图片、文本标签、分类筛选、自适应高度信息弹窗、PHP后端API)
204 0
|
6月前
|
XML 小程序 Java
【Android App】三维投影OpenGL ES的讲解及着色器实现(附源码和演示 超详细)
【Android App】三维投影OpenGL ES的讲解及着色器实现(附源码和演示 超详细)
124 0
[√]OpenGL绘制图片
[√]OpenGL绘制图片
107 0
|
机器学习/深度学习 数据采集 XML
使用BeautifulSoup解析豆瓣网站的HTML内容并查找图片链接
使用BeautifulSoup解析豆瓣网站的HTML内容并查找图片链接

推荐镜像

更多