小编Gas*_*sim的帖子

虚拟或类型转换

我有个问题.我正在尝试创建代码来更新我的游戏,但我陷入了"两难".我不想使用虚拟和它的唯一原因是我在谈论的每个人(在论坛,聊天,朋友)说虚拟使代码真的很慢,所以我做了一个研究,发现它做的查找vtable可以将性能降低近一半.因此,我将它用于不需要每帧更新的任务.一切正常,直到我得到更新/渲染功能.然后我开始考虑寻找解决方法.有了一个想法,但首先我想问一下那些知道那个人的人在实施之前.

我的游戏引擎非常受事件驱动.我可以使用子系统之间的事件(图形,UI,脚本)发送任何类型的数据.所以,我正在考虑每帧发送一个事件"renderScene".这对我来说听起来不错,但是有一个问题.事件处理程序的结构并不是很好,我现在真的不想改进它,因为它做得非常不错,我的目标是完成我的游戏,而不是修理引擎而永远不会完成它(碰巧我,所以不想再回到它了.

我的事件处理程序有一个函数将事件注册到函数(我称之为处理程序).但是这个函数的问题是,我需要做函数绑定和东西来注册成员函数.所以,我找到了一个解决方法 - 我创建一个静态函数并从中调用成员函数.这就是静态函数的样子:

void GraphicsSubsystem::renderScene(Subsystem * subsystem, Event * event) {
   GraphicsSubsystem * graphics = static_cast<GraphicsSubsystem *>(subsystem);
   graphics->renderScene();
}

void ScriptingSubsystem::runLine(Subsystem * subsystem, Event * event) {
   ScriptingSubsystem * scripting = static_cast<ScriptingSubsystem *>(subsystem);
   Event1<String> * e = static_cast<Event1<String> *>(event);
   scripting->runLine(e->getArg());
}
Run Code Online (Sandbox Code Playgroud)

参数始终是抽象子系统类和基本事件类.该runLine功能我没有问题,因为铸造我不运行的每个机架上的一行代码.但是,renderScene函数让我有点不舒服.

tl;博士,这是我的问题.静态构建每个帧上的对象比在每个帧上调用虚函数更快吗?

c++ polymorphism casting event-handling

2
推荐指数
1
解决办法
255
查看次数

std :: list.remove正在调用析构函数但不删除它

我有std :: list的问题.

std::list<Component*> mComponents;
//add some pointer in it
Component * comp = getComponent("positionComponent");
mComponents.remove(comp);
Run Code Online (Sandbox Code Playgroud)

由于某种原因,它调用comp指针的析构函数但不删除它; 通过析构函数删除的项目将被删除,而列表中的所有其他项目保持不变.什么可以导致这种行为?

c++ c++11

2
推荐指数
1
解决办法
518
查看次数

如何确定输出流链是否已结束?

我想要实现的目标是什么?

如何查找流链是否已结束?看看下面的函数(所有这些函数都在这个问题的LogRouter类中):

template<typename First, typename... Rest>
void log(const LogLevel &level_, First first_, Rest... rest_) {
    sstream << first_ << " ";
    log(level_, rest_...);
}

void log(const LogLevel &level_) {
    for(auto &route : routes)
        route->stream() << sstream.str() << std::endl;

    sstream.clear();
    sstream.str("");
}
Run Code Online (Sandbox Code Playgroud)

我想在上面实现完全相同的功能,但使用流.因此,当我到达流的末尾时,它需要将最终数据发送到路由而不是使用

router.log(LogLevel::Alert, "test stream", 15);
Run Code Online (Sandbox Code Playgroud)

我希望能够使用

router.log(LogLevel::Alert) << "test stream " << 15;
Run Code Online (Sandbox Code Playgroud)

我尝试过的:

  • std::ostream 运算符重载不接受压缩变量.

  • 逐个浏览每一个传递的值.如下所示:

     struct LogEnd {};
    
     static LogEnd end() { return LogEnd; }
    
     template<typename T> LogRouter &operator<<(const T &value) {
         sstream << value;
         return *this; …
    Run Code Online (Sandbox Code Playgroud)

c++ templates stream c++11

2
推荐指数
1
解决办法
334
查看次数

在根层上添加渐变子图层

我需要从透明到黑色从上到下放置渐变色,不透明度为30%.我发现最好的方法是使用CAGradientLayer.我想在"根"层之上添加该层,以避免为此创建单独的视图.对于我来说,拥有多个层而不是多个UIViews更有意义.到目前为止,这是我写的没有运气.

    // view did load
    var gradientLayer : CAGradientLayer = CAGradientLayer();
    gradientLayer.frame = coverView.bounds;
    gradientLayer.colors = [UIColor.redColor(), UIColor.blueColor()];
    coverView.layer.insertSublayer(gradientLayer, above: coverView.layer);
    // also tried below
    // coverView.layer.insertSublayer(gradientLayer, atIndex: 0);
Run Code Online (Sandbox Code Playgroud)

我希望这在图像上显示渐变色.下面的代码根本没有显示任何内容.你有什么建议我试试的?

calayer ios swift

2
推荐指数
1
解决办法
2500
查看次数

Gitlab CI如何将最新部署到特定目录

我在Gitlab中有两个项目,其中一个是另一个的子模块(让我们称之为repo"frontend-templates")(让我们称之为repo"main").我已经为"frontend-templates"回购设置了一个Gitlab CI构建.问题是我不需要测试或构建.我只需要在所需目录中部署此CI.所以,我为"frontend-templates"项目注册了一个跑步者,并将.gitlab-ci.yml添加到了根目录:

job_main:
   type: deploy
   script: echo "Do nothing"
Run Code Online (Sandbox Code Playgroud)

当我推送到我的存储库时,运行器将最新的提交提取到以下目录:

/home/gitlab-runner/builds/6231b425/0/Gasimzada/frontend-templates
Run Code Online (Sandbox Code Playgroud)

然后运行echo "Do nothing".

现在,我希望运行器将"已测试"提交部署到开发服务器,该服务器位于:

/var/www/myapp/submodules/frontend-templates
Run Code Online (Sandbox Code Playgroud)

编辑:我将脚本更改为

script: cd /var/www/myapp/submodules/frontend-templates && git pull
Run Code Online (Sandbox Code Playgroud)

但我得到一个错误说:

无法打开/var/www/myapp/.git/modules/submodules/frontend-templates/FETCH_HEAD:权限被拒绝

这是有道理的,因为gitlab-runner用户无法访问/ var/www/myapp中的任何目录,但这对我来说是个问题,因为我想gulp在部署之后运行,所以它在从远程存储库中提取后编译必要的脚本.

我是否应该授予dev环境的根目录权限?或者还有另一种方法吗?

git gitlab gitlab-ci gitlab-ci-runner

2
推荐指数
1
解决办法
4425
查看次数

django parler 创建测试对象

我有使用 Django Parler 具有可翻译字段的模型,现在我正在尝试创建用于单元测试的对象。这是我拥有的示例模型

class Federation(TranslatableModel):
    translations = TranslatedFields(
        name = models.CharField('name', max_length=50)
    )
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    creator = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, related_name='federation_creator')
    updater = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, related_name='federation_updater')

    def __str__(self):
        return self.name;
