我有一个程序,使用boost :: program_options从配置文件中读取大量变量.配置文件正在工作并读取值,但由于文件中有很多选项,我想将它们记录下来.例如,我希望配置文件看起来像:
# Here is a description of flag1
# flag1 = true means blah blah blah
# flag1 = false means ...
flag1=true
# Here is a description of flag 2
.
.
.
Run Code Online (Sandbox Code Playgroud)
问题是我找不到任何描述方法的文档.我相当肯定我可以使用诸如a=我的注释分隔符之类的东西,并简单地将所有注释分配给a std::vector<string>在解析后丢弃,但是我想知道是否有更合适的方法来处理注释行配置文件.
在使用XNA在C#中完成基于组件的游戏引擎之前,我认为这是最后一次大的逻辑飞跃.我定义了我的Entity类和抽象组件.我的问题出现在我的EntityFactory中.
当我想创建一个新实体时,我将一个EntityType枚举传递给工厂中的静态方法,并通过一个switch/case语句查找要组合在一起的组件.问题是,我正在尝试创建一种方法,组件可以与同一实体中的其他组件共享字段,而无需访问所有内容.例如,如果两个组件具有表示位置的Vector2字段,则它们都应指向相同的Vector2.
我可以通过初始化实体工厂中的所有字段并要求将它们传递到组件的构造函数(并使用ref作为基元)来实现这一点,但这将非常难以维护,因为任何时候我扩展或更改了组件,我将不得不在工厂中的每个使用组件的地方重写代码.我真的想避免这种解决方案,但如果我找不到更好的方法,我会忍受它.
我目前的解决方案是创建一个名为Attribute的包装类.它包含两个字段:
private AttributeType type;
private Object data;
Run Code Online (Sandbox Code Playgroud)
属性类型是枚举,表示属性的用途.所以在位置,旋转,纹理等枚举中有条目.
EntityFactory创建一个空的属性列表,并将其传递给每个组件构造函数.setField方法将由组件的构造函数调用,而不是初始化字段.这是Attribute类和setField方法.
public class Attribute
{
private AttributeType type;
private Object data;
public AttributeType Type
{
get { return this.type; }
}
public Object Data
{
get { return this.data; }
}
public Attribute(AttributeType type, Object data)
{
this.type = type;
this.data = data;
}
public static void setField<T>(List<Attribute> attributeList, AttributeType type, out T field, T defaultValue)
{
bool attributeFound = false;
field = defaultValue;
foreach (Attribute attribute in attributeList) …Run Code Online (Sandbox Code Playgroud) 我目前正在学习CUDA,正在进行一些练习.其中之一是实现以3种不同方式添加矩阵的内核:每个元素1个线程,每行1个线程,每列1个线程.矩阵是方形的,并且实现为1D向量,我只需将其索引
A[N*row + col]
Run Code Online (Sandbox Code Playgroud)
直觉上,我预计第一个选项由于线程开销而变得最慢,第二个选项是单个线程处理相邻数据以来最快的选项.
在CPU上,使用8000 x 8000的密集矩阵,我得到:
Adding on CPU - Adding down columns
Compute Time Taken: 2.21e+00 s
Adding on CPU - Adding across rows
Compute Time Taken: 2.52e-01 s
Run Code Online (Sandbox Code Playgroud)
因此,由于更多的缓存命中,所以大约加速了一个数量级.在具有相同矩阵的GPU上,我得到:
Adding one element per thread
Compute Time Taken: 7.42e-05 s
Adding one row per thread
Compute Time Taken: 2.52e-05 s
Adding one column per thread
Compute Time Taken: 1.57e-05 s
Run Code Online (Sandbox Code Playgroud)
这对我来说不直观.对于最后一种情况,30-40%的加速度在大约1000×1000矩阵之上是一致的.请注意,这些时序仅是内核执行,不包括主机和设备之间的数据传输.下面是我的两个内核进行比较.
__global__
void matAddKernel2(float* A, float* B, float* C, int N)
{
int row = threadIdx.x + …Run Code Online (Sandbox Code Playgroud)