SDL中文论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4169|回复: 0
打印 上一主题 下一主题

[Discuss] surface

[复制链接]

149

主题

331

帖子

2445

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2445
跳转到指定楼层
楼主
发表于 2016-5-13 23:28:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
surface构造函数规则
  • SDL_Surface赋给surface,surface中的SDL_Surface的引用计数保持不变。
  • surface赋给surface,surface中的SDL_Surface的引用计数加1。


surface提供了对SDL_Surface的自动释放操作。它假设应用程序需要的是以下逻辑。
  • 创建了一个SDL_Surface,然后把它赋给第一个surface。(此操作不改变引用计数,保持SDL_Surface原来的引用计数:1)
  • 当要使用SDL_Surface,应用程序都是用surface而不是SDL_Surface。(逻辑会保证SDL_Surface的引用计数值等于surface个数,会保证最后一个surface释放时SDL_Surface会自动释放)
  • 应用程序可以从surface提取出SDL_Surface,但要保证不把它赋给一个新的surface。

对于第三条,让看破坏后会出什么情况。
  • 从surface1提取出SDL_Surface。这时SDL_Surface的引用计数保持不变,依旧是1。
  • 把此个SDL_Surface又赋给surface2。它执行的是surface(SDL_Surface*)操作,依据规则“SDL_Surface赋给surface,surface中的SDL_Surface的引用计数保持不变”,引用计数依旧是1!这导致一个错误结果:系统中存在2个指向同一SDL_Surface的surface,但该SDL_Surface的引用计数是1。


surface.assign(const surface& o)
surface1.assign(surface2)和surface1=surface2逻辑是一样的。它们的计算量也一样。
  • surface2指向的SDL_Surface引用计数加1
  • surface1指向的SDL_Surface引用计数减1
  • surface1指向的SDL_Surface等于surface2指向的SDL_Surface。

结果
  • 当surface1和surface2指向的SDL_Surface不一致时,surface1中的引用计数将减1,surface2中的引用计数将加1。
  • 当surface1和surface2指向的SDL_Surface一致时,执行此函数后对两者结果无影响。

assign还有另一版本:void assign(SDL_Surface* surf),即直接把SDL_Surface赋给surface,它和前面的不同是不执行第一步。这个相比于surface1 = SDL_Surface*倒是可少点计算量,后者等于是执行三条语句。
  1. surface2 = SDL_Surface*
  2. surface1 = surface2
  3. 自动析构surface2; (surface2是临时对象)

  4. 注:surface1 = SDL_Surface*不会改变SDL_Surface的引用计数!
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|丽谷软件|libsdl.cn

GMT+8, 2025-5-2 00:14 , Processed in 0.045398 second(s), 20 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表