Uniplot.v5.11.1-LGN\
MFC BMP文件转JPEG文件
2.在你将要使用GDI+的工程中,完成初始化工作:
在StdAfx.h中加入
#include <Gdiplus.h>
using namespace Gdiplus;
3.在CXApp头文件中加入
4.在 BOOL CXApp::InitInstance() 中添加
GdiplusStartup(&m_gdiplusToken, &m_gdiplusStartupInput, NULL);
5.在int CXApp::ExitInstance()加入(这个方法需要自己加入 在ClassWizard 中,注意在ClassName中选择CXApp,Messages列表框中选择ExitInstance)
6.在Project->stting->Link->Intput->Additional Dependencies中加入gdiplus.lib
此时GDI+设置成功。
具体代码如下:
//调用方式:
本文转自:http://blog.csdn.net/highyyy/article/details/6125763
【转】Qt应用程序自动重启(零零散散)
- 老有人问如何让Qt的应用程序自动重启,稍微写一点,也顺便理理自己的思路 2011.10.26
自动重启,也就是退出当前进程,启动一个新的进程。于是,先看程序如何退出
退出
Qt程序的一般结构如下:
int main(int argc, char** argv) { QApplication app(argc, argv); Widget w; w.show() return app.exec(); }
最后一句启动了主线程的事件循环。而要退出程序,就是要退出这个事件循环,使main函数返回。
如何退出?
正确方式:
- QCoreApplication::exit(int);
它还有一个马甲
- QCoreApplication::quit();
对于QApplication来说,它有一个常用的属性
quitOnLastWindowClosed
所以,当最后一个窗口关闭时,它可以自动调用前面的exit()
而至于关闭窗口呢,我们还可以使用
- QApplication::closeAllWindows()
注:一般来说,对于多个窗口的程序,调用这个会比直接调用quit要好。因为这样窗口可以接受到Close事件。
启动外部程序
在Qt中,做这个工作的非QProcess莫属了,要启动当前程序的另一个进程,有要使二者没有"父子"关系。恩
QProcess::startDetached(qApp->applicationFilePath(), QStringList());
可是,为什么不写成下面这样?
QProcess::startDetached(qApp->applicationFilePath());
当然,如果路径中不包含空格,这个也可以工作。
重新启动1
现在简单了,要重新启动,只需要调用
void XXX::onXXX() { qApp->quit(); QProcess::startDetached(qApp->applicationFilePath(), QStringList()); }
或者:
void XXX::onXXX() { qApp->closeAllWindow(); QProcess::startDetached(qApp->applicationFilePath(), QStringList()); }
重新启动2
尽管没什么好处,但有时候,我似乎更喜欢这样写:
void XXX::onXXX() { qApp->exit(773) }
然后main函数改成
int main(int argc, char** argv) { .... int ret = app.exec(); if (ret == 773) { QProcess::startDetached(qApp->applicationFilePath(), QStringList()); return 0; } return ret; }
这里面我用了一个魔数:773,没什么特别含义,只是因为我觉得
773 = 'r'+'e'+'s'+'t'+'a'+'r'+'t' ==>restart
上班了,就写到这儿...
Vizimag.v3.151 物理磁场研究
wildpigEdit 再次起航
目前进度:已经完成地形的编辑 保存 载入
要做的:植被
未来:再次重构实
感兴趣的可以看看:http://pan.baidu.com/share/link?shareid=2813701924&uk=3762046617
放图:

