textureCache中的等价路径问题

自己的引擎里做了个简单的TextueCache,每次新创建一个纹理,先到TextureCache里查找有没有路径相同的,如果有就直接返回纹理,如果没有加载图片创建纹理并将图片路径缓存起来。另外为了标准统一,我们可以规定路径都转化成全路径(full path)再缓存。

不过发现对于使用了返回父级符号 ../ 的路径,这样简单处理是有问题的,比如 a/b/../x.png 和 a/c/../x.png 这两个路径,形式上不同,实际上却是等价。为了解决这个问题,我们在缓存路径的时候仍然缓存原始全路径,但是在做两个全路径比较时要先将两个全路径都转成不带 ../ 符号的形式再比较。代码如下:

   bool isPathEqual(const string&fullPath1,const string&fullPath2){//fullPath1 and fullPath2 must be full path

string path1=convertToDirectPath(fullPath1);

string path2=convertToDirectPath(fullPath2);

const int path1Len=(int)path1.size();

const int path2Len=(int)path2.size();

if(path1Len!=path2Len)return false;

for(int i=0;i<path1Len;i++){

if(path1[i]==‘/‘||path1[i]==‘\\‘){

if(path2[i]==‘/‘||path2[i]==‘\\‘){

//ok

}else{

return false;

}

}else{

if(path1[i]!=path2[i])return false;

}

}

return true;

}

string convertToDirectPath(const string&path){//convert path to equivalent form but without ../

string pathDirect;

for(int i=0;i<(int)path.size();i++){

if(i+3<(int)path.size()

&&(path[i]==‘/‘||path[i]==‘\\‘)

&&path[i+1]==‘.‘

&&path[i+2]==‘.‘

&&(path[i+3]==‘/‘||path[i+3]==‘\\‘))

{

for(int j=(int)pathDirect.size()-1;j>=0;j--){

if(pathDirect[j]==‘/‘||pathDirect[j]==‘\\‘){

pathDirect.resize(j+1);

break;

}

}

i+=3;

assert(path[i]==‘/‘||path[i]==‘\\‘);

}else{

pathDirect=pathDirect+path[i];

}

}//got pathDirect

return pathDirect;

}

不知道cocos2dx里的TextureCache有没有考虑这种情况,等有时间看下。

时间: 2024-10-20 23:01:25

textureCache中的等价路径问题的相关文章

J2EE web项目中解决所有路径问题

Java中使用的路径,分为两种:绝对路径和相对路径.归根结底,Java本质上只能使用绝对路径来寻找资源.所有的相对路径寻找资源的方法,都不过是一些便利方法.不过是API在底层帮助我们构建了绝对路径,从而找到资源的! 在开发Web方面的应用时, 经常需要获取服务器中当前WebRoot的物理路径. 如果是Servlet , Action , Controller, 或者Filter , Listener , 拦截器等相关类时, 我们只需要获得ServletContext, 然后通过ServletCo

MySQL在windows系统中修改datadir路径后无法启动问题,报错1067

windows server2008下如何更改MySQL数据库的目录的帖子已经很多了,这里简单介绍一个步骤,如果不成功请先查看其它帖子. 更改默认的mysql数据库目录 将 C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.1\data 改到 D:\MysqlData 1. 建立文件夹 D:\MysqlData 2. 停止 mysql 服务,将 "C:\Documents and Settings\

JAVA中获取项目文件路径

在java中获得文件的路径在我们做上传文件操作时是不可避免的. web 上运行 1:this.getClass().getClassLoader().getResource("/").getPath(); this.getClass().getClassLoader().getResource("").getPath();  得到的是 ClassPath的绝对URI路径.如:/D:/jboss-4.2.2.GA/server/default/deploy/hp.wa

java web项目,java类中获得WEB-INF路径

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 private static String getWebInfPath() {         URL url = 当前类.class.getProtectionDomain().getCodeSource().getLocation();         String path = url.toString();         int index = pat

Mac在PATH中永久添加路径

Mac系统的环境变量,加载顺序为: /etc/profile /etc/paths ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc /etc/profile和/etc/paths是系统级别的,系统启动就会加载,后面几个是当前用户级的环境变量.后面3个按照从前往后的顺序读取,如果~/.bash_profile文件存在,则后面的几个文件就会被忽略不读了,如果~/.bash_profile文件不存在,才会以此类推读取后面的文件.~/.bashrc没

(转)CSS与JS中的相对路径引用简单介绍

javascript和css文件中采用相对路径,其基准路径是完全不同的. 1.javascript引用资源(比如图片)相对路径是以宿主路径(被引用的网页比如你在首页index.php引用了某js文件,则index.php即为宿主)所处位置为基准. 2.css引用资源(比如图片)相对路径是以.css文件所处位置为基准! 大家在html中通常会导入一些外部的css.js文件,而其中一个比较容易被忽视的问题就是路径问题,有时候,我们在css.js中都有通过路径来引入一张图片的需求,当我们采用相对路径的

php 相对路径中 及 绝对路径中 的一些问题

写本篇文章,是为了以后学习中遇到问题好解决 php的相对路径是以当前工作目录为基准的,并不是以当前处理的文件目录为基准,这样导致我们在开发过程中总会遇到一些问题. 但是如果我们使用绝对路径,就会导致后期的项目移植,以及可维护性较差. 在使用include以及requice包含文件的时候,在文件路径前都加上dirname(__FILE__)可解决路径问题 dirname(__FILE__)获取当前文件的目录路径 ps: 当前有四个文件,分别为a.php,b.php,c.php,d.php 他们之间

C\C++编程中:相对路径+绝对路径

电脑硬盘E盘下,建文件夹“test”,"test"下建立子文件夹“file”,"file"下建子文件夹“data”, 电脑资源管理器显示目录  E:\test\file\data 当前 路径 E:\test\file =================================================== 1. 相对路径 ,用正斜杠’/‘ 1.1向上一级目录指向 ./    表示当前路径,相当于E:\test\file ../  表示当前路径的上一级路

iOS之与iTunes文件共享,在程序中获得Document路径

有时候程序开发需要通过沙盒中的 documents文件夹与用户共享文件,iTunes默认是不支持iTunes file Sharing的,首先设置 info-list的Application supports iTunes file sharing为YES. 这样程序就可以支持文件共享. 然后我将iPad破解后,用91助手往里面存了点东西,作为测试使用,访问Document路径的代码如下: NSString *homeDir = NSHomeDirectory(); NSArray *paths