本文主要是介绍多线程 + 网络 + 概率 + 基础 + 文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
cocos2dx多线程以及线程同步 与 cocos2dx内存管理与多线程问题 ------- 火车售票
iOS开发Swift篇(02) NSThread线程相关简单说明 --- http://www.cnblogs.com/wendingding/p/5409149.html
C++11 多线程 ------- http://www.cnblogs.com/zhuyp1015/archive/2012/04/08/2438288.html
c++11 多线程 -- 基本使用--http://www.2cto.com/kf/201507/419768.html
C++11 并发指南三(std::mutex 详解)
new && new(std::nothrow) --- http://blog.sina.com.cn/s/blog_65d204330101do6r.html
C++类型转换函数 ---- C语言中文网 http://c.biancheng.net/cpp/biancheng/view/222.html .
函数调用 堆栈 --- http://blog.csdn.net/zhanglianpin/article/details/6310873
多重继承中二义性 --- http://blog.csdn.net/zhangyishuihan/article/details/7233914
google protobuf特点及语法 --- http://wanglimin2004.blog.163.com/blog/static/115488498201372221518780/
socket编程中write、read和send、recv之间的区别 / TCP网络通讯如何解决分包粘包问题
C语言中的二进制八进制十进制与十六进制之间的转换(转)
运行效率
运算符重载: 隐含了第一个参数this指针
返回引用类型:
--------------------------------------------------------------------------------------------------------------------网络:2017年1.10日
1 心跳包:http://blog.csdn.net/xuyuefei1988/article/details/8279812
实例:框架以前PC都是长连接 后来手机改为短连接。
2
短连接:数据发送完就断开, 长连接:等结束才断开。 http短连接<完后断开connect>,socket既:可长连又能短连.
问题来了:长连接时服务器怎么知道client是否在线那?
心跳包:用于判断是否掉线,Logic层实现的, client用Timer定时发一个数据包<heartBeat>,服务器Timer定时检测如果在规定时间没收到,视为断网(单独线程)
TCp:TCP的机制里面,本身是存在有心跳包的机制的,why不用,因为系统默认设置2小时的心跳频率。so2h太长...
3
进程间通信的方式有 共享内存, 管道 ,Socket ,消息队列等。
郑亮:进程通信常见有socket 。server在主线程发infor,子线程收消息。 Or会阻塞。 多线程有很多问题:如争夺资源
--------------------------------------------------------------------------------------------------------------------文件:2016年12月
文件操作:Log不能覆盖旧的 FILE *fp = fopen(fileName.c_str(), "a+");
//http://wenda.so.com/q/1462487621725072 - http://wenda.so.com/q/1364838871065534?src=140 -- http://www.cnblogs.com/wangzijing/archive/2013/03/02/2940466.html
--------------------------------------------徐国安 2017.3.4
1 char: 8bit= 1byte 字节流/二进制 http://blog.csdn.net/moxiaomomo/article/details/6647939
2 序列化:顺序一样 名字无所谓是。因为server是根据sizeof来判断的
------------------------------------------- 框架:简单方法解析字符串
GetMonthDays //获取某年中的某个月有多少天
IsLeapYear //是否闰年
IsValidIDCardNumber//验证身份证号码是否正确
读取配置文件不外呼: json xml 自定义<.ini .cfg>
cocos3.X命名规则:
成员变量:_csBuildID 局部变量:csBuildID 如 CCASSERT(strcmp(_csBuildID.c_str(), csBuildId->c_str()) == 0,。。。。
------------------------
1 游戏中玩家牌:
GameScene类: left right up down上中下左右4个玩家
CardLayer类:手牌 河流牌 吃碰杠牌,依据参数不同创建4个玩家card <4个玩家抽象出一个类>
2 动态计算位置:
tt_totalLen = tt_pOneCardNode->getContentSize().width + (tt_testNum - 1)*_varSpan;
XX->setPosition(Vec2(tt_firstX + i*_varSpan, tt_firstY));
麻将胡牌算法研究:
http://blog.csdn.net/ogre2014/article/details/40116969 http://blog.sina.com.cn/s/blog_7213e0310101dq3w.html http://blog.csdn.net/lj343424531/article/details/49611687axx
1类型not found: 路径不对or命名空间未包含
2 编译中的报错: .obj(目标文件)已经是解决和未解决符号,Finder时技巧。。。
3 Link错误: setYangmaijie()在loadview被调用,但是只有声明无实现
OpenGL系统的在build Phrase 添加库
-----------------------2017.7.24-------------------android
1 获取电量 改写: http://www.cnblogs.com/RabbitLx/p/5886637.html
2. JNI: C++调java,static与非静态区别
public String getVerName()
3 cocos2d3.x android和ios屏蔽多点触摸 --https://blog.csdn.net/wpj0304/article/details/62417692
Android中关于屏幕的三个小众知识(全面屏适配) -- http://www.jb51.net/article/129633.htm
4 cocos2dx打包Android的时候,怎么设置横竖屏切换的? (AndroidManifest.xml)
------------------------------------------------iOS 开发证书问题
1 每款游戏都需要开发证书;
p2=使电脑获取开发权限, mobile provising 是让Xcode获取开发权限。 General Building setting都要配置
2 打包手机上报错:
红线为.p2在钥匙串中对应的英文名字。 http://blog.csdn.net/hurosezhang/article/details/51063788
-----------------------------------------------查看Xcode支持的手机ios系统最大版本
低于比此版本的iOS系统手机,都可以调试;
------------------------ app授权;
Android: 在AndroidManifest.xml中<uses-permission android:name="android.permission.INTERNET"/>
ios : 在info.plist中, http://blog.csdn.net/wyy520pro/article/details/53585806
安装完成后(粗体黑色是系统, 小的浅色是自己的infor.plist描述文字)
-------------------------如何使用证书
拿到新cer的操作:1双击.p12导入钥匙串中 2 Xcode中
真机调试遇到问题:报code sign不对,证书过期了,拿到新cer的操作。。。
---------------------
1
等xcode上面的进度条读完就好了。(进度条就是在配置真机的信息) -- 遇到问题 百度
2 iOS真机调试,常见证书问题的解决方案以及Xcode7之后免$99真机调试
苹果要求为调试的iOS设备进行注册.
3 如何跟新xcode支持的baseSDK最高IOS系统版本
4 https://blog.csdn.net/yancechen2013/article/details/67636498 --第三步骤位置:在第一部下面
解决低版本Xcode不支持高版本iOS真机调试--
[置顶] 程序员三十岁之后要考虑什么?
----------------配置java环境
------------------------集成魔窗SDK + 接入微信登陆
iOS中如何呼出另一个应用
证书区别 :fuyangmahjong_Development(开发) / Distributiuon(发布
DLL 导出函数 _stdcall 和 _cdecl调用约定 - http://blog.csdn.net/hb19820102/article/details/7432694
--------------------------------------------2017.9.26. Tcp粘包+makeFile
不用新建一个VS/Xcode工程去模拟;直接用一个text.cpp文件即可
http://blog.csdn.net/sweettool/article/details/77018506
Linux 应用---make及makefile的编写 http://blog.csdn.net/zqixiao_09/article/details/50388695
-------socket
1 fd_set fd_ctl/is........select()
2 非阻塞:fctnl设为non_block就,不让卡住,
connet()返回值: 非阻塞永远 =-1; 阻塞:握手成功>0;<0连接失败
---------WebSocket 和 Socket 的区别?
就像Java和JavaScript没啥联系 是一种长连接协议,
WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。在WebSocket API中,浏览器和服务器只需要做一个握手的动作,
然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。Cocos2d-x引擎集成libwebsockets,
http://www.ruanyifeng.com/blog/2017/05/websocket.html?utm_source=tuicool&utm_medium=referral
------------------------------------------------------------------------------------动画
void UITaskDaily::FoundItem(Node* pAddToNode)
{
m_pTaskNode = CSLoader::createNode("CSD/TaskDaily.csb");
pAddToNode->addChild(m_pTaskNode);
m_pTaskNode->setVisible(false);
m_pTaskAction = CSLoader::createTimeline("CSD/TaskDaily.csb");
m_pTaskNode->runAction(m_pTaskAction);
}
void UITaskDaily::onShow()
{
m_pTaskAction->gotoFrameAndPlay(0, 15, false);
m_pTaskAction->setLastFrameCallFunc(CC_CALLBACK_0(UITaskDaily::onShowEnd, this));
}
void UITaskDaily::onShowEnd()
{
m_pTaskNode->setVisible(true);
m_pTaskAction->clearLastFrameCallFunc();
}
----- http://blog.csdn.net/fansongy/article/details/12955989 Cocos2d-x 3.0 开发(七)在程序中处理cocoStudio导出动画
--------------------------------线程与进程
线程与进程的区别: 最小调度单位 共享资源
进程与进程间并发执行。 进程内部线程:也是并发执行
多线程编程
线程间的互斥与同步:物理设备/ shunxu
临界资源和临界区: 它们要求被互斥的访问
互斥量(Mutex) (全局的互斥量)
-------------------------------ios
iOS开发零基础教程之开发证书以及打包问题 http://www.myexception.cn/iphone/302252.html
--------------------郭新泉:
去年进步最大。 杨辉 秋 程勇都换工作了。 不能没能力 形成依赖 为自己工作
----------------高报 基础
1 线程有主子之分,进程无就一个 2:muntex互斥量不能解决所有的,4种都得了解 3:muntex就是解决线程通信问题 4:sleep经常用,不使用浪费CPU资源
2 生产者 消费者
做视频直播:实质一个sprite不断修改texture。而纹理数据是从server获取的
B 多线成共享资源---so变量必须是全局 ---- 互斥锁(全局变量)
_thread = new std::thread(&UIGameAnnouncements::ReadXML, this);
//_thread->join(); //为啥不会走了!阻塞主线程。 啥时候使用?
//1 线程开 关闭。(资源释放时join调用) 2比如多个线程都访问一个变量, --- 成高爆
_thread2 = new std::thread(&UIGameAnnouncements::helloWorld, this);
CCLOG("----------ove------");
}
void UIGameAnnouncements::helloWorld()
{
while (true)
{
// _muntex.lock();
if (num > 0)
{
CCLOG("----------helloWorld------: %d", num);
num--;
// _muntex.unlock();
}
else
{
// _muntex.unlock();
break;
}
std::this_thread::sleep_for(chrono::seconds(1));
}
}
void UIGameAnnouncements::ReadXML()
{
while (true)
{
// _muntex.lock();
if (num > 0)
{
CCLOG("-------------MainThread-----ReadXML----: %d", num);
num--;
/// _muntex.unlock();
}
else
{
// _muntex.unlock();
break;
}
std::this_thread::sleep_for(chrono::seconds(1)); //不能省去 or出不来 同一张票卖了2次
}
}
------------2017.11.2
1 转码
cocos2dx中使用iconv转码(win32,iOS,Android)
客户端到server:UTF8--ASCII server到client:ASCII-UTF8
2 MD5加密:(需要库)
在 Cocos2d-x 中使用 OpenSSL - http://leenjewel.github.io/blog/2015/06/30/zai-cocos2d-x-zhong-shi-yong-openssl/
3 服务器:
#define WIK_LEFT 0x01 //左吃类型
#define CHR_PI_HU 0x00000001 //屁胡
区别:
1 why值可一样:一个操作类型 一个胡牌类型; 不会赋值给同一个变量
2 前者至多能代表8种类型2*4=8,后者至多有32位8*4=32
3 why是2倍数:保证转化为2进制后每一位都是0,only有一位是1
赋值:dwChiHuKind |= KF_CHK_QI_DUI; 使用:if((dwChiHuKind&FY_CHK_HU) != 0)
5 HTTP
------------2017.10.1 外包
第一次: 学习到:webSocket 和Probuffer
第二次:HTTP请求的URL参数问题和JSON配置解析
在setURL 时;为啥不把?替换为对应的ID数值那 http:XXX/getPlayerByPlayerID?userid=1111223
服务器代码调试 --------- http://snoopyxdy.blog.163.com/blog/static/60117440201404105333383/
头说: 桌子服务器 是需要才创建
--------------------------------------------------我不会-------概率: 问了后采弄明白
----------要求:某张牌按一定概率出现
1 鱼,财神,招财猫出现几率: 按概率和比牌张数
比一张:0.97 0.2 0.1 (和=100%)
二: 0.96, 0.03 0.01
三: 0.80 0.15 0.5
注:石头 剪刀 布 随机
2 随机数使用
rand()%N :生成0-99之间整数
srand(time(NULL)) 使用前要设置种子, 通常赋值为time(NULL)
-----------------------------上面代码:
#define ISRANGE(n,a,b) (((a) > (b)) ? (a>n&&n>=b) : (a<=n&&b>n))
ardType CGameLogic::GetACardType()
{
SetProOfEmergence(g_SystemParam.fProOfEmergence);
float fPro[3]= {0};
switch(m_nCardCount)
{
case 1:
memcpy(fPro, m_nProOfEmergence[0],sizeof(fPro)); //比一张牌时, 不同牌型出现概率(0.97 0.2 0.1 (和=100%))
break;
case 3:
memcpy(fPro, m_nProOfEmergence[1],sizeof(fPro)); // 3 (0.96, 0.03 0.01)
break;
case 5:
memcpy(fPro, m_nProOfEmergence[2],sizeof(fPro)); // 5(0.80 0.15 0.5)
break;
}
int nStartNum = 0;
srand(time(nullptr));
int tt_rand = rand()%100; (总和100%)
for (int n = 0;n< 3 ;n++)
{
if (ISRANGE(tt_rand,nStartNum,nStartNum+(fPro[n]*100))) // 判断随机数是否在区间/某个概率范围内
{
return (CardType)(n+1);
}
nStartNum+=(fPro[n]*100);
}
return ctType1;
}
-----------------------------------80/20法则: 时间空间 (许国安)
要求: 从一个字符串中提取出来汉字
string _strContent = "您存<a,b/f >在 幸 运a符/飞";
string output;
for (int i = 0; i < _strContent.size(); i++)
{
if (_strContent[i] == '<') // 不需要的
{
}
else
{
//output.append( _strContent[i]) //开始这样写不对, 直接看源码。。。
output.append(1, _strContent[i]); // 这种写法:浪费内存,但是省CPU/时间(因为定义一个变量, 省:每次Del后, 后边元素不用先前移动)
}
}
string _strContent2;
string _strTemp2 = _strContent, _strTemp = _strContent;
for (int i = _strTemp.size() - 1; i >= 0; i--)
{
if (_strTemp[i] >= '0' && _strTemp[i] <= '9')
{
_strTemp.erase(_strTemp[i]); //是这样用的吗? 没差文档/看源码
}
}
string _temp55 = "";
for (int i=0; i < _strTemp2.size(); i++)
{
if (_strTemp2[i] >= '0' && _strTemp2[i] <= '9')
{
//continue;
}
else
{
_temp55 = _temp55 + _strTemp2[i]; //效率很低:A _temp55 + _strTemp2[i];会产生多个临时对象 B 直接看.erase函数圆形 C到过来遍历,汉字结合错了
}
}
// return 也会产生临时变量。 所以:一般返回引用or指针
------------------------------------------------------------------------------------------------------------文件
使用研发主管读取文件说明:
1 对文件后缀无要求; fopen必须礬2进制方式
2 每行以分号 + Enter结束. ; + \r\n <可以有注释,但不能有=号>
3 定义Map. 把内容放入到Map中再用getValue取出值
+
-----------------------------11.23
bool UILogin::LoadPeiTileCfg(const string& strFileName)
{
//人数都为固定,且由房间配置
FILE* fp = fopen("MaJaing.ini", "rb");
if (!fp)
return false;
//得到文件大小
fseek(fp, 0, SEEK_END);
long fileLen = ftell(fp);
fseek(fp, 0, SEEK_SET);
//读出所有数据
char* pBuf = new char[fileLen + 1];
fread(pBuf, fileLen, 1, fp);
pBuf[fileLen] = '\0';
fclose(fp);
char* pOld = pBuf;
bool bEnd = false;
/分号作为分隔符
int tt_fenhaoindex = -1; //分号的位置
while (!bEnd)
{
string strLine;
int readNum = 0;
strLine = GetSubSection(pBuf, readNum, bEnd);
pBuf += readNum;
if (strLine.length() > 0)
{
strLine = RemoveSpaceAndN(strLine);
}
if (strLine.length() > 0)
{
ParserSubSection(strLine, false);
}
}
delete[] pOld;
return true;
}
//得到一段,用分号间隔
string UILogin::GetSubSection(char* pChar, int& readNum, bool& bReadAllEnd)
{
readNum = 0;
bReadAllEnd = false;
string strLine;
char ch[2];
while ((*pChar) != '\0')
{
//换行,分号
if ((*pChar) != '\n' && ((*pChar) != '\r') && ((*pChar) != ';'))
{
ch[0] = *pChar;
ch[1] = '\0';
strLine.append(ch);
pChar++;
readNum++;
}
else
{
pChar++;
readNum++;
break;
}
}
if ((*pChar) == '\0')
{
bReadAllEnd = true;
}
return strLine;
}
//移除空格和换行
string UILogin::RemoveSpaceAndN(string& strLine)
{
const char* pChLine = strLine.c_str();
size_t len = strLine.length();
char* pCh = new char[len + 1];
int count = 0;
while ((*pChLine) != '\0')
{
if ((*pChLine) != ' ' && ((*pChLine) != '\n') && ((*pChLine) != '\r') && ((*pChLine) != '\t') && ((*pChLine) != ';'))
{
pCh[count] = *pChLine;
count++;
}
pChLine++;
}
pCh[count] = '\0';
string strTemp;
strTemp.append(pCh);
delete[] pCh;
return strTemp;
}
void UILogin::ParserSubSection(string& strLine, bool bPeiTile)
{
string strKey;
string strValue;
if (IsKeyAndValue(strLine.c_str(), (int)strLine.length(), strKey, strValue))
{
_KeyValueMap.insert(make_pair(strKey, strValue));
}
}
//是否是键和值
bool UILogin::IsKeyAndValue(const char* pChLine, int charLen, string& strKey, string& strValue)
{
//查找=,进行左右分隔
int dengPos = 0;
int len = charLen;
const char* p = pChLine;
while ((*p) != '\0')
{
if ((*p) == '=')
{
break;
}
p++;
dengPos++;
}
if (dengPos > 0 && dengPos < len)
{
p = pChLine;
char* pChLeft = new char[dengPos + 1];
memcpy(pChLeft, p, dengPos);
pChLeft[dengPos] = '\0';
strKey.append(pChLeft);
delete[] pChLeft;
char* pChRight = new char[len - dengPos];
memcpy(pChRight, (p + (dengPos + 1)), len - dengPos - 1);
pChRight[len - dengPos - 1] = '\0';
strValue.append(pChRight);
delete[] pChRight;
return true;
}
return false;
}
这篇关于多线程 + 网络 + 概率 + 基础 + 文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!