Create New Commands in Tcl
Create New Commands in Tcl
摘要Abstract:Tcl/Tck脚本可以很容易实现用户自定义的命令,方便的创建图形化的用户界面GUI,所以Tcl和Tk的应用领域几乎覆盖了图形和工程应用的全部范围,包括计算机辅助设计、软件开发、测试、仪器控制、科学可视化及多媒体方面。本文主要详解如何在C程序中使用Tcl来创建自定义的命令,并理解OpenCascade的Draw Test Harness的实现。
关键字Key Words:OpenCascade, Tcl/Tk, Draw Test Harness, Software Customization
一、引言 Introduction
Tcl是”Tool Command Language”,和Python、Perl、Lua等一样也是一种脚本语言。利用Tcl可以很容易实现自定义的命令,利用Tk可以很方便地创建出跨平台的用户界面UI。因Tcl/Tk功能强大,跨平台便于移植,且是开源免费的,所以在OpenCascade中就利用这个库来实现了测试程序Draw Test Harness,并且也利用Tcl实现了自动化测试。
因为Tcl是解析语言,所以Tcl可用来做为程序中的二次开发语言。因为修改Tcl的脚本不需要重新编译链接,只需要重新加载下,加快开发速度。
通过在Tcl中实现自定义的命令,来理解OpenCascade中Draw Test Harness的实现,并去感受Tcl的强大功能。
Figure 1.1 Draw Test Harness with Tcl/Tk
二、Tcl/Tk应用 OpenCascade Draw Test Harness
在Draw Test Harness中输入自定义的命令就可以对相应的建模造型程序进行检验。理解其实现方法,也可以加深对OpenCascade的其他模块的理解。如下图所示为自定义命令:
Figure 2.1 User defined command in Draw Test Harness
Figure 2.2 Command result in Test3d view
可以结合《OpenCascade Test Harness User’s Guide》来试试Draw Test Harness,如果将命令做在自己的程序中,就可以实现脚本建模啦。
Draw Test Harness中的命令都是用Tcl/Tk来实现的,下面通过一个简单的示例来说明如何在Tcl中实现自定义的命令。学会Tcl脚本应该也是掌握了一种强大的脚本工具,可以为自己的程序实现二次开发功能。
三、程序示例 Example Code
在Tcl中实现自定义命令很方便,只需要按Tcl的格式定义一个命令函数。基于对象的命令函数的声明如下:
Tcl_Interp *interp, int objc, struct Tcl_Obj * CONST * objv));
为了能在Tcl中调用一个命令函数,必须先调用Tcl_CreateObjCommand注册它,格式如下所示:
CONST char * cmdName, Tcl_ObjCmdProc * proc,
ClientData clientData,
Tcl_CmdDeleteProc * deleteProc);
这就是把Tcl中的字符串与实现它的C函数关联起来“魔术”。一个完整的程序如下所示,程序实现了两个自定义的命令randomcmd和equalcmd,分别用来生成一个随机数和相等判断:
* Copyright (c) 2014 eryar All Rights Reserved.
*
* File : Main.cpp
* Author : eryar@163.com
* Date : 2014-01-09 18:58
* Version : 1.0v
*
* Description : Create new command for Tcl in C. Refer to
* 1. Tcl and Tk Toolkit
* 2. Practical Programming in Tcl and Tk
*
* Key Words : Tcl/Tk, C Interface, New Command
*
*/
#include <tcl.h>
#include <stdlib.h>
#include <string.h>
#pragma comment(lib, "tcl85.lib")
/*
* @breif Definitions for application-specific command procedures.
*/
int RandomCmd(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj *CONST objv[])
{
if (objc != 2)
{
Tcl_WrongNumArgs(interp, 1, objv, "?range");
return TCL_ERROR;
}
int limit = 0;
Tcl_Obj* result = NULL;
Tcl_GetIntFromObj(interp, objv[1], &limit);
result = Tcl_NewIntObj(rand() % limit);
Tcl_SetObjResult(interp, result);
return TCL_OK;
}
int EqualCmd(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj *CONST objv[])
{
if (objc != 3)
{
Tcl_WrongNumArgs(interp, 1, objv, "string1 string2");
return TCL_ERROR;
}
Tcl_Obj* result = NULL;
char* arg1 = Tcl_GetString(objv[1]);
char* arg2 = Tcl_GetString(objv[2]);
if (strcmp(arg1, arg2) == 0)
{
result = Tcl_NewBooleanObj(1);
}
else
{
result = Tcl_NewBooleanObj(0);
}
Tcl_SetObjResult(interp, result);
return TCL_OK;
}
/*
* @breif Tcl_AppInit is called from Tcl_Main after the Tcl interpreter has been created,
* and before the script file or interactive command loop is entered.
*/
int Tcl_AppInit(Tcl_Interp* interp)
{
// Initialize packages Tcl_Init sets up the Tcl library facility.
if (Tcl_Init(interp) == TCL_ERROR)
{
return TCL_ERROR;
}
// Register application-specific commands.
Tcl_CreateObjCommand(interp, "randomcmd", RandomCmd, NULL, NULL);
Tcl_CreateObjCommand(interp, "equalcmd", EqualCmd, NULL, NULL);
return TCL_OK;
}
int main(int argc, char* argv[])
{
Tcl_Main(argc, argv, Tcl_AppInit);
return 0;
}
程序效果如下图所示:
Figure 3.1 User defined command in Tcl
结合上面的代码来理解Draw Test Harness中自定义命令的实现可以事半功倍。当然也可以在C程序中使用Tk来定义用户界面UI。详细信息请参考References中罗列的参考资料。
由上可知,使用Tcl/Tk可以使自己的程序实现命令行的功能,如AutoCAD、PDMS中都有这种功能,用户通过输入命令来实现一定的功能,很方便,如下图所示为PDMS中的命令窗口:
Figure 3.2 Command Window of AVEVA Plant/PDMS
四、结论 Conclusion
通过在程序中使用Tcl实现自定义的命令,理解Tcl中C接口的用法。在此基础上来理解OpenCascade中Draw Test Harness的实现要更容易。
通过学习Tcl/Tk可知,Tcl可以作为程序的二次开发语言,类似PDMS中的PML。Tcl中自定义命令方便,还可对表达式进行解析并求值,功能相当强大。缺点就是在Tcl中面向对象的功能要差点儿,如在Tcl脚本中自定义一个对象,像在PML中可以这样来自定义对象,而在Tcl中这种自定义类型是不支持的:
Figure 4.1 User Defined Object in PDMS PML
好像Tcl也有对面向对象的加强库TclOO,基本用法如图所示:
Figure 4.2 Basic Usage of TclOO
五、参考资料 References
1. Tcl and the Tk Toolkit
2. Practical Programming in Tcl and Tk
3. Tcl/Tk A Developer’s Guide
4. http://sourceforge.net/projects/tcl/
PDF Version: Create New Commands in Tcl
Lotto.Pro.2009.v7.53.Cracked-DJiNN\
*****************************************************************
好得行业软件网提供各个行业专业软件,所有软件均为完整版本,模块齐全,详细请咨询
TEL:13978229035 QQ:508925688
Email: ywcwsoft@sohu.com ywcwsoft@sina.com ywcwsoft@126.com
好得行业软件网 www.haodesoft.com
点击咨询:http://haodesoft.53kf.com
请使用Ctrl+F 键来查询您所需软件,找到后联系我们QQ或是邮件,我们会第一时间为您回复
如何为IE9及以下版本加载特定希望CSS
- function wps_enqueue_lt_ie9() {
- global $is_IE;
- // Return early, if not IE
- if ( ! $is_IE ) return;
- // Include the file, if needed
- if ( ! function_exists( 'wp_check_browser_version' ) )
- include_once( ABSPATH . 'wp-admin/includes/dashboard.php' );
- // IE version conditional enqueue
- $response = wp_check_browser_version();
- if ( 0 > version_compare( intval( $response['version'] ) , 9 ) ){
- wp_enqueue_script( 'goodweb_html5shiv', 'http://html5shim.googlecode.com/svn/trunk/html5.js', array(), 'pre3.6', false );
- wp_enqueue_style( 'goodweb_ie8_css',T_CSS.'/style_ie8.css');
- }
- if ( 0 == version_compare( intval( $response['version'] ) , 9 ) ){
- wp_enqueue_style( 'goodweb_ie8_css',T_CSS.'/style_ie9.css');
- }
- }
- add_action( 'wp_enqueue_scripts', 'wps_enqueue_lt_ie9' );
请自行编写所需的css文件。
luabind绑定重载函数写法
// 函数重载写法
// (return_arg-type(*)(arg1-type,grg2-type,...))&function
module(L)
[
def("greet", (void(*)(void))&greet),
def("greet", (void(*)(long))&greet),
def("greet", (long(*)(long,float))&greet)
];
// 成员函数重载用法
// (return_arg-type (classname::*)(arg1-type,grg2-type,...))&classname::class_memberfunction
http与socket验证的区别
这是很基础的概念,之前没怎么弄过http。对于自己,算是做个笔记吧。
一、socket安全验证
socket链接是握手之后就一直连着,所以这条链接在第一包验证之后,之后这条链接不需要再验证。“第一个包”可能描述不准确,因为有时候第一包不一定就验证,可能是做路由之类。这里就不管这种情况了,只管第一个包直接验证的情况。
可以理解为server接受到client的链接,并且验证通过(如用户及密码对了)这个client链接后。以后这个client发过来的包,server都直接做逻辑处理而不再需要做验证链接合法性。这个信任是直到链接断开的。
如果非法客户端来模拟登陆,至少需要得到有效的id及密码,这已经是密码自身安全的事情,不涉及这里谈的链接安全性。
如果非法客户端用正确的id及密码登陆后,发些非法包,这里的包验证应该是服务器上包处理时的包检查及逻辑检查的事,就是通常的游戏说的防刷(包频率、包里数据的合法范围等)。
二、http的安全验证
这里只关心http的短连接。
短连接就是每次建立链接-发包-断开。同一client的前后两次发到server的包,也相当于独立的两次,同一client的验证就需要每个http请求都要验证下。于是有了session和cookie。cookie是将client的标识放在client端,常用于server没有账户密码验证的方式。这里不讨论cookie。
server在第一个http请求验证client后,给他分配一个session。这个session简单的可以理解为server和client约定的一个client凭证(有有效期)。之后client在每个请求里加上这个session里规定的值,例如一个合适长度的随机字符串。
这里的session不能有让恶意用户很容易破解的规律,例如用户的id之类的。所以上边提到随机字符串之类的。
NI.Datafinder.Server.Edition.v2.1\
Geometric DFMPro v3.5 for ProE-Creo-NX-SolidWorks Win32_64 4CD
Geometric DFMPro v3.5 for ProE-Creo-NX-SolidWorks Win32_64 4CD集成的CAD設計工具
DFMPro軟件適用的加工產品有機械加工類設計、鈑金產品類設計、注塑產品類設計和產品裝配類設計等。
DFMPro是一款集成的CAD設計工具,可集成到Creo/UG NX/SolidWorks等大型三維CAD設計係統,提供了可制造性和裝配性設計(DFM/ A)的解決方案,它允許設計人員檢查設計的可生產性,通過對設計模型的可制造性檢查和校驗,避免後期制造階段不必要的設計修改,增強設計質量,降低設計成本,加快產品研制的速度。Q:508925688 TEL:13978229035
DFMPro使用知識規則管理器,檢查的參數和規則邊界可配置;能怎么動將檢查結果生成技術報告;用戶可以非常容易的定義自己的規則知識,規則知識庫可分類打包在各個部門、合作夥伴間共享;可與企業的PLM係統集成等。
C++构造函数中抛出的异常
构造函数中抛出的异常
1、标准C++中定义构造函数是一个对象构建自己,分配所需资源的地方,一旦构造函数执行完毕,则表明这个对象已经诞生了,有自己的行为和内部的运行状态,之后还有对象的消亡过程(析构函数的执行)。可谁能保证对象的构造过程一定能成功呢?说不定系统当前的某个资源不够,导致对象不能完全构建好自己(人都有畸形儿,更何况别的呢?朋友们!是吧!),因此通过什么方法来表明对象的构造失败了呢?C++程序员朋友们知道,C++中的构造函数是没有返回值的,所以不少关于C++编程方面的书上得出结论:"因为构造函数没有返回值,所以通知对象的构造失败的唯一方法那就是在构造函数中抛出异常".主人公阿愚非常不同意这种说法,谁说的,便不信邪!虽然C++标准规定构造函数是没有返回值,可我们知道每个函数实际上都会有一个返回值的,这个值被保存在eax寄存器中,因此实际上是有办法通过编程来实现构造函数返回一个值给上层的对象创建者。当然即便是构造函数真的不能有返回值,我们也可以通过一个指针类型或引用类型的出参来获知对象的构造过程的状态。示例如下:
class MyTest_Base
{
public:
MyTest_Base (int& status)
{
//do other job
// 由于资源不够,对象构建失败
// 把status置0,通知对象的构建者
status = 0;
}
protected:
};
void main()
{
int status;
MyTest_Base obj1(status);
// 检查对象的构建是否成功
if(status ==0) cout 《 "对象构建失败" 《 endl;
}
程序运行的结果是:
对象构建失败
是啊!上面我们不也得到了对象构造的成功与否的信息了吗?可大家有没有觉得这当中有点问题?主人公阿愚建议大家在此停留片刻,仔细想想它会有什么问题?OK!也许大家都知道了问题的所在,来验证一下吧!
class MyTest_Base
{
public:
MyTest_Base (int& status)
{
//do other job
// 由于资源不够,对象构建失败
// 把status置0,通知对象的构建者
status = 0;
}
virtual ~ MyTest_Base ()
{
cout 《 "销毁一个MyTest_Base类型的对象" 《 endl;
}
protected:
};
void main()
{
int status;
MyTest_Base obj1(status);
// 检查对象的构建是否成功
if(status ==0) cout 《 "对象构建失败" 《 endl;
}
程序运行的结果是:
对象构建失败
销毁一个MyTest_Base类型的对象
没错,对象的析构函数被运行了,这与C++标准中所规定的面向对象的一些特性是有冲突的。一个对象都没有完成自己的构造,又何来析构!好比一个夭折的畸形儿还没有出生,又何来死之言。因此这种方法是行不通的。那怎么办?那就是上面那个结论中的后一句话是对的,通知对象的构造失败的唯一方法那就是在构造函数中抛出异常,但原因却不是由于构造函数没有返回值而造成的。恰恰相反,C++标准中规定构造函数没有返回值正是由于担心很容易与面向对象的一些特性相冲突,因此干脆来个规定,构造函数不能有返回值(主人公阿愚的个人理解,有不同意见的朋友欢迎讨论)。
2、构造函数中抛出异常将导致对象的析构函数不被执行。哈哈^-^,阿愚很开心,瞧瞧!如果没有C++的异常处理机制鼎立支持,C++中的面向对象特性都无法真正实现起来,C++标准总不能规定所有的对象都必须成功构造吧!这也太理想化了,也许只有等到共产主义社会实现的那一天(CPU可以随便拿,内存可以随便拿,所有的资源都是你的!)才说不定有可能·····,所以说C++的异常处理和面向对象确实是谁也离不开谁。当然示例还是要看一下,如下:
class MyTest_Base
{
public:
MyTest_Base (string name = "") : m_name(name)
{
throw std::exception("在构造函数中抛出一个异常,测试!");
cout 《 "构造一个MyTest_Base类型的对象,对象名为:"《m_name 《 endl;
}
virtual ~ MyTest_Base ()
{
cout 《 "销毁一个MyTest_Base类型的对象,对象名为:"《m_name 《 endl;
}
void Func() throw()
{
throw std::exception("故意抛出一个异常,测试!");
}
void Other() {}
protected:
string m_name;
};
void main()
{
try
{
// 对象构造时将会抛出异常
MyTest_Base obj1("obj1");
obj1.Func();
obj1.Other();
}
catch(std::exception e)
{
cout 《 e.what() 《 endl;
}
catch(…)
{
cout 《 "unknow exception"《 endl;
}
}
程序的运行结果将会验证:"构造函数中抛出异常将导致对象的析构函数不被执行"
3、是不是到此,关于构造函数中抛出异常的处理的有关讨论就能结束了呢?非也!非也!主人公阿愚还有进一步的故事需要讲述!来看一个更复杂一点的例子吧!如下:
class MyTest_Base
{
public:
MyTest_Base (string name = "") : m_name(name)
{
cout 《 "构造一个MyTest_Base类型的对象,对象名为:"《m_name 《 endl;
}
virtual ~ MyTest_Base ()
{
cout 《 "销毁一个MyTest_Base类型的对象,对象名为:"《m_name 《 endl;
}
void Func() throw()
{
throw std::exception("故意抛出一个异常,测试!");
}
void Other() {}
protected:
string m_name;
};
class MyTest_Parts
{
public:
MyTest_Parts ()
{
cout 《 "构造一个MyTest_Parts类型的对象" 《 endl;
}
virtual ~ MyTest_Parts ()
{
cout 《 "销毁一个MyTest_Parts类型的对象"《 endl;
}
};
class MyTest_Derive : public MyTest_Base
{
public:
MyTest_Derive (string name = "") : m_component(), MyTest_Base(name)
{
throw std::exception("在MyTest_Derive对象的构造函数中抛出了一个异常!");
cout 《 "构造一个MyTest_Derive类型的对象,对象名为:"《m_name 《 endl;
}
virtual ~ MyTest_Derive ()
{
cout 《 "销毁一个MyTest_Derive类型的对象,对象名为:"《m_name 《 endl;
}
protected:
MyTest_Parts m_component;
};
void main()
{
try
{
// 对象构造时将会抛出异常
MyTest_Derive obj1("obj1");
obj1.Func();
obj1.Other();
}
catch(std::exception e)
{
cout 《 e.what() 《 endl;
}
catch(…)
{
cout 《 "unknow exception"《 endl;
}
}
程序运行的结果是:
构造一个MyTest_Base类型的对象,对象名为:obj1
构造一个MyTest_Parts类型的对象
销毁一个MyTest_Parts类型的对象
销毁一个MyTest_Base类型的对象,对象名为:obj1
在MyTest_Derive对象的构造函数中抛出了一个异常!
上面这个例子中,MyTest_Derive从MyTest_Base继承,同时MyTest_Derive还有一个MyTest_Parts类型的成员变量。现在MyTest_Derive构造的时候,是在父类MyTest_Base已构造完毕和MyTest_Parts类型的成员变量m_component也已构造完毕之后,再抛出了一个异常,这种情况称为对象的部分构造。是的,这种情况很常见,对象总是由不断的继承或不断的聚合而来,对象的构造过程实际上是这些所有的子对象按规定顺序的构造过程,其中这些过程中的任何一个子对象在构造时发生异常,对象都不能说自己完成了全部的构造过程,因此这里就有一个棘手的问题,当发生对象的部分构造时,对象将析构吗?如果时,又将如何析构呢?托福答案
从运行结果可以得出如下结论:
(1) 对象的部分构造是很常见的,异常的发生点也完全是随机的,程序员要谨慎处理这种情况;
(2) 当对象发生部分构造时,已经构造完毕的子对象将会逆序地被析构(即异常发生点前面的对象);而还没有开始构建的子对象将不会被构造了(即异常发生点后面的对象),当然它也就没有析构过程了;还有正在构建的子对象和对象自己本身将停止继续构建(即出现异常的对象),并且它的析构是不会被执行的。sat答案
构造函数中抛出异常时概括性总结
(1) C++中通知对象构造失败的唯一方法那就是在构造函数中抛出异常;
(2) 构造函数中抛出异常将导致对象的析构函数不被执行;
(3) 当对象发生部分构造时,已经构造完毕的子对象将会逆序地被析构;
(4) 其是还是那句话, "C++的异常处理不会破坏任何一条面向对象的特性!",因此主人公阿愚再次建议朋友们,牢牢记住这一条!
随想: 业余游戏开发者对阿里手游平台的"瞎"想
前两天看到阿里也出手游平台了. 对于我这样野生的业余游戏开发爱好者来说, 算是多了个可以选择的平台. 想着借助阿里的这个手游平台, 咱就可以做个这样的游戏 --
虚拟逛街 : 穿行与虚拟化的店铺间, 通过广告什么的, 来找指定商品, 或者参加什么的活动, 完成后, 获得一定的金币, 积分或者成就什么的, 然后就可以在-- 真正的实体店铺或taobao店中折价购买或者免费获得商品.
你看这创意如何? 想来阿里肯定会通过这个平台打通这条虚拟游戏到实体交易的通道的. 那么这个平台到底会如何实现这个通道呢? 于是赶紧去找 -- 才发现, 在新闻稿中还有个关键字我没有看清 -- "将". 好吧, 我心急了, 原来阿里的这个平台还没有开放呢. 那么也好, 作为业余游戏开放者, 可以好好想想, 到底想要个怎样的手游平台呢?
关于阿里这个平台的是是非非已经在各大主站的帖子已经够多了, 今天不说哪些, 只从我 -- 一个纯粹的业余游戏程序员自身情况和理解来说...
一. 平台情况
因为对于游戏只是个业余人事, 平常还真没太关注过各大平台, 今天根据这次新闻提到的几项"指标"做了下比较.(最后一列不在其中, 只是本贴需要)
优势 | 云服务 | 支付 | 虚拟货币 | 用户群 | 开放平台/APIs | |
阿里 | 交易 | 阿里云 | 支付宝 | ? | 淘宝 | ? |
百度 | 内容 | 百度云 | 百度钱包 | ? | ? | open.baidu.com 个人数据存储 推送 第三方账户登录 社会化分享 移动统计 |
腾讯 | 社交 | 腾讯云 | 财付通 | Q币 | QQ 微信 | open.qq.com 用户信息 关系链类 应用推广 支付 营销 |
如上表可以看出, 其实各个平台该有的都有了, 没有的也都没有(这话说的..) . 图表中也没包含像360, 网易等, 并不是说他们的手游平台不强大, 这里只是做个对比表, 各个的fans表认真了.
好了, 现在说重点...实际作为一个业务开发者, 我最关心的是表中最后一列 -- "开放平台/APIs" . 阿里平台还找不到, 所以空着了, 当然这也正是我们可以"瞎"想的地方. 我们来看看其它两个平台主要提供的APIs.
百度:
没有自己的用户群, 没有支付方向(不是通道), 所以更多地在"默默"地干着"实事", 像推送, 数据存储等(做为开发者, 我比较欣赏百度提供的这些API);
腾讯:
依托庞大的的用户群, 其APIs更倾向与社交交互和业务推广, 但多年通过Q币培养起来的"内购"倾向, 所以也有专门的支付接口;
那么, 我们推测(希望)阿里平台会有怎么的APIs提供呢? 话说阿里有taobao, 支付宝, 再加上个号称"第一"的阿里云, 这要是三个都打通了, 确实能把腾讯下个一大跳. 但阿里在社交上不是强项, 虽然强推了半年多的"来往", 感觉还是晚了, 似乎一段时间内完全不在微信的眼里. 那么早期应该更关注"交易"和"支付"相关的APIs; 但作为后起的平台, 也不得不考虑下如何吸引和扶持开发者. 所以,
阿里:
1. 买家登录/管理
2. 商家登录/管理
3. 商家访问
4. 商品管理/展示/访问
5. 安全支付/内购接口
6. 消息/广告推送
7. 事件记录/触发
8. 应用数据存储
9. 应用数据分析/管理
够多了, 这真是"站着说话不腰疼"不是...好了, 那么作为一个野生的业余游戏开发者来说"急切"的"最低"需要什么呢?
二. 个人开发者需求
实际作为野生的,独立的,业余的游戏开发者来说, 多数应该被限制在"小"项目中, 那么作为平台, 提供的服务/支撑越丰富, 越灵活就受欢迎. 因此, 从"小"项目的共性来看, 希望平台能提供如下支持.
1. 平台服务
a. 应用发布: 这个是必须的不是?
b. 应用数据统计与分析: 通过收集到的应用数据, 如安装数量, 安装分布等信息, 可以非常有效地为应用自身改善提供数据参考;
c. 广告管理: 应用的广告接入与过滤;
d. 钱包管理: 应用收入情况展示与分析, 内购数据管理;
e. 信息推送: 就是GCM的功能, 但要能弄个群发支持的话, 阿里云应该搞定;
f. 应用共性数据需求支持: 例如应用的排行榜数据的存储和展示, 成就数据设置与触发, 应用的配套论坛/IM等SNS平台等(阿里云就在那里, 是不是呢?);
2. APIs支持
a. 用户数据访问: 支持用户登录, 获取用户自身数据;
b. 商家数据访问: 获取商家信息;
c. 商品数据访问: 获取商品信息;
d. 支付宝接口: 支持用户购买商品;
e. 内购接口: 支持用户购买应用内商品(这个跟支付宝接口应该不一样);
f. 广告接口: 实现传统的哪种广告发布的接口就好;
g. 消息/事件推送接口: 支持通过应用的服务端下发消息/事件到应用;
嗯, 这些应该够了(实际目前我的游戏只需要其中一条..), 腰不疼... 多用户交流, 用户状态数据维持什么的, 那是高级开发者想要的了, 他们应该自己可以搞定这些了. 新闻中,阿里的8:2分成方式是对开发者的扶持, 实际也有挖墙脚之嫌, 但, 如果平台的功能灵活强大, 2:8的分成一样可以引人入伙不是?
说到对开发者的扶持, 或者叫做拉人下水也好, 反正都是为了增加人气不是? 那么阿里可以考虑下下面的法子.
三. 扶持
1. 交流平台
开发中心, 交流论坛什么的, 各种流行的模式也没啥好说的. 很多时候, 我觉得一个好的交流平台不仅给开发者"家"的温暖感觉, 反倒是能提供找个解决问题地方, 而减少挫败感来的更重要 -- 话说, 难道你不喜欢stackoverflow.com吗?
2. 虚拟团队组建
不得不承认, 当下的游戏不再是一个人可以搞定的. 至少如我这样的, 只会code, 完全不懂PS的程序员, 敲打出来的游戏基本都是用来"吓人"的. 但目前看, 咱这种野生的业余程序员还混不到游戏队伍中, 所以...为何不出头考虑建立虚拟团队的方案呢?
杭州在动漫方面也算前例, 敲代码的也以万计, 而多数的小游戏都是"短平快"的项目, 所以呢...当创新出现时, 阿里只需派个兼职的PM出来, 协调组建个临时团队, 引导团队使用自身平台, 协助应用创建发布什么的...这对于业余游戏开发者和平台自身来说, 不是一件功德无量, 一石多鸟, 普大喜奔的好事吗?
<---- 求扩散的分割线 ---->
都说隔六个人就可以跟奥巴马搭上关系, 要是觉得"瞎"想的有些道理, 那就扩散它吧, 说不定就能被某个做平台的大佬看到, 然后还真的这么做了, 那, 那咱这样的的野生业余游戏开发者们就可以笑醒了啊不是....
VoluMill.NEXION.v5.6.0.1982.Win32_64 2CD
c++ python twisted game server
c++的逻辑和速度
如果把两者结合起来
twisted网络库负责首发数据 收到的数据传给c++进行逻辑处理
一个比较优雅的网络服务库就成型了。。。
再扩展点 一些比较复杂的库就可以通过c++调用python来实现
python库就变成了c++的后花园了
实际世界中 在线游戏库要复杂点:

GS的代码就是c++为主程序 python作为网络模块
python网络模块收到数据后 会传给c++代码处理
而c++在处理后会把结果交给python网络模块
python网络模块再回传给Gate Server
Gate Server再回传给Net Server
最后由Net Server传给用户
好 国际惯例 放代码:
OpenCascade Ray Tracing Rendering
OpenCascade Ray Tracing Rendering
摘要Abstract:OpenCascade6.7.0中引入了光线跟踪算法的实现。使用光线跟踪算法可实现高质量的渲染效果,且可以使用GPU提升渲染效率。
关键字Key Words:OpenCascade, Ray Tracing
参考链接:Ray tracing as alternative rendering method for OCCT visualization component
http://dev.opencascade.org/index.php?q=node/898
OpenCascade 6.7.0对显示部分做了些重大改进,其中突破性的改变是使用OpenCL实现了光线跟踪算法。作为库TKOpenGl的一部分,光线跟踪算法与标准的显示模块完全集成。从此,光线跟踪也可以作为显示的一种方法。与其他第三方库的光线跟踪库的区别是,内置的光线跟踪算法确保了实时渲染时的性能,性能与OpenGL的性能相近,在有大量模型时性能比OpenGL的还要好。
光线跟踪功能如下:
l High-quality shading by interpolating normal across the triangle pixels and using advanced illumination model (Phong shading);
l Depth-correct order-independent transparency for any number of overlapped objects;
l Sharp shadows from isotropic point and directional lights without any approximation – greatly improve visual appearance;
l Specular reflections and environment mapping – for high-quality rendering of metallic surfaces;
l Low-cost adaptive anti-aliasing allows to improve image quality by removing jagged edges from the image;
l Based on cross-platform OpenCL framework – runs on GPUs of major vendors (NVIDIA and AMD/ATI);
l Makes the most of the mid-/top-range GPUs but also runs successfully on low-end GPUs that support OpenCL。
只要OpenCascade编译时启用OpenCL支持,光线跟踪的使用是相当简单,只需要调用函数V3d_View::SetRaytracingMode()就可以把3D view切换成光线跟踪渲染啦。参考V3d_View和文档或者Draw Test Harness的vraytrace和vsetraytracemode命令实现的源程序去详细了解如何设置光线跟踪的一些选项。
最简单的测试光线跟踪的方式是在Draw Test Harness中输入如下命令:
生成效果如下图所示:
Figure 1.1 Render bottle and text with ray tracing
Figure 1.2 Render pipe and equipment models with ray tracing
Figure 1.3 Render pipe and equipment models with ray tracing
从上图可知,使用光线跟踪效果很不错,可以看到镜面效果,很Cool!
PDF Version: OpenCascade Ray Tracing Rendering
关于番茄工作法
超强屏幕录制编辑工具Camtasia Studio v8(附注册机)

编辑完成后,你还可以利用Camtasia Studio将录制完成的视频导出为 MP4、WMV、AVI、M4V、MP3、GIF 等主流格式,并能灵活自定义输出配置,是制作录制屏幕、视频演示的绝佳工具,其中 MP4 格式是为 Flash 和 HTML5 播放优化过的。

全新版本Camtasia Studio v8加入更多的社交元素,如你可以直接将你的作品上传到Google Drive;更高效率的性能,多个视频和音频轨道支持使得你对视频后期处理更得心应手,无论您是在录制高清视频,PowerPoint演示文稿或视频游戏,性能都表现出色;动态内容展示,可以随意添加上下跳动图像,文字滚动等效果;出色的视频效果处理,对视频进行润色,还有视频剪切功能让你感受视频处理工作室专业……
Camtasia Studio v8绝对称得上顶级、一流的屏幕视频录制编辑工具,同是techsmith开发的优秀工具还有非常出色的截图工具Snagit。
相关文件下载地址:Camtasia Studio v8下载页面
C++多边形扫描转换算法
以上内容是从网络搜集整理而得的,本人对于MFC还不是很明白,主要还是使用OnDraw函数...希望大家多赐教!!!!