Run Code Online (Sandbox Code Playgroud)

现在我想在测试用例的设置阶段创建用于测试的对象:

 Federation.objects.create(...)
Run Code Online (Sandbox Code Playgroud)

但我不知道如何创建具有可翻译字段的对象。

我怎样才能做到这一点?

python django unit-testing django-parler

2
推荐指数
1
解决办法
833
查看次数

没有“项目”候选项产生预期的上下文结果类型“((Observable &lt;[Product]&gt;)-&gt;(_)-&gt; _”

这是我的代码段:

class ProductCategoryCell: UITableViewCell {

  @IBOutlet weak var collectionViewProducts: UICollectionView!

  // other stuff...

  func setProducts() {
    let productsObservable = Observable.just([
      Product(name: "test", price: 10.0),
      Product(name: "test", price: 10.0),
      Product(name: "test", price: 10.0)
    ])

    productsObservable.bindTo(collectionViewProducts.rx.items(cellIdentifier: "ProductCell", cellType: ProductCell.self)) {
      (row, element, cell) in
      cell.setProduct(element)
    }.disposed(by: disposeBag)
  }
}
Run Code Online (Sandbox Code Playgroud)

它给了我一个构建错误:

没有“项目”候选项产生预期的上下文结果类型“((Observable <[Product]>)->(_)-> _”

在我的视图控制器中,我用类似的代码填充表视图:

let productsObservable = Observable.just(testProducts)
productsObservable.bindTo(tableViewProducts.rx.items(cellIdentifier: "ProductCategoryCell", cellType: ProductCategoryCell.self)) { (row, element, cell) in
        cell.setCategory(category: element)
}.disposed(by: disposeBag)
Run Code Online (Sandbox Code Playgroud)

此代码正常工作。我究竟做错了什么?

uicollectionview swift rx-swift rx-cocoa

2
推荐指数
1
解决办法
3906
查看次数

如何将 std::shared_ptr 添加到多个 STL 容器?

将共享指针传递给不同对象中的 stl 容器的正确方法是什么,因此不会提前销毁对象?

我有多个带有 std::queue 的系统:

class System {
    typedef std::shared_ptr<Event> EventPtr;
protected:
    std::queue<EventPtr> mEventQueue;

    static SystemManager * sSystemManager;
   //this holds all the systems in the application

public:
    System();
    ~System();

    void addEventToQueue(EventPtr event) {
        mEventQueue.push(event);
    }

    void callEventQueue() {
        while(!mEventQueue.empty()) {
           acceptEvent(mEventQueue.front().get());
           mEventQueue.pop();
         }
    }

    void acceptEvent(Event * event);

public:
    static void sendEvent(EventPtr &event) {
        for(auto system : sSystemManager->getSystems()) {
               system->addEventToQueue(event);
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

我想知道我是否理解正确:

当我调用System::sendEvent(std::make_shared<Event>("testEvent"));作用域时,它将共享指针作为引用传递,该引用不会创建新指针并且不会增加引用计数。但是,addEventToQueue函数将参数作为对象传递,因此引用计数增加;如果我有 5 个系统,引用计数将为 6(计算 std::make_shared 本身)。但是这个引用计数存储在哪里呢?它是通过创建的第一个共享指针std::make_shared吗?还是所有对象的计数相同?那么,当第一个对象超出范围时,其他对象会发生什么?他们怎么知道正确的引用计数是多少,因为他们只知道“父”对象?

我读过的所有关于共享指针的文章,引用计数的显示方式总是很常见的。计数器是静态变量吗?

c++ stl smart-pointers c++11

1
推荐指数
1
解决办法
901
查看次数

默认关键字虚拟析构函数

我一直在使用越来越多的C++ 11,我遇到了一些我在任何地方都找不到的东西.当我们从基指针中删除派生类时,我们需要有虚拟析构函数; 但有时父析构函数需要"纯粹",这对C++来说是不可能的.那么,我的问题是可以默认用于虚拟析构函数吗?我已经尝试了它并且它有效,但我不知道它是否安全,因为互联网上没有任何关于它的信息.

编辑:澄清问题,我在谈论使用 virtual ~Class() = default;

c++ c++11

1
推荐指数
1
解决办法
5354
查看次数

Symfony2 无法在 Bundle 中渲染模板

我有以下结构:

/src/Product/AdminBundle/Resources/views/main.twig
Run Code Online (Sandbox Code Playgroud)

我正在尝试从控制器呈现此模板:

$this->render(...);
Run Code Online (Sandbox Code Playgroud)

或来自routing.yml

index_page:
    path: /
    defaults:
         _controller: FrameworkBundle:Template:template
         template: ...
Run Code Online (Sandbox Code Playgroud)

如何从包中的控制器内部渲染它?这是我在没有运气的情况下尝试过的:

  • 产品:AdminBundle:main.twig
  • ProductAdminBundle:main.twig
  • @ProductAdminBundle:main.twig
  • @ProductAdminBundle/main.twig
  • ProductAdminBundle/main.twig
  • ProductAdminBundle/Resources/views/main.twig
  • 产品/AdminBundle/Resources/views/main.twig
  • AdminBundle:main.twig
  • AdminBundle/main.twig

php symfony twig

1
推荐指数
1
解决办法
4152
查看